だから私は、ゴーストと衝突して攻撃する白い星としてプレイする単純なゲームを作成しています。不滅のゴーストの場合、粒子の軌跡が短くなるかリセットされます(コードに見られるように)私の問題は、パーティクルの軌跡が適切に機能していないようです。ゴーストが尾の端にぶつかった場合にのみ衝突し、頭以外の尾のどこでも衝突するはずですが、尾の端に衝突した場合にのみ衝突します。リストからゴーストを削除すると、計算が複数回実行されるように見えます。
for (int i = 0; i < EntityHandler.getEnemies().size(); i++) {
Enemy e = EntityHandler.getEnemies().get(i);
if (collidesWith(e)) {
if (e.getType() == GHOST_IMMORTAL) {
trailLife = 100;
score -= 100;
} else {
score += 15;
trailLife -= 5;
}
EntityHandler.removeEnemy(e);
}
for (int k = 0; k < trails.size(); k++) {
ParticleTrail pt = trails.get(i);
if (pt.intersects(e.getBounds())) {
if (e.getType() == GHOST_IMMORTAL) {
trailLife += 20;
score -= 20; //instead takes away 500 if at tail end, else it doesnt do anything
} else score += 5; //instead adds 200-500 if at tail end, else nothing happens
EntityHandler.removeEnemy(e);
}
}
}
粒子の軌跡がどのように作成されているかについては、それが何か関係がある場合に備えて:
@Override
public void tick() {
if (alpha > speed) alpha -= speed;
else dead = true;
}
@Override
public void render(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setComposite(Util.makeTransparent(alpha));
g.setColor(color);
drawShape(g); //Renderer.fillStar(g, (int) x, (int) y, PLAYER_PRONG_RADIUS, radius, PLAYER_PRONGS);
//Renderer.fillRegularPolygon(g, (int) x, (int) y, radius, PLAYER_SIDES);
g2d.setComposite(Util.makeTransparent(ALPHA_VISIBLE));
}
そして、これが私が作成した「Util」クラスの透過的な作成方法です。
public static AlphaComposite makeTransparent(float alpha) {
int type = AlphaComposite.SRC_OVER;
return AlphaComposite.getInstance(type, alpha);
}
アプリケーションの画像は次のとおりです。