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