使用Mouse_Event创建拉力并改变力的麻烦

时间:2015-05-02 02:51:02

标签: actionscript-3 rotation mouseevent physics

大家好,所以我现在已经有一段时间了,最​​后还是决定寻求帮助。所以我在AS3中创建一个游戏,其中object从左到右以圆周运动旋转,具体取决于用户的鼠标按压。所以我设置了一些变量作为摩擦力。我想要完成的是当object大于或小于某个旋转度时,我希望对象感觉它被越来越多地拉到它当前所处的那一侧而且是对象的唯一方式可以说回到原来的位置是如果使用点击鼠标就足够了,所以他们不再对它施加压力并且说难度同时增加速度。

以下是我目前正在使用的变量:

        //Variables
        speed = 0.2;
        vx = 0;
        friction = 0.93;
        maxspeed = 10;

我在舞台上也有这些按钮,因此用户可以点击它们来改变object的旋转,如下所示:

    mainScreen.leftBtn.addEventListener(MouseEvent.CLICK, leftButtonClicked);
    mainScreen.rightBtn.addEventListener(MouseEvent.CLICK, rightButtonClicked);

private function leftButtonClicked(e:MouseEvent):void 
    {
        clickLeft = true;
        clickRight = false;
    }

    private function rightButtonClicked(e:MouseEvent):void 
    {
        clickRight = true;
        clickLeft = false;
    }

我尝试在我的ENTER_FRAME事件监听器中设置机制,如下所示:

//RIGHT = CLOCKWISE +, Left = COUNTER CLOCKWISE  -
        if (clickRight)
        {
            vx += speed;
            moveSlow = true;
            moveFast = false;
        }else
        if (clickLeft)
        {
            vx -= speed;
            moveSlow = true;
            moveFast = false;
        }else           
        {
            vx *= friction;
        }

        //IF object is Past 15 Degrees make object go faster MOVE FAST
        if (object.rotation > 15)
        {
            moveFast = true;
            moveSlow = false;
            trace("MOVE_FAST");
        }else
        if (object.rotation < - 15)
        {
            moveFast = true;
            moveSlow = false;
        }else           
        {
            vx *= friction;
        }

         object.rotation += vx;
        //lumberJack.rotation += speed;

        //boundaries of object
        if (vx > maxspeed)
            vx = maxspeed;
        else if (vx < -maxspeed)
            vx = -maxspeed;

我知道我需要在if object.rotation语句中添加一些东西,但不确定我还知道我需要在鼠标单击事件监听器中添加一些内容来操纵速度或摩擦,以便用户可以拉开从作用于它的力量。我试了几次,但似乎还是无法弄明白。截至目前,对象根据用户输入向左或向右旋转,并且说对象向左移动并且用户向右按下object慢慢向左移动然后返回到正常速度。

如果有人能帮助我解决这个问题,我将非常感激!

1 个答案:

答案 0 :(得分:1)

说实话,我在回答你的问题后遇到了一些麻烦,所以这可能只是部分答案。我知道,我很糟糕,但我没有足够的愚蠢的互联网点来发表评论,所以这就是我能做的所有帮助,而我不再关心互联网点系统了。

首先,为了爱插入神,清理所有不必要的空白区域。

这是代码中的潜在问题:显示对象的rotation属性返回-180180之间的值。这意味着每180度,旋转值改变符号。因此,您无法使用旋转是正还是负来确定对象旋转的方向。应将其存储在单独的变量中。

要考虑的另一件事:如果moveSlow和moveFast永远不会同时为真,则不需要有两个变量,因为它是多余的。你没有在上面的代码中使用这些变量,但假设你写了这个:

if (moveSlow) {
    moveALittleBit();
} else if (moveFast) {
    moveALot();
}

您可以将其替换为:

if (moveSlow) {
    moveALittleBit();
} else {
    moveALot();
}

这不仅给你自己不必要的工作,而且这很糟糕,因为这意味着你可以创建“无效状态”(即如果你犯了一个错误,“moveSlow”和“moveFast”同时都是真的)。 / p>

同样,如果“clickedLeft”和“clickedRight”都是互斥的,则不需要单独的变量。但是,如果它们同时都是假的,那么你可能会更喜欢这样的事情:

clickDirection = "left";
clickDirection = "right";
clickDirection = "none";

如果你走了那条路,你最好不要使用字符串常量而不是硬编码字符串,但我认为这太过于偏离主题了。

多次阅读你的问题之后,听起来好像你正在寻找的是动力。这是否涵盖了您的需求?

if (clickRight)
{
    vx += speed;
    momentum = 0;
} else if (clickLeft)
{
    vx -= speed;
    momentum = 0;
} else     
{
    vx *= friction;
}

//IF object is Past 15 Degrees make object go faster MOVE FAST
if (object.degreesRotated > 15)
{
    momentum += 1;
}else if (object.degreesRotated < - 15)
{
    momentum -= 1;
}else           
{
    vx *= friction;
}

vx += momentum;
object.rotation += vx;
object.degreesRotated += vx; //remember how much we've rotated
//lumberJack.rotation += speed;

如果object是动态类型,您可以随时添加“degreesRotated”属性。否则,您可能必须通过扩展该对象的任何显示类型来创建一个新类,并将degreesRotated字段添加到该类