如何在 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
}
现在,在按下鼠标(或按住鼠标)的任何帧中,小鸟都会向上移动而不是向下移动,而不是单击事件。
我是 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
}
现在,在按下鼠标(或按住鼠标)的任何帧中,小鸟都会向上移动而不是向下移动,而不是单击事件。