Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

⚙️ physics2d - 2D Fizik Motoru

Gerçekçi 2D fizik simülasyonu, çarpışma tespiti ve dinamik nesneler

📦 192 Fonksiyon 📝 3317 Satır 💾 109.7 KB

📋 Genel Bakış

physics2d modülü, oyunlar ve simülasyonlar için tam özellikli 2D fizik motoru sağlar. Rijit cisim dinamiği, çarpışma tespiti, kuvvetler, tork ve eklemler içerir.

🌍 Fizik Dünyası

  • physics2d.Dünya() - Fizik dünyası oluşturma
  • physics2d.yerçekimi_ayarla() - Yerçekimi vektörü
  • physics2d.güncelle() - Fizik simülasyonu adımı
  • physics2d.zaman_adımı() - Delta time ayarlama

📦 Rijit Cisimler

  • physics2d.RijitCisim() - Dinamik nesne oluşturma
  • physics2d.StatikCisim() - Sabit nesne (zemin, duvar)
  • physics2d.kütle_ayarla() - Kütle ve eylemsizlik
  • physics2d.hız_ayarla() - Doğrusal hız
  • physics2d.açısal_hız_ayarla() - Dönüş hızı

🔷 Şekiller ve Çarpışma

  • physics2d.Kutu() - Dikdörtgen şekil
  • physics2d.Daire() - Dairesel şekil
  • physics2d.Çokgen() - Özel çokgen
  • physics2d.çarpışma_filtresi() - Katman bazlı çarpışma
  • physics2d.sürtünme() - Sürtünme katsayısı
  • physics2d.elastikiyet() - Zıplama katsayısı

💪 Kuvvetler ve Tork

  • physics2d.kuvvet_uygula() - Merkez kuvvet
  • physics2d.impuls_uygula() - Anlık ivme
  • physics2d.tork_uygula() - Dönme kuvveti
  • physics2d.hız_sönümleme() - Hava direnci

🔗 Eklemler (Joints)

  • physics2d.MenteşeEklemi() - Döner eklem
  • physics2d.UzaklıkEklemi() - Sabit mesafe
  • physics2d.PistonEklemi() - Sürgülü eklem
  • physics2d.YayEklemi() - Esnek bağlantı

💡 Kullanım Örnekleri

Basit Fizik Simülasyonu

kullan physics2d
kullan graphics

// Fizik dünyası oluştur
değer dünya = physics2d.Dünya()
dünya.yerçekimi_ayarla(0.0, -9.81)  // 9.81 m/s² aşağı

// Zemin oluştur (statik)
değer zemin = physics2d.StatikCisim()
zemin.şekil_ekle(physics2d.Kutu(genişlik: 20.0, yükseklik: 0.5))
zemin.konum_ayarla(0.0, -5.0)
dünya.cisim_ekle(zemin)

// Düşen kutu oluştur (dinamik)
değer kutu = physics2d.RijitCisim()
kutu.kütle_ayarla(1.0)
kutu.şekil_ekle(physics2d.Kutu(genişlik: 1.0, yükseklik: 1.0))
kutu.konum_ayarla(0.0, 5.0)
kutu.elastikiyet_ayarla(0.5)  // Yarı elastik
dünya.cisim_ekle(kutu)

// Simülasyon döngüsü
değer canvas = graphics.Canvas(800, 600)
değer fps = 60.0
değer zaman_adımı = 1.0 / fps

için kare içinde 0..300 {
    // Fizik güncelle
    dünya.güncelle(zaman_adımı)
    
    // Çiz
    canvas.arkaplan_ayarla(color.BEYAZ)
    
    // Zemin çiz
    canvas.dolgu_ayarla(color.SİYAH)
    canvas.dikdörtgen(300, 500, 400, 10, dolgu: doğru)
    
    // Kutu çiz
    değer kutu_konum = kutu.konum()
    değer kutu_açı = kutu.açı()
    
    canvas.kaydet()
    canvas.çevir(kutu_konum.x * 20 + 400, -kutu_konum.y * 20 + 300)
    canvas.döndür(kutu_açı)
    canvas.dolgu_ayarla(color.KIRMIZI)
    canvas.dikdörtgen(-10, -10, 20, 20, dolgu: doğru)
    canvas.geri_yükle()
    
    canvas.png_olarak_kaydet(f"fizik_{kare:04}.png")
}

