⚙️ 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