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 轴直线移动。Left/Right 仅沿 X 移动,Up/Down 仅沿 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距离。

假设角色在 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的鼠标移向鼠标点,您只需要两者之间的方向向量:

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 回答