2016-06-20 9 views
13

私はちょうど楽しみのためにちょっとした試合をしています。弾丸が銃から出るように固まってしまいました。下のコードでは、プレーヤーの方向は、rotと呼ばれる角度です。弾丸が銃から射殺されない

コード全体https://github.com/LegendL3n/Mortal-Kombat

コードも試み

float gunOffsetX = 106, gunOffsetY = 96; 
double angle = Math.toRadians(rot); // convert direction of player from degrees to radians for sin and cos 
x = getX(); // player X 
y = getY(); // player Y 

float bulletX = (float) (x + (gunOffsetX * Math.cos(angle) - gunOffsetY * Math.sin(angle))); 
float bulletY = (float) (y + (gunOffsetX * Math.sin(angle) + gunOffsetY * Math.cos(angle))); 

Instances.fire.add(new Fire(bulletX, bulletY, rot, weapon)); 

bulletX = (float) (x + Math.cos(angle + Math.atan2(106, 96)) * Point2D.distance(0, 0, 106, 96)); 

しかし

たぶん弾丸が銃の最後に出現する必要がありますが、あなたは以下のgifで見ることができるように、これはそうではありません、同じ結果..

enter image description here

すべてのヘルプ

+3

あなたは '106'と' 96'の定数を作ることができますか? –

+1

あなたがプレーヤーを動かさないとどうなるのですか? –

+2

javaの座標系が東向きに0度、西向きに180度、北向きに270度を認識していると思いますか? –

答えて

12

を高く評価し一つの大きな問題は、(少なくとも私の意見では)このゲームはプレイヤーのような形状のアンカーポイントを、どのように処理するかです。

私たちはその場所に小さな赤い四角形を描画することにより、アンカーポイントを強調表示することができます:

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); 
    //... 

ますアンカーポイントは、画像の中心になっていないことを参照してください。

image with anchor point

ご覧のとおり、アンカーポイント(回転前の元の(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()); 

image with centerd anchor

:(私は固定値を避け、心を)私はそれを削除し、代わりにg.drawImageコールへのシフトを追加することをお勧めので、アンカーポイントは、中央に正しくありますあなたは今弾を発射すると、弾丸は常にプレイヤーの特定の位置から「始まる」ことがわかります。ここでの問題は、使用したオフセットが間違っていることです。適切な値は次のとおりです。

float gunOffsetX = 35, gunOffsetY = 29; 

(あなたが好きな場合は、もう少しそれらを調整することができるので、私は、試行錯誤によってそれらを得た)

今では次のようになります。

shot fired, still misplaced

ご覧のとおり、ショットはまだ少しずれていますが、これは弾丸の回転が正しくないためです(プレーヤの形状と同じように):

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()); 

最終的な結果は次のとおりです。

shot fired, correctly placed

プレイヤーが正しく見えます十字線とショットは銃の前に置かれます。


十字線の中央から直接発砲したい場合は、プレーヤーの位置と弾丸のオフセットを少し調整するだけで済みます。

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; 

今弾丸が右の十字線を通過する(心の赤いもの長方形は武器の上にあります):

shot fired, bullet through crosshair

(私は適切なGIFファイルを作成するには少しあまりにも愚かだので、私は画像だけを提供することができます)


今、あなたは必要がありますあなたが望む結果を得るためにオフセット値を、しかし、なぜ今のような価値観があるのか​​を理解しようとするべきです。後でのダイナミックの値に置き換える必要があります。プレーヤーの画像が異なるため、異なる武器に弾丸のオフセットが異なる必要があるからです。武器バレルがイメージ内に置かれているイメージと座標を含む、各武器タイプのインスタンスを持つ何らかの種類のクラスを持つと便利です。次に、これらの座標を使用して、弾丸イメージのオフセットを正しく設定できます。

+1

OMG !!!ありがとうございました! – L3n

+1

@DavidGomesようこそ。最後の段落を読むのを忘れないでください。あなたは( 'Weapon'列挙型で計画されています)さまざまな武器を実装し、その代わりに、動的なオフセットを使用する方法を見つけることを試みる場合は、これらの定数オフセット値は、あなたのトラブルの原因となります(彼らは、画像サイズとバレルの位置に関連しています画像)。 – Tom

+0

ああ!あなたはそうだよ!ありがとう、btw私はちょうど列挙体の中にオフセットを作成し、各武器のコンストラクタでオフセットを入力してオフセットを使用すると "weapon.offsetX"をインスタンス化することはできませんか? – L3n

関連する問題