発射体を使用するゲームに取り組んでいます。そこで、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 ピクセル/ティックの速度で移動) 後にあるポイントでしょうか?
また、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 を返します。これは問題ですか?