yazdır("✓ Simülasyon tamamlandı!")

Angry Birds Tarzı Oyun

kullan physics2d
kullan math

sınıf AngryBirdsOyun {
    değer dünya: physics2d.Dünya
    değer kuşlar: Liste<physics2d.RijitCisim>
    değer kutular: Liste<physics2d.RijitCisim>
    
    fonksiyon yeni() -> AngryBirdsOyun {
        değer dünya = physics2d.Dünya()
        dünya.yerçekimi_ayarla(0.0, -9.81)
        
        dön AngryBirdsOyun {
            dünya: dünya,
            kuşlar: [],
            kutular: []
        }
    }
    
    fonksiyon zemin_oluştur() {
        değer zemin = physics2d.StatikCisim()
        zemin.şekil_ekle(physics2d.Kutu(genişlik: 50.0, yükseklik: 1.0))
        zemin.konum_ayarla(0.0, -10.0)
        bu.dünya.cisim_ekle(zemin)
    }
    
    fonksiyon kule_inşa_et(x: Gerçek, y: Gerçek) {
        // 3 katlı kutu kulesi
        için kat içinde 0..3 {
            için sütun içinde 0..3 {
                değer kutu = physics2d.RijitCisim()
                kutu.kütle_ayarla(0.5)
                kutu.şekil_ekle(physics2d.Kutu(genişlik: 1.0, yükseklik: 1.0))
                kutu.konum_ayarla(
                    x + sütun.gerçek() * 1.1,
                    y + kat.gerçek() * 1.1
                )
                kutu.sürtünme_ayarla(0.7)
                kutu.elastikiyet_ayarla(0.1)
                
                bu.dünya.cisim_ekle(kutu)
                bu.kutular.ekle(kutu)
            }
        }
    }
    
    fonksiyon kuş_fırlat(hız_x: Gerçek, hız_y: Gerçek) {
        değer kuş = physics2d.RijitCisim()
        kuş.kütle_ayarla(2.0)
        kuş.şekil_ekle(physics2d.Daire(yarıçap: 0.5))
        kuş.konum_ayarla(-15.0, 0.0)
        kuş.hız_ayarla(hız_x, hız_y)
        kuş.elastikiyet_ayarla(0.8)
        
        bu.dünya.cisim_ekle(kuş)
        bu.kuşlar.ekle(kuş)
        
        yazdır(f"🐦 Kuş fırlatıldı! Hız: ({hız_x:.1f}, {hız_y:.1f})")
    }
    
    fonksiyon güncelle(delta_zaman: Gerçek) {
        bu.dünya.güncelle(delta_zaman)
    }
    
    fonksiyon yıkılma_kontrol() -> Tam {
        değer yıkılan = 0
        için kutu içinde bu.kutular {
            değer konum = kutu.konum()
            eğer konum.y < -5.0 {
                yıkılan += 1
            }
        }
        dön yıkılan
    }
}

// Oyunu başlat
değer oyun = AngryBirdsOyun.yeni()
oyun.zemin_oluştur()
oyun.kule_inşa_et(10.0, 0.0)

// Kuş fırlat (45 derece açıyla)
değer hız = 20.0
değer açı = math.radyan(45.0)
oyun.kuş_fırlat(hız * math.cos(açı), hız * math.sin(açı))

// Simülasyon
için i içinde 0..300 {
    oyun.güncelle(1.0 / 60.0)
    
    eğer i % 60 == 0 {
        değer yıkılan = oyun.yıkılma_kontrol()
        yazdır(f"⏱️  {i / 60}s - Yıkılan kutu: {yıkılan}")
    }
}

değer toplam_yıkılan = oyun.yıkılma_kontrol()
yazdır(f"\n🎯 Sonuç: {toplam_yıkılan} kutu yıkıldı!")

Araba Simülasyonu

kullan physics2d

