を高く評価し一つの大きな問題は、(少なくとも私の意見では)このゲームはプレイヤーのような形状のアンカーポイントを、どのように処理するかです。
私たちはその場所に小さな赤い四角形を描画することにより、アンカーポイントを強調表示することができます:
g.setColor(Color.RED);
g.drawRect((int)player.getX() -5, (int)player.getY() -5, 10, 10);
これはDraw#renderGame(Graphics2D)
方法に出たとき、それは次のようになります。私たちは、その後
private void renderGame(Graphics2D g) {
g.rotate(Math.toRadians(player.rot), player.getX()+64, player.getY()+64);
g.drawImage(player.getCurrentFrame(), (int)player.getX(), (int)player.getY(), player.getWidth(), player.getHeight(), null);
g.setColor(Color.RED);
g.drawRect((int)player.getX() -5, (int)player.getY() -5, 10, 10);
g.rotate(-Math.toRadians(player.rot), player.getX()+64, player.getY()+64);
//...
ますアンカーポイントは、画像の中心になっていないことを参照してください。
ご覧のとおり、アンカーポイント(回転前の元の(0,0)ポイント)は、画像の中心になく、十字線がプレイヤーの視点ではなく、それに関連付けられています。
プレーヤー回転しながら、これは、シフト操作に起こる:あなたは+64
とpostionをシフトしている
g.rotate(Math.toRadians(player.rot), player.getX()+64, player.getY()+64);
//...
g.rotate(-Math.toRadians(player.rot), player.getX()+64, player.getY()+64);
。その後
g.rotate(Math.toRadians(player.rot), player.getX(), player.getY());
g.drawImage(player.getCurrentFrame(), (int)player.getX() - (player.getWidth()/2), (int)player.getY() - (player.getHeight()/2), player.getWidth(), player.getHeight(), null);
g.rotate(-Math.toRadians(player.rot), player.getX(), player.getY());
:(私は固定値を避け、心を)私はそれを削除し、代わりにg.drawImage
コールへのシフトを追加することをお勧めので、アンカーポイントは、中央に正しくありますあなたは今弾を発射すると、弾丸は常にプレイヤーの特定の位置から「始まる」ことがわかります。ここでの問題は、使用したオフセットが間違っていることです。適切な値は次のとおりです。
float gunOffsetX = 35, gunOffsetY = 29;
(あなたが好きな場合は、もう少しそれらを調整することができるので、私は、試行錯誤によってそれらを得た)
今では次のようになります。
ご覧のとおり、ショットはまだ少しずれていますが、これは弾丸の回転が正しくないためです(プレーヤの形状と同じように):
g.rotate(Math.toRadians(f.rot), f.getX()+f.getWidth()/2, f.getY()+f.getHeight()/2);
g.drawImage(f.img, (int)f.getX(), (int)f.getY(), f.getWidth(), f.getHeight(), null);
g.rotate(-Math.toRadians(f.rot), f.getX()+f.getWidth()/2, f.getY()+f.getHeight()/2);
それは(どんなXまたはYなし調整)、次のようになります。
g.rotate(Math.toRadians(f.rot), f.getX(), f.getY());
g.drawImage(f.img, (int)f.getX(), (int)f.getY(), f.getWidth(), f.getHeight(), null);
g.rotate(-Math.toRadians(f.rot), f.getX(), f.getY());
最終的な結果は次のとおりです。
プレイヤーが正しく見えます十字線とショットは銃の前に置かれます。
十字線の中央から直接発砲したい場合は、プレーヤーの位置と弾丸のオフセットを少し調整するだけで済みます。
(Draw#renderGame(Graphics2D)
中)プレーヤー:
g.drawImage(player.getCurrentFrame(), (int)player.getX() - (player.getWidth()/2), (int)player.getY() - (player.getHeight()/2) - 30, player.getWidth(), player.getHeight(), null);
((int)player.getY() - (player.getHeight()/2) - 30
で-30
を気)
弾丸:
float gunOffsetX = 35, gunOffsetY = 0;
今弾丸が右の十字線を通過する(心の赤いもの長方形は武器の上にあります):
(私は適切なGIFファイルを作成するには少しあまりにも愚かだので、私は画像だけを提供することができます)
今、あなたは必要がありますあなたが望む結果を得るためにオフセット値を、しかし、なぜ今のような価値観があるのかを理解しようとするべきです。後でのダイナミックの値に置き換える必要があります。プレーヤーの画像が異なるため、異なる武器に弾丸のオフセットが異なる必要があるからです。武器バレルがイメージ内に置かれているイメージと座標を含む、各武器タイプのインスタンスを持つ何らかの種類のクラスを持つと便利です。次に、これらの座標を使用して、弾丸イメージのオフセットを正しく設定できます。
あなたは '106'と' 96'の定数を作ることができますか? –
あなたがプレーヤーを動かさないとどうなるのですか? –
javaの座標系が東向きに0度、西向きに180度、北向きに270度を認識していると思いますか? –