2017-06-01 11 views
0

私のゲームでは、私は円形の境界線を持っており、境界の内側には、跳ね返るはずのオブジェクトがありますが、何らかの理由でそれが跳ね返っていません。私のコードは以下の通りです。円の範囲内でオブジェクトをバウンスする方法はありますか?

public void checkBouncer(Bouncer b){ 
    float x = b.getPosition().x; 
    float y = b.getPosition().y; 
    float cx = Constants.CENTER_X - b.getWidth()/2; 
    float cy = Constants.CENTER_Y - b.getHeight()/2; 
    float dx = Math.abs(x - cx); 
    float dy = Math.abs(y - cy); 
    float r = (Constants.PARAMETER_RADIUS - 45) - b.getHeight(); 

    // check collision between bounds and bouncer 
    if ((dx * dx) + (dy * dy) >= (r * r)) { 
     // original velocity vector 
     Vector2 v1 = new Vector2(b.getVelocity().x, b.getVelocity().y); 

     // normal vector 
     Vector2 n = new Vector2(
       Constants.CENTER_X - b.getPosition().x, 
       Constants.CENTER_Y - b.getPosition().y 
     ); 

     // normalize 
     if (n.len() > 0) n = n.nor(); 

     // dot product 
     float dot = v1.x * n.x + v1.y * n.y; 

     // reflected vector values 
     v2.x = v1.x - 2 * dot * n.x; 
     v2.y = v1.y - 2 * dot * n.y; 
    } 
    // set new velocity 
    b.setVelocity(v2); 
} 

私はバウンスしたいオブジェクトが、それが向いている方向に移動することから始まり、更新方法を以下に示します。

public void update(float delta) { 
    direction.x = (float) Math.cos(Math.toRadians(angle)); 
    direction.y = (float) Math.sin(Math.toRadians(angle)); 

    if (direction.len() > 0) { 
     direction = direction.nor(); 
    } 

    velocity.x = direction.x * speed; 
    velocity.y = direction.y * speed; 

    position.x += velocity.x * delta; 
    position.y += velocity.y * delta; 

    circle.set(position.x + width/2, position.y + height/2, width/2); 
} 

しかし、私は、衝突の上のその種を角度を反転させた場合しかし、それはびっくりして、常に衝突して戻ってくるわけではありません。そのコードはここにあります:

if ((dx * dx) + (dy * dy) >= (r * r)) { 
     b.setAngle(-b.getAngle()); 
} 

私は助けが必要です。

+0

としての価値を得るhttps://stackoverflow.com/questions/28163635/bouncing-a-ball-within-a-circle – Sedrick

答えて

0

EMM ...あなたがここに反射した後、右速度ベクトル成分を持っている:

v2.x = v1.x - 2 * dot * n.x; 
and same for y 

なぜあなたは角度を使用する必要がありますか?

方向の角度が実際にいくつかの理由のために必要とされている場合は、

angle = atan2(v2.y, v2.x) 
+0

私が使用衝突があったかどうかをテストするだけの角度です。私はあなたの提案を使用しようとしましたが、動作していません。 – Harry

+0

どういう意味ですか?「うまくいきません」間違った角度?間違ったシステムの動作ですか? – MBo

+0

が間違った角度で跳ねています。 – Harry

関連する問題