图片旋转太频繁
Image rotation happens too often
我正在为塔防游戏创建原型。现在,我正在插入一些应该指向周围怪物 运行 中心的箭头(比如后面来自塔的子弹)。我设法在第一个逻辑调用中相应地设置旋转,但我不知道如何更改代码以防止发生以下情况:http://recordit.co/jBdXtGGeN8
简而言之:箭头一直旋转,即使它应该旋转生成,然后只旋转较小的值以适应移动的怪物。
箭头的构造函数:
public Shot(Vector2 position, EntityV2 target) {
this.sprite = SpriteStore.get().getSprite("resources/sprites/arrowShot.png");
this.position = position;
this.targetEntity = target;
this.rotation = Math.atan2(targetEntity.getBounds().getCenterY()
- position.getY(), targetEntity.getBounds()
.getCenterX() - position.getX());
this.rotation += Math.PI / 2.0;
this.angle = Math.toDegrees(rotation);
this.movementVector = new Vector2();
bounds = new Rectangle((int) position.getX(), (int) position.getY(), sprite.getWidth(), sprite.getHeight());
}
逻辑更新调用:
public void move(float delta) {
position.add((movementVector.getX() * delta) / 1000, (movementVector.getY() * delta) / 1000);
if(targetEntity.getBounds().contains(position.getX(), position.getY())) {
isDone = true;
}
bounds.setLocation((int) position.getX(), (int) position.getY());
rotation = Math.atan2(targetEntity.getBounds().getCenterY()
- position.getY(), targetEntity.getBounds()
.getCenterX() - position.getX());
rotation += Math.PI / 2.0;
angle = Math.toDegrees(rotation);
calculateMovementVector(targetEntity.getCenter());
}
渲染调用:
public void draw(Graphics2D g) {
int x = (int) position.getX() + sprite.getWidth()/2;
int y = (int) position.getY() + sprite.getHeight()/2;
g.rotate(angle, x, y);
sprite.draw(g, (int) position.getX(), (int) position.getY());
g.rotate(-angle, x, y);
}
我计算移动矢量的方式(应用于位置):
private void calculateMovementVector(Vector2 to) {
float dX = to.getX() - (float) bounds.getCenterX();
float dY = to.getY() - (float) bounds.getCenterY();
float distance = (float) Math.sqrt(dX * dX + dY * dY);
float sX = speed * dX / distance;
float sY = speed * dY / distance;
movementVector.set(sX, sY);
}
我假设您的 Graphics2D
对象是 java.awt.Graphics2D
的实例。也就是说,我想我知道你的问题:
当 the documentation for rotate()
指定您应该传递以弧度为单位的值时,您使用的是度数。由于以度为单位的度量与以弧度为单位的度量有很大不同,您会发现度数的微小变化会导致弧度的非常大(可能超过一个完整的圆)变化。尝试注释掉度数转换,并使用 rotation
而不是 angle
来调用 g.rotate()
我正在为塔防游戏创建原型。现在,我正在插入一些应该指向周围怪物 运行 中心的箭头(比如后面来自塔的子弹)。我设法在第一个逻辑调用中相应地设置旋转,但我不知道如何更改代码以防止发生以下情况:http://recordit.co/jBdXtGGeN8
简而言之:箭头一直旋转,即使它应该旋转生成,然后只旋转较小的值以适应移动的怪物。
箭头的构造函数:
public Shot(Vector2 position, EntityV2 target) {
this.sprite = SpriteStore.get().getSprite("resources/sprites/arrowShot.png");
this.position = position;
this.targetEntity = target;
this.rotation = Math.atan2(targetEntity.getBounds().getCenterY()
- position.getY(), targetEntity.getBounds()
.getCenterX() - position.getX());
this.rotation += Math.PI / 2.0;
this.angle = Math.toDegrees(rotation);
this.movementVector = new Vector2();
bounds = new Rectangle((int) position.getX(), (int) position.getY(), sprite.getWidth(), sprite.getHeight());
}
逻辑更新调用:
public void move(float delta) {
position.add((movementVector.getX() * delta) / 1000, (movementVector.getY() * delta) / 1000);
if(targetEntity.getBounds().contains(position.getX(), position.getY())) {
isDone = true;
}
bounds.setLocation((int) position.getX(), (int) position.getY());
rotation = Math.atan2(targetEntity.getBounds().getCenterY()
- position.getY(), targetEntity.getBounds()
.getCenterX() - position.getX());
rotation += Math.PI / 2.0;
angle = Math.toDegrees(rotation);
calculateMovementVector(targetEntity.getCenter());
}
渲染调用:
public void draw(Graphics2D g) {
int x = (int) position.getX() + sprite.getWidth()/2;
int y = (int) position.getY() + sprite.getHeight()/2;
g.rotate(angle, x, y);
sprite.draw(g, (int) position.getX(), (int) position.getY());
g.rotate(-angle, x, y);
}
我计算移动矢量的方式(应用于位置):
private void calculateMovementVector(Vector2 to) {
float dX = to.getX() - (float) bounds.getCenterX();
float dY = to.getY() - (float) bounds.getCenterY();
float distance = (float) Math.sqrt(dX * dX + dY * dY);
float sX = speed * dX / distance;
float sY = speed * dY / distance;
movementVector.set(sX, sY);
}
我假设您的 Graphics2D
对象是 java.awt.Graphics2D
的实例。也就是说,我想我知道你的问题:
当 the documentation for rotate()
指定您应该传递以弧度为单位的值时,您使用的是度数。由于以度为单位的度量与以弧度为单位的度量有很大不同,您会发现度数的微小变化会导致弧度的非常大(可能超过一个完整的圆)变化。尝试注释掉度数转换,并使用 rotation
而不是 angle
来调用 g.rotate()