0

わかりましたので、character_mc というキャラクターがあり、前方矢印を押したときにマウスに向かって移動し、その直角に対して機銃掃射したいと考えています。

私はactionscriptにまったく慣れていないので、元のコードにあなたのコードの例を含めてください。

これが私の現在のコードです:

import flash.events.MouseEvent;
//Event Listners
stage.addChild(crosshair_mc);
crosshair_mc.mouseEnabled = false;
crosshair_mc.addEventListener(Event.ENTER_FRAME, fl_CustomMouseCursor);

function fl_CustomMouseCursor(event:Event)
{
    crosshair_mc.x = stage.mouseX;
    crosshair_mc.y = stage.mouseY;
}
Mouse.hide();

stage.addEventListener(MouseEvent.MOUSE_MOVE,facecursor);
stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_KeyboardDownHandler);
//Functions
function facecursor(event):void
{
    character_mc.rotation = (180 * Math.atan2(mouseY - character_mc.y,mouseX - character_mc.x))/Math.PI + 90;

}


function fl_KeyboardDownHandler(event:KeyboardEvent):void
{
    trace("Key Code Pressed: " + event.keyCode);
    if (event.keyCode == 38)
    {
        character_mc.y = character_mc.y - 5;
    }
    if (event.keyCode == 40)
    {
        character_mc.y = character_mc.y + 5;
    }
        if (event.keyCode == 39)
    {
        character_mc.x = character_mc.x + 5;
    }
        if (event.keyCode == 37)
    {
        character_mc.x = character_mc.x - 5;
    }

}
4

2 に答える 2

1

これを行う方法の基本概念は説明できますが、それを自分のコードに適用する必要があります。ベクトルを使用するように移動コードを変換し、次にベクトルを変更してマウスが向いている方向 (またはその方向に直角な方向) を取得し、少し計算します。

現在、各キーを押した場合にのみ、キャラクターが x 軸と y 軸に沿ってまっすぐに移動しています。左/右は X に沿ってのみ移動し、上/下は Y に沿ってのみ移動します。

マウスの方向に移動するには、上/下/左/右キーを押したときにキャラクタを X と Y の両方に沿って移動する必要があります。明らかに、キャラクターの両方の x/y 位置を同じ量、たとえば 5 だけ移動すると、正確に 45 度で移動することがわかります (ただし、実際には 7.07 ピクセルのステップで移動しますが、理由がわかると思います)。 . これをベクトル (5,5) として表すことができます。Point オブジェクトを使用して、このベクトルを表すことができます。

var movementVector:Point = new Point(5, 5);
trace(movementVector.x); // gives 5
trace(movementVector.y); // also gives 5

これを念頭に置いて、ベクトルを使用して y 軸の上下の動きを表すこともできます。

// set the x to 0 and y to 5
movementVector.x = 0; // 0 would mean not to move the character along the x
movementVector.y = 5; // using -5 would move the character up

x 軸に沿ってのみ移動するには:

movementVector.x = 5; // using -5 would move the character right
movementVector.y = 0; // 0 would mean not to move the character along the y

キャラクターの実際の動きを行うには、ベクトルの値を使用することを除いて、現在行っているのと同じです。

character_mc.x = character_mc.x + movementVector.x;
character_mc.y = character_mc.y + movementVector.y;

キャラクターの位置からマウスの位置まで対角線上を移動するための適切なベクトルを計算するのは非常に簡単です。ベクトルの x 値は、キャラクターからマウスまでの x 距離であり、ベクトルの y 値は、キャラクターからマウスまでの y 距離です。

キャラクターが y 125, 100 で、マウスが 225, 150 であるとします。これは、キャラクターとマウスの間の距離が 100, 50 x および y であることを意味します。したがって、最終的にはベクトルになります。

movementVector.x = 100;
movementVector.y = 50;

このベクトルをそのままキャラクターの位置に適用すると、キャラクターはすぐに x に沿って 100 ピクセル、y に沿って 50 ピクセル移動するため、すぐにマウスに到達します (その後、それを超えます)。 . ステップ サイズは 111.8 ピクセルの長さになり、大きすぎます。キャラクターの速度まで縮小する必要があります。これを行うには、Point クラスで normalise() メソッドを呼び出してベクトルを縮小します。

trace(movementVector.x); // gives 100
trace(movementVector.y); // gives 50

// assuming '5' is the max speed of the character
movementVector.normalise(5);

trace(movementVector.x); // gives 4.47213595499958
trace(movementVector.y); // gives 2.23606797749979

これにより、「ステップ」サイズが 5 になります。これを適用すると、キャラクターは開始位置から右に 100 ピクセル、下に 50 ピクセルのポイントに向かって 5 ピクセル移動します。

ベクトルを正確に 90 度変換するには、x 値と y 値を交換するのが手っ取り早く簡単な方法です。

normalise() メソッドが数学的に行うことに興味がある場合は、ベクトル (またはポイント) の x 値と y 値を取り、それを長さで割って単位ベクトル (またはステップ サイズが 1 のベクトル) を取得します。 )、次に、指定した入力を倍にして、目的の長さにスケーリングします。

于 2013-03-05T10:24:05.283 に答える
0

マウス ポイントに向かって移動するcharacter_mcには、2 つの間の方向ベクトルのみが必要です。

var dir:Point = new Point(mouseX - character_mc.x, mouseY - character_mc.y); 
dir.Normalize();

// The following should be called when the 'up' or 'forward' arrow is pressed
// to move the character closer to mouse point
character_mc.x += dir.x; // dir can be multiplied by a 'speed' variable
character_mc.y += dir.y;

ポイントの周りを左右に機銃掃射するのはもう少しトリッキーです。

// Where radius is the distance between the character and the mouse
character_mc.x = mouseX + radius * Math.cos(rad);
character_mc.y = mouseY + radius * Math.sin(rad);

このチュートリアルは、あなたが説明したすべてのことなどを行うので、役に立つはずです: http://active.tutsplus.com/tutorials/actionscript/circular-motion-in-as3-make-one-moving-object-orbit-another/

于 2013-03-05T10:23:27.933 に答える