我的游戏中有各种实体,这些实体都有由矢量阵列
定义的命中框我的一个实体慢慢旋转以跟随玩家的动作,所以我自然需要点击框旋转。
当我将每个顶点绘制到屏幕时,我的代码会导致扭曲和扭曲的线条。我的entites大小为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);
}
答案 0 :(得分: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
,这会给您带来奇怪的结果。最简单的解决方法是获取x
和y
并改为使用它们:
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);
可能还有其他问题,我没有检查公式,但我从这个开始。