2017-08-28 28 views
1

私のゲーム内には、ベクトル配列のヒットボックスがあります。私のローテーションマトリックスが機能しないのはなぜですか?

自分のエンティティの1つがゆっくりとプレイヤーの動きに追従して回転するので、当然ヒットボックスも回転する必要があります。

各頂点を画面に描画すると、コードが歪んで歪んでしまいます。私のエントリーは64 x 64インチなので、+ 32はオブジェクトの中心を示します。

public void rotateVertices(Vector2[] vertices, double angle) { 

    double cos = Math.cos(angle); 
    double sin = Math.sin(angle); 

    for(int i = 0; i < vertices.length; i++){ 
     Vector2 v = vertices[i]; 
     vertices[i].x = ((v.x - (x + 32)) * cos - (v.y - (y + 32)) * sin) + (x + 32); 
     vertices[i].y = ((v.x - (x + 32)) * sin + (v.y - (y + 32)) * cos) + (y + 32); 
    } 

} 

私のコンストラクタ:ここ

public EnemyTriBall(Handler handler, float x, float y) { 
    super(handler, x, y, 3, 6); 

    vertices[0] = new Vector2(x + 25, y + 13); 
    vertices[1] = new Vector2(x + 64, y + 33); 
    vertices[2] = new Vector2(x + 25, y + 53); 

} 

答えて

1

Vector2 v = vertices[i]; 

あなたはちょうどvectices[i]を参照し、古いベクトルのコピーを作成しないでください。これを行うと、

vertices[i].x = ((v.x - (x + 32)) * cos - (v.y - (y + 32)) * sin) + (x + 32); 

オリジナルのベクターのxを変更します。そして、次の行に:

vertices[i].y = ((v.x - (x + 32)) * sin + (v.y - (y + 32)) * cos) + (y + 32); 

古いv.yが、あなたに奇妙な結果を与える新しいv.xを使用しています。最も簡単な修正はxyを取得し、代わりにそれらを使用することです:

float vx = vertices[i].x; 
    float vy = vertices[i].y; 
    vertices[i].x = ((vx - (x + 32)) * cos - (vy - (y + 32)) * sin) + (x + 32); 
    vertices[i].y = ((vx - (x + 32)) * sin + (vy - (y + 32)) * cos) + (y + 32); 

私は数式をチェックしませんでしたが、私はこの1つで始まるだろう、他の問題があるかもしれません。

+0

私は仕事の後でこれを試してみますが、これは戻ってきてくれていることを想像しています。 – Alex

+0

私の頂点はもはや歪んでいませんが、回転した頂点をフレームごとに通過するので、これを修正するために知っていますか? – Alex

+0

@Alex数式にはいくつか問題があるかもしれませんが、デバッグなしで診断するのは少し難しいです。私は既知の入力と出力のためのいくつかの単体テストを書いて、何が間違っているかを調べるでしょう。これは難しいことではありません。 – lexicore

関連する問題