⚽ physics2d - 2D Fizik Motoru

Rigid Body, Collision Detection, Constraints, Forces

192
function
3,317
lines
109 KB
Boyut

🚀 Quick Start

import physics2d

// Dünya create
let dünya = physics2d.world_create([0.0, -9.81])  // Yerçekimi

// Zemin (statik body)
let zemin = physics2d.body_create_static()
let 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)
let kutu = physics2d.body_create_dynamic(1.0)  // 1kg
let 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
let dt = 1.0 / 60.0  // 60 FPS

loop do
    physics2d.world_step(dünya, dt)
    
    let pos = physics2d.body_get_position(kutu)
    yazdır("Kutu pozisyonu: " + pos[0].yazıya() + ", " + pos[1].yazıya())
    
    if pos[1] < -10.0  do
        kır
    end
end

📚 Özellikler

💡 Exampleler

Angry Birds Tarzı Fırlatma

import physics2d, graphics

let dünya = physics2d.world_create([0.0, -9.81])

// Sapan noktası
let sapan_pos = [-5.0, 0.0]

// Kuş
let kuş = physics2d.body_create_dynamic(0.5)
let 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)
function kutu_create(x: float, y: float) -> Body do
    let body = physics2d.body_create_dynamic(1.0)
    let 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)
    return body
end

// Piramit
let kutular = []
each y in aralık(0, 5) for do
    each x in aralık(0, 5 - y) for do
        kutular.ekle(kutu_create(5.0 + x.float() - y.float() * 0.25, y.float() + 0.5))
    end
end

// useıcı girdisi (mouse drag)
let mouse_down = false
let drag_start = [0.0, 0.0]

function mouse_press(pos: Dizi) do
    mouse_down = true
    drag_start = pos
end

function mouse_release(pos: Dizi) do
    if mouse_down  do
        // Fırlatma hızını hesapla
        let delta = [drag_start[0] - pos[0], drag_start[1] - pos[1]]
        let velocity = [delta[0] * 10.0, delta[1] * 10.0]
        
        physics2d.body_set_velocity(kuş, velocity)
        mouse_down = false
    end
end

// Render loop
loop do
    physics2d.world_step(dünya, 1.0/60.0)
    
    // Render kuş
    let kuş_pos = physics2d.body_get_position(kuş)
    graphics.draw_circle(kuş_pos[0], kuş_pos[1], 0.3)
    
    // Render kutular
    each kutu in kutular for do
        let pos = physics2d.body_get_position(kutu)
        let angle = physics2d.body_get_angle(kutu)
        graphics.draw_box(pos[0], pos[1], 0.5, 0.5, angle)
    end
end

Ragdoll Physics

import physics2d

function ragdoll_create(dünya: World, x: float, y: float) -> Ragdoll do
    // Baş
    let 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
    let 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
    let 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
    let 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)
    
    let 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...
    
    return do
        baş: baş,
        gövde: gövde,
        sol_kol: sol_kol
        // ...
    end
end

let dünya = physics2d.world_create([0.0, -9.81])
let ragdoll = ragdoll_create(dünya, 0.0, 5.0)

// Ragdoll'a darbe
physics2d.body_apply_impulse(ragdoll.baş, [5.0, 0.0], [0.0, 0.0])

← All Modules