我正在开发一款将使用射弹的游戏。因此,我创建了一个 Projectile 类,并在用户触摸屏幕时创建了一个新实例:
@Override
public boolean onTouch(View v, MotionEvent e){
float touch_x = e.getX();
float touch_y = e.getY();
new Projectile(touch_x, touch_y);
}
还有 Projectile 类:
public class Projectile{
float target_x;
float target_y;
Path line;
public Projectile(float x, float y){
target_x = x;
target_y = y;
line = new Path();
line.moveTo(MyGame.mPlayerXPos, MyGame.mPlayerYPos);
line.lineTo(target_x, target_y);
}
}
所以这形成了一个有 2 个点的路径,即玩家的位置和触摸坐标。我的问题是 - 你如何访问这条线上的点?例如,如果我想在直线的半点处获得 Projectile 的 x、y 坐标,或者 Projectile 在 100 个滴答声之后(以 X 像素/滴答声的速度移动)的点?
我还需要 Projectile 在到达终点后继续移动。我需要使用 line.addPath(line) 来继续扩展路径吗?
编辑
我设法让射弹沿直线移动,但它们朝奇怪的方向移动。我不得不捏造一些代码:
private void moveProjectiles(){
ListIterator<Projectile> it = Registry.proj.listIterator();
while ( it.hasNext() ){
Projectile p = it.next();
p.TimeAlive++;
double dist = p.TimeAlive * p.Speed;
float dx = (float) (Math.cos(p.Angle) * dist);
float dy = (float) (Math.sin(p.Angle) * dist);
p.xPos += dx;
p.yPos += -dy;
}
}
Angle
一定是问题..我正在使用这种方法,效果很好:
private double getDegreesFromTouchEvent(float x, float y){
double delta_x = x - mCanvasWidth/2;
double delta_y = mCanvasHeight/2 - y;
double radians = Math.atan2(delta_y, delta_x);
return Math.toDegrees(radians);
}
但是,对于屏幕中心上方的触摸,它返回 0-180,对于下方的触摸,它返回 0 到 -180。这是一个问题吗?