AndEngine を使用してボクシング ゲームに取り組んでいます。2 つのボクサーを表す 2 つのアニメートされたスプライト A と B があります。彼らの健康状態を区別したい。スプライト A が B を手で叩くと、B の体力が減少します。2 つのスプライト間のこの種の衝突をどのように区別できますか?
1 に答える
ボクサースプライトが別のボクサースプライトと衝突したとき、どのボクサーが怪我をするべきかをどのように判断するかということです。基本的な答えは、衝突が発生したかどうかだけでなく、より多くの情報を収集して利用する必要があるということです。私が提案するのは、パンチをスプライト全体の衝突ではなく、拳を表す形状を計算し、パンチ中の重要な瞬間に他のボクサーとの衝突をチェックすることです。例えば:
ボクサーがパンチするとき、接触が「重要」であるアニメーション中の臨界期間を決定する必要があります(おそらく、パンチの完全な延長で、前後の両方で少し延長します)。ボクサーのブール値をtrueに設定し、それ以外の場合はfalseに設定します。それが本当の場合、ボクサーのアップデートで、「拳」を表す形状を計算する必要があります。この形状をレンダリングする必要はありません(デバッグやテストのためにレンダリングできると便利な場合があります)。他のボクサーとの衝突がないか「拳」をチェックできるように、その位置を計算するだけです。拳のインパクトエリアは、概念的にはパンチを行うボクサーに関連付けられている必要があります。そのため、ボクサーと彼自身の拳との衝突をチェックしていません。ボクサーエンティティ内のフィールドとしてインパクトシェイプが必要になる場合があります。したがって、拳がその間に別のエンティティ(つまり、他のボクサー)との衝突を登録した場合、他のボクサーに健康上のダメージを与えます。
以下のコメントで、実装の詳細について質問されました。次のコードは完全な実装ではありませんが、開始する必要があります。
public class BoxerSprite extends AnimatedSprite {
boolean isPunching = false;
Rectangle fist;
public BoxerSprite(float pX, float pY, float pWidth, float pHeight, ITiledTextureRegion pTiledTextureRegion,
ITiledSpriteVertexBufferObject pTiledSpriteVertexBufferObject) {
super(pX, pY, pWidth, pHeight, pTiledTextureRegion, pTiledSpriteVertexBufferObject);
//Create a "fist" object within your boxer sprite
fist = new Rectangle(fistX, fistY, fistWidth, fistHeight, vertexBufferObjectManager);
//Use setPosition to move the fist to the appropriate location during the animation.
fist.setPosition(pX, pY);
}
}