2016-07-13 10 views
1

私は、ビットマップの前面に直接留まる口部分をコーディングしようとしていますが、別のオブジェクトである必要があります。Javascript - オブジェクトを別のオブジェクトの前に直接置く方法を教えてください。

現在、私のコードは次のようになります。次のコードではなく、プレイヤーの方向に-50 xと口のyの値を置くが、1つの方向のためにのみ動作します使用して明らかに

// LOCATION: 
    var xDistance = stage.getStage().mouseX - player.x; 
    var yDistance = stage.getStage().mouseY - player.y; 
    var distance = Math.sqrt(xDistance * xDistance + yDistance * yDistance); 
    var x = player.x += xDistance * easingAmount; 
    var y = player.y += yDistance * easingAmount; 

    if (distance > 1) { 
    player.x += xDistance * easingAmount; 
    player.y += yDistance * easingAmount; 
    } 

    // ROTATION: 
    var degrees = (Math.atan2(yDistance, xDistance) * 180/Math.PI) - 90; 
    if(degrees >= 360) { 
    degrees -= 360; 
    } 

    player.rotation = degrees; 
    stage.update(); 

プレイヤーの前に口を守ること:

mouth.x = player.x - 50; 
    mouth.y = player.y - 50; 

私は誰もがこの数学で私を助けることができますか?とても感謝しております。ここではより良いものを説明するために2つの画像です:

enter image description here

enter image description here

+0

あなたが正確に欲しいものを理解するのは本当に難しいです...プレーヤーが口から一定距離を維持し、それと一緒に回転してもらいたいですか? –

+0

これは数学とは何が関係していますか? – duffymo

+0

@Nessはい、まさに私が探しているものです。 – Skua

答えて

0

私はまた、将来的にあなたを助けるあなたのための最善の解決策は、最初に固体テストベクターライブラリーを取得することだと思いますあなたのためにこれらの計算をすべて行います。たとえば、これを試すことができますhttp://victorjs.org/(それは自分自身を試していない)良い見えます。あなたはベクトルが働いていたら

は、アルゴリズムは非常に簡単です:

  1. 角度またはラジアンとしてプレーヤーの方向を取得します。
  2. その角度からベクトルを作成します。
  3. 目的の距離にそのベクトルを掛けます。
  4. 口の位置または他の部分は、プレーヤーの位置+ベクトルです。このような何か(テストしていない)だろうvictorjsで

:ネスのソリューション@

// who the hell calls his "Vector" class "Victor"? alias it. 
var Vector = Victor; 

// create the vector from player angle (assume player_angle is defined somewhere) 
var v = new Vector(1, 0); 
v = v.rotateDeg(player_angle); 

// multiply by desired distance, assume its 20 pixels 
v = v.multiply(new Vector(20, 20)); 

// now calc mouth position (assume player_pos is defined before) 
var mouth_pos = player_pos.add(mouth_pos); 
+0

ご返信ありがとうございます。私は現在、ビットマップを作成するのに、EaselJSを使用しています。口の部分とプレーヤーは、このライブラリで作成された両方のビットマップです。これらの計算がすでに完了している場合は、VectorJSが必要ですか?ちょっとした考え。私は本当にあなたの助けに感謝します。 – Skua

+0

ご覧のとおり、私はこの行を使っています:var degrees =(Math.atan2(yDistance、xDistance)* 180/Math。PI)-90;プレーヤーの角度を計算する。私がしなければならないことは、口の部分をどのようにして正確にミッキーにして、それの正面にあるわずか数ピクセルにすることができるかを理解することだけです。 – Skua

0

は正常に動作する必要があります。ただし、外部依存関係を避けたい場合は、次のように動作する可能性があります。口のベクトル定義:

mouth.x = 50; 
mouth.y = 0; // The mouth is the distance 50 away from the player. 
      // Assuming that a non-rotated player points in the x- 
      // direction 
rotateVector(mouth, player.rotation); 

をそして

function rotateVector(var vec, var degrees) { 
    var output; // of vector type 
    output.x = cos(degrees)*vec.x - sin(degrees)*vec.y; 
    output.y = sin(degrees)*vec.x + cos(degrees)*vec.y; 
    return output; 
} 

口のワールド空間位置はこの位置で

mouthWorldSpace = player.position + mouth.position; // (i.e. just add the vectors together) 

なりました(wikipediaを参照)として、あなたはrotateVectorを定義することができます口のビットマップを描画する必要があります。

+0

お返事ありがとうございました。しかし、私はすでにこれらの計算をしていると思います。 @Nessに言ったように、私はちょうど口のビットマップを正確にプレイヤーの動作を模倣するように探しています。また、私はすでに、EaselJSと呼ばれる外部依存関係を持っています(これはOPでこれを言及しているはずです)。 – Skua

+0

@Skuaそれでは、私は本当に問題が何であるか分かりません(3行追加しました。私が見逃していたのは、あなたが探しているものですか?)。このメソッドは正しくあなたにビットマップまたは何か他のものとしてレンダリングできる口の位置を与える必要があります – pingul

+0

乾杯 - 私はそのショットを与える:) – Skua

関連する問題