2015-07-21 3 views
0

Я в процессе создания прототипа игры 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); 
} 

ответ

0

Я предполагаю, что ваш объект Graphics2D является экземпляром java.awt.Graphics2D. Тем не менее, я думаю, что знаю вашу проблему:

Вы используете градусы, когда the documentation for rotate() указывает, что вы должны передавать значение в радианах. Поскольку измерение в градусах находится в совсем другом масштабе, чем в радианах, вы обнаружите, что небольшое изменение в градусах приводит к очень большому (возможно более полному кругу) изменению радианов. Попробуйте закомментировать преобразование градусов, и использовать rotation вместо angle для вызова g.rotate()

+0

Я предполагаю, что я должен прочитать документацию чаще:/ Спасибо за тонну, это сработало! – gub

+0

@gub Это точно помогает! – childofsoong

 Смежные вопросы

  • Нет связанных вопросов^_^