如何在 ActionScript 3 中触摸舞台时向上移动角色

How to move the character up when touched the stage in ActionScript 3

我是 ActionScript 3 的新手,是的,它非常有趣。但是我遇到了触摸事件的问题。

我已经编写了让角色(鸟)在每一帧向前和向下移动的代码,现在我需要插入一个函数,让鸟在点击屏幕时向上移动。我已经用这个 url - https://help.adobe.com/en_US/as3/dev/WS1ca064e08d7aa93023c59dfc1257b16a3d6-7ffe.html 中的示例进行了尝试 但仍然没有任何反应。请帮助我。

我的代码如下。

package{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TouchEvent;
import flash.ui.Multitouch;

Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT;


public class MyBirdy extends MovieClip{

    public var bird: Birdy;
    public var sky: Background;
    public var sky2: Background;
    public var birdinsky: MovieClip;
    public var skyBreadth:Number;

    public function MyBirdy(){
        bird = new Birdy();
        sky = new Background();
        sky2 = new Background();
        skyBreadth = 1453.15;

        sky.x = 730;
        sky.y = 360;
        bird.x = 100;
        bird.y = 340;
        sky2.x = sky.x + skyBreadth;
        sky2.y = sky.y;

        birdinsky = new MovieClip();
        birdinsky.addChild(sky);
        birdinsky.addChild(sky2);
        birdinsky.addChild(bird);

        stage.addChild(birdinsky);

        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }


    public function onEnterFrame(e:Event):void{
        bird.x += 4;
        birdinsky.x = 100 - bird.x;
        bird.y += 2


        if(sky.x + skyBreadth + birdinsky.x < 700){
            sky.x = sky.x +  (2 * skyBreadth);
        }
        if(sky2.x + skyBreadth + birdinsky.x < 700){
            sky2.x = sky2.x + (2 * skyBreadth);
        }


        birdinsky.addEventListener(TouchEvent.TOUCH_TAP, onTap);
    }


    function onTap(e:TouchEvent): void {
        bird.y -= 2;
        //I want my bird to fly up when tapped!
    }
}

它不起作用的原因是,您的点击移动总是会被进入帧处理程序中的移动所抵消。例如你点击,这会将小鸟向上移动 2 个像素,但随后在你的应用程序的下一帧滴答声中(当你看到视觉变化时)你再次将小鸟向下移动 2 个像素 onEnterFrame - 每帧运行打勾

这里有一种方法可以做你想做的事:

接受这一行,并将其完全删除(或者如果您真的想要点击而不是按住,请将其从 onEnterFrame 方法中移出并移至您的构造函数中 - 您不想一遍又一遍地添加侦听器每帧再次)

birdinsky.addEventListener(TouchEvent.TOUCH_TAP, onTap);

如果不需要同时支持多点触控,使用鼠标事件会更简单。如果切换到鼠标事件而不是触摸,请删除此行(尽管您仍然可以根据需要使用触摸):

Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT;

在您的构造函数 (MyBirdy) 中添加以下行以侦听鼠标上下移动事件:

如评论中所建议的那样,如果您希望在屏幕上的任意位置按下按钮起作用,您应该在舞台上聆听鼠标按下(或触摸开始)的声音

stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);   //or TouchEvent.TOUCH_BEGIN
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);  //or TouchEvent.TOUCH_END

然后为这些侦听器创建处理函数,以及一个 var 来跟踪鼠标按钮状态:

private var isMouseDown:Boolean = false;

private function onMouseDown(e:Event):void {
    isMouseDown = true;
}

private function onMouseUp(e:Event):void {
    isMouseDown = false;
}

有了上面的内容,您现在就有了一个变量 (isMouseDown),当鼠标按下时它会被设置为 true,当鼠标被抬起时它会被设置为 false。记住这里的鼠标也和手指一样press/hold.

现在,在您的输入框架处理程序 (onEnterFrame) 中,添加以下内容:

删除行 bird.y += 2。 添加:

if(isMouseDown){
    bird.y -= 2; //move the bird up, as the screen is being pressed/clicked
}else{
    bird.y += 2  //move the bird down
}

现在,在按下鼠标(或按住鼠标)的任何帧中,小鸟都会向上移动而不是向下移动,而不是单击事件。