Я работаю над игрой, в которой будут использоваться снаряды. Итак, я создал класс 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);
}
И класс снаряда:
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);
}
}
Таким образом, получается путь с двумя точками, позицией игрока и координатами касания. Мой вопрос: как вы можете получить доступ к точкам на этой линии? Например, если бы я хотел получить координаты x,y снаряда в половине точки линии или точки, в которой снаряд будет через 100 тиков (двигаясь со скоростью X пикселей/такт)?
Мне также нужно, чтобы снаряд продолжал двигаться после достижения конечной точки. Нужно ли мне использовать 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 для касаний ниже. Это проблема?