⚽ physics2d - 2D Fizik Motoru
Rigid Body, Collision Detection, Constraints, Forces
192
Fonksiyon
3,317
Satır
109 KB
Boyut
🚀 Hızlı Başlangıç
içe_aktar physics2d
// Dünya oluştur
değişken dünya = physics2d.world_create([0.0, -9.81]) // Yerçekimi
// Zemin (statik body)
değişken zemin = physics2d.body_create_static()
değişken zemin_shape = physics2d.box_shape(10.0, 0.5)
physics2d.body_add_shape(zemin, zemin_shape)
physics2d.body_set_position(zemin, [0.0, -5.0])
physics2d.world_add_body(dünya, zemin)
// Kutu (dinamik body)
değişken kutu = physics2d.body_create_dynamic(1.0) // 1kg
değişken kutu_shape = physics2d.box_shape(1.0, 1.0)
physics2d.body_add_shape(kutu, kutu_shape)
physics2d.body_set_position(kutu, [0.0, 5.0])
physics2d.world_add_body(dünya, kutu)
// Simülasyon
değişken dt = 1.0 / 60.0 // 60 FPS
döngü yap
physics2d.world_step(dünya, dt)
değişken pos = physics2d.body_get_position(kutu)
yazdır("Kutu pozisyonu: " + pos[0].yazıya() + ", " + pos[1].yazıya())
eğer pos[1] < -10.0 ise yap
kır
son
son
📚 Özellikler
- Rigid Body Dynamics: Kütle, hız, açısal momentum
- Shapes: Circle, Box, Polygon, Edge, Chain
- Collision Detection: Broad phase (AABB tree), narrow phase (SAT, GJK)
- Constraints: Distance joint, revolute joint, prismatic joint, weld joint
- Forces: Gravity, damping, friction, restitution
- Queries: Raycast, AABB query, shape query
💡 Örnekler
Angry Birds Tarzı Fırlatma
içe_aktar physics2d, graphics
değişken dünya = physics2d.world_create([0.0, -9.81])
// Sapan noktası
değişken sapan_pos = [-5.0, 0.0]
// Kuş
değişken kuş = physics2d.body_create_dynamic(0.5)
değişken kuş_shape = physics2d.circle_shape(0.3)
physics2d.body_add_shape(kuş, kuş_shape)
physics2d.body_set_position(kuş, sapan_pos)
physics2d.world_add_body(dünya, kuş)
// Hedef (kutular)
fonksiyon kutu_oluştur(x: kesir, y: kesir) -> Body yap
değişken body = physics2d.body_create_dynamic(1.0)
değişken shape = physics2d.box_shape(0.5, 0.5)
physics2d.body_add_shape(body, shape)
physics2d.body_set_position(body, [x, y])
physics2d.world_add_body(dünya, body)
dön body
son
// Piramit
değişken kutular = []
her y içinde aralık(0, 5) için yap
her x içinde aralık(0, 5 - y) için yap
kutular.ekle(kutu_oluştur(5.0 + x.kesir() - y.kesir() * 0.25, y.kesir() + 0.5))
son
son
// Kullanıcı girdisi (mouse drag)
değişken mouse_down = yanlış
değişken drag_start = [0.0, 0.0]
fonksiyon mouse_press(pos: Dizi) yap
mouse_down = doğru
drag_start = pos
son
fonksiyon mouse_release(pos: Dizi) yap
eğer mouse_down ise yap
// Fırlatma hızını hesapla
değişken delta = [drag_start[0] - pos[0], drag_start[1] - pos[1]]
değişken velocity = [delta[0] * 10.0, delta[1] * 10.0]
physics2d.body_set_velocity(kuş, velocity)
mouse_down = yanlış
son
son
// Render loop
döngü yap
physics2d.world_step(dünya, 1.0/60.0)
// Render kuş
değişken kuş_pos = physics2d.body_get_position(kuş)
graphics.draw_circle(kuş_pos[0], kuş_pos[1], 0.3)
// Render kutular
her kutu içinde kutular için yap
değişken pos = physics2d.body_get_position(kutu)
değişken angle = physics2d.body_get_angle(kutu)
graphics.draw_box(pos[0], pos[1], 0.5, 0.5, angle)
son
son
Ragdoll Physics
içe_aktar physics2d
fonksiyon ragdoll_oluştur(dünya: World, x: kesir, y: kesir) -> Ragdoll yap
// Baş
değişken baş = physics2d.body_create_dynamic(5.0)
physics2d.body_add_shape(baş, physics2d.circle_shape(0.3))
physics2d.body_set_position(baş, [x, y + 1.5])
physics2d.world_add_body(dünya, baş)
// Gövde
değişken gövde = physics2d.body_create_dynamic(10.0)
physics2d.body_add_shape(gövde, physics2d.box_shape(0.4, 0.8))
physics2d.body_set_position(gövde, [x, y + 0.5])
physics2d.world_add_body(dünya, gövde)
// Baş-gövde revolute joint
değişken boyun = physics2d.revolute_joint_create(
baş, gövde,
[x, y + 1.2],
-0.5, 0.5 // Angle limits
)
physics2d.world_add_joint(dünya, boyun)
// Sol kol
değişken sol_kol = physics2d.body_create_dynamic(2.0)
physics2d.body_add_shape(sol_kol, physics2d.box_shape(0.15, 0.5))
physics2d.body_set_position(sol_kol, [x - 0.5, y + 0.5])
physics2d.world_add_body(dünya, sol_kol)
değişken sol_omuz = physics2d.revolute_joint_create(
gövde, sol_kol,
[x - 0.3, y + 0.7],
-1.57, 1.57 // ±90 derece
)
physics2d.world_add_joint(dünya, sol_omuz)
// Sağ kol (benzer şekilde)
// Sol bacak, sağ bacak...
dön yap
baş: baş,
gövde: gövde,
sol_kol: sol_kol
// ...
son
son
değişken dünya = physics2d.world_create([0.0, -9.81])
değişken ragdoll = ragdoll_oluştur(dünya, 0.0, 5.0)
// Ragdoll'a darbe
physics2d.body_apply_impulse(ragdoll.baş, [5.0, 0.0], [0.0, 0.0])