だから私はこれに対する答えを見つけることができないようですが、私は弾丸を円に発射しようとしています. ブレットにアタッチする円形パスの単純なクラスがあり、時間値が指定されたときにそのクラスから位置を読み取ります。ブレットは単にこの時間の値をインクリメントし、その位置を常に次の値に更新します。これは改善できますが、ロジックを理解するまでは、これが私が持っているものです。線形パスで試したので、この方法が機能することはわかっています。問題は、それを循環パスに適用することです。
弾丸が、指定された半径と速度でポイント (ポイント 'Center' など) の周りを一周するようにします。円の半径に関係なく、すべての弾丸が同じ速度で移動するようにしたいので、大きな円は短い円よりも完了するのに時間がかかります. 現在何が起こっているかというと、CircularPath オブジェクトが x = r * cos(t) および y = r * sin (t) と言っており、ここで t はラジアンですが、これは半径が大きくなるにつれて速度が増加する円を作成しています。この円の半径と中心は完全にずれています。半径と速度がオフになっていることを除いて、弾丸は正しい位置から始まります。これを適切に説明していることを願っています。誰でも調べられるようにコードを投稿します。
package io.shparki.tetris.go;
import io.shparki.tetris.util.Point2D;
import java.awt.Color;
import java.awt.Graphics2D;
public class CircularPath extends Path{
private double radius;
// Where Start is the center and end is the location of mouse
// Radius will be distance between the two
public CircularPath(Point2D start, Point2D end) {
super(start, end);
radius = normalToEnd.getLength();
color = Color.YELLOW;
}
public Point2D getPointAtTime(double time){
double px = start.getX() + radius * Math.cos(Math.toRadians(time));
double py = start.getY() - radius * Math.sin(Math.toRadians(time));
return new Point2D(px, py);
}
public double getFinalTime() { return 0; }
public CircularPath getClone() { return new CircularPath(start.getClone(), end.getClone()); }
public void update(){
super.update();
radius = normalToEnd.getLength();
}
public void render(Graphics2D g2d){
super.render(g2d);
g2d.drawLine((int)start.getX(), (int)start.getY(), (int)end.getX(), (int)end.getY());
//g2d.drawOval((int)(start.getX() - radius), (int)(start.getY() - radius), (int)radius * 2, (int)radius * 2);
}
}