Changeset 27

Show
Ignore:
Timestamp:
12/12/07 08:58:59 (1 year ago)
Author:
charlie137
Message:

Improved bouncing ball graphics and physics

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/guisterax/src/asteroid.d

    r22 r27  
    8686        m_rot_speed = rand(-0.05, 0.05); 
    8787        this.speed = speed; 
     88        max_speed = 5; 
    8889         
    8990        if (type > SMALL) { 
  • trunk/guisterax/src/bounce.d

    r24 r27  
    3333import utils; 
    3434 
    35 import std.math : PI
     35import std.math : PI, tan
    3636 
    3737 
     
    4141    static Surface[] m_surfs; 
    4242public: 
    43     static float max_radius = 45
    44     static float min_radius = 24
    45     static float stable_radius = 42
    46     static float k_radius = 0.1; 
     43    static float max_radius = 30
     44    static float min_radius = 10
     45    static float stable_radius = 28
     46    static float k_radius = 0.01; 
    4747    float radius_force = 0; 
    4848    float radius_speed = 0; 
     
    5858    this(in Vect pos, in Vect speed = Vect()) {        
    5959        super(new Sprite(m_surfs), pos); 
    60         radius = max_radius; 
    61         mass = 10
    62         max_speed = 5
     60        radius = min_radius; 
     61        mass = 1
     62        max_speed = 4
    6363        this.speed = speed; 
    6464    } 
     
    7272        radius_speed += radius_force * dt; 
    7373        radius += radius_speed * dt; 
    74         if (radius < min_radius) {radius = min_radius; radius_speed = 0;} 
    75         if (radius > max_radius) {radius = max_radius; radius_speed = 0;} 
     74        if (radius < min_radius || radius >= max_radius) { 
     75            radius -= radius_speed * dt; 
     76            radius_speed = 0; 
     77        } 
    7678        radius_force = 0; 
    77         angle = (-radius + max_radius) / min_radius * 2*PI; 
     79        angle = (radius - min_radius) / (max_radius - min_radius) * 2*PI; 
    7880        super.move(dt); 
    7981    } 
     
    8385    } 
    8486     
    85     float strenght() { 
    86         return pow((-radius + max_radius) / min_radius, 2.) * 1;  
    87     } 
    8887     
    8988    override void collide(Element e) { 
    90         repeal(e.pos, strenght(), false); 
    91         e.repeal(pos, strenght(), false); 
    92         float inside = radius + e.radius - (e.pos - pos).norm(); 
    93         radius_force -= inside * 0.5; 
     89        // How much inside the ball the element is 
     90        float inside = (radius + e.radius - (e.pos - pos).norm()) / radius; 
     91        // How pressed is the ball 
     92        float pressed = (radius - max_radius) / (min_radius - max_radius); 
     93        // The force applied is proportional to these two factors 
     94        float force = inside + pressed; 
     95        repeal(e.pos, force, false); 
     96        e.repeal(pos, force, false); 
     97        // We also add an arbirtary radius force 
     98        radius_force -= 0.05; 
    9499    } 
    95100}; 
  • trunk/guisterax/src/fire.d

    r22 r27  
    6060        if (!cast(Bounce)e) { 
    6161            kill(); 
     62        } else { 
     63            append(new Timer(1, &this.kill)); 
    6264        } 
    6365    }