2015-07-21 37 views
0

我正在创建塔防游戏的原型。现在,我正在攻击一些箭(就像后面塔的子弹一样),这些箭应指向四处奔跑的怪物中心。我在第一次逻辑调用中设置了相应的旋转,但我不知道如何更改代码以防止发生以下情况:http://recordit.co/jBdXtGGeN8图片旋转经常发生

简而言之:箭头旋转整个时间,即使它应该spawn旋转,然后只为小值旋转以适应移动的怪物。

的构造函数箭头:

​​

逻辑更新呼叫:

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