sınıf Araba {
    değer gövde: physics2d.RijitCisim
    değer tekerlekler: Liste<physics2d.RijitCisim>
    değer motor_gücü: Gerçek = 100.0
    
    fonksiyon yeni(dünya: physics2d.Dünya, x: Gerçek, y: Gerçek) -> Araba {
        // Araba gövdesi
        değer gövde = physics2d.RijitCisim()
        gövde.kütle_ayarla(10.0)
        gövde.şekil_ekle(physics2d.Kutu(genişlik: 3.0, yükseklik: 1.0))
        gövde.konum_ayarla(x, y)
        dünya.cisim_ekle(gövde)
        
        // Tekerlekler
        değer tekerlekler = []
        
        için (i, offset_x) içinde [(-1.2, "sol"), (1.2, "sağ")].numaralandır() {
            değer tekerlek = physics2d.RijitCisim()
            tekerlek.kütle_ayarla(1.0)
            tekerlek.şekil_ekle(physics2d.Daire(yarıçap: 0.4))
            tekerlek.konum_ayarla(x + offset_x, y - 0.6)
            tekerlek.sürtünme_ayarla(2.0)  // Yüksek sürtünme
            dünya.cisim_ekle(tekerlek)
            
            // Menteşe eklemi ile bağla
            değer eklem = physics2d.MenteşeEklemi(
                gövde,
                tekerlek,
                bağlantı_noktası: (offset_x, -0.6)
            )
            eklem.motor_aktif(doğru)
            dünya.eklem_ekle(eklem)
            
            tekerlekler.ekle(tekerlek)
        }
        
        dön Araba {
            gövde: gövde,
            tekerlekler: tekerlekler,
            motor_gücü: 100.0
        }
    }
    
    fonksiyon gaz_ver() {
        için tekerlek içinde bu.tekerlekler {
            tekerlek.tork_uygula(bu.motor_gücü)
        }
    }
    
    fonksiyon fren() {
        için tekerlek içinde bu.tekerlekler {
            değer hız = tekerlek.açısal_hız()
            tekerlek.tork_uygula(-hız * 50.0)
        }
    }
    
    fonksiyon konum() -> (Gerçek, Gerçek) {
        değer konum = bu.gövde.konum()
        dön (konum.x, konum.y)
    }
}

// Simülasyon
değer dünya = physics2d.Dünya()
dünya.yerçekimi_ayarla(0.0, -9.81)

// Tepeli yol oluştur
değer zemin = physics2d.StatikCisim()
zemin.şekil_ekle(physics2d.Kutu(genişlik: 100.0, yükseklik: 1.0))
zemin.konum_ayarla(0.0, -5.0)
dünya.cisim_ekle(zemin)

// Tepe
değer tepe = physics2d.StatikCisim()
tepe.şekil_ekle(physics2d.Kutu(genişlik: 10.0, yükseklik: 3.0))
tepe.konum_ayarla(20.0, -2.5)
tepe.açı_ayarla(math.radyan(15.0))
dünya.cisim_ekle(tepe)

// Araba oluştur
değer araba = Araba.yeni(dünya, -30.0, 0.0)

yazdır("🚗 Araba simülasyonu başladı")

için i içinde 0..500 {
    // İlk 3 saniye gaz ver
    eğer i < 180 {
        araba.gaz_ver()
    }
    
    dünya.güncelle(1.0 / 60.0)
    
    eğer i % 60 == 0 {
        değer (x, y) = araba.konum()
        yazdır(f"⏱️  {i / 60}s - Konum: ({x:.1f}, {y:.1f})")
    }
}

yazdır("✓ Simülasyon tamamlandı")

🎯 İyi Uygulamalar

  • Sabit zaman adımı kullanın (örn: 1/60 saniye)
  • Çarpışma katmanları ile performansı optimize edin
  • Çok hızlı nesneler için sürekli çarpışma tespiti aktifleştirin
  • Uygun sürtünme ve elastikiyet değerleri kullanın
  • Çok karmaşık şekiller yerine basit şekiller birleştirin
  • Fizik ve render döngülerini ayırın

🔗 İlgili Modüller

  • graphics - 2D çizim
  • math - Matematik fonksiyonları
  • gui - Kullanıcı arayüzü