Я в процессе создания прототипа игры Tower Defense. Прямо сейчас, я взламываю несколько стрел (например, пули от башен позже), которые должны указывать на центр монстров, бегущих вокруг. Мне удается установить поворот соответственно в первом логическом вызове, но я не знаю, как изменить код, чтобы предотвратить следующее: 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);
}
Я предполагаю, что я должен прочитать документацию чаще:/ Спасибо за тонну, это сработало! – gub
@gub Это точно помогает! – childofsoong