Fab*_*ani 0 actionscript-3 mouseevent
因为我是as3的新手,我想要实现一个MachineGun,在弹药时触发,触发器拉动,在我的情况下,MouseEvent.MOUSE_DOWN.
问题是此事件仅触发一次.
我得到的最接近的是MouseEvent.MOUSE_MOVE,但是当鼠标位置持续时它不能实现我的目的
编辑:
我需要每帧更新鼠标光标
在MouseEvent.MOUSE_DOWN事件处理程序中,您可以创建一个侦听Event.ENTER_FRAME要调度的事件的事件侦听器.使用Event.ENTER_FRAME事件处理程序,您可以重复调用处理子弹射击的方法.以下是我在http://www.benoitfreslon.com/actionscript-throw-bullets-to-mouse-direction上的示例后建模的示例:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
[SWF(width="500", height="500", frameRate="24", backgroundColor="0xFFFFFF")]
public class Main extends Sprite
{
private var _gun:Gun;
private var _interval:int;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
_gun = new Gun();
_gun.x = stage.stageWidth / 2 - _gun.width / 2;
_gun.y = stage.stageHeight / 2 - _gun.height / 2;
addChild(_gun);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown);
}// end function
private function onStageMouseDown(e:MouseEvent):void
{
stage.addEventListener(Event.ENTER_FRAME, onStageEnterFrame);
stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
}// end function
private function onStageEnterFrame(e:Event):void
{
shootBullet();
}// end function
private function shootBullet():void
{
if (_interval > 5)
{
var bullet:Bullet = new Bullet();
bullet.addEventListener(Event.ENTER_FRAME, onBulletEnterFrame);
bullet.x = _gun.x;
bullet.y = _gun.y;
bullet.angleRadian = Math.atan2(stage.mouseY - _gun.y, stage.mouseX - _gun.x);
bullet.addEventListener(Event.ENTER_FRAME, onBulletEnterFrame);
addChild(bullet);
_interval = 0; // reset
}// end if
_interval++;
}// end function
private function onBulletEnterFrame(e:Event):void
{
var bullet:Bullet = Bullet(e.target);
bullet.x += Math.cos(bullet.angleRadian) * bullet.SPEED;
bullet.y += Math.sin(bullet.angleRadian) * bullet.SPEED;
if ( bullet.x < 0 || bullet.x > 500 || bullet.y < 0 || bullet.y > 500)
{
removeChild(bullet);
bullet.removeEventListener(Event.ENTER_FRAME, onBulletEnterFrame);
}// end if
}// end function
private function onStageMouseUp(e:MouseEvent):void
{
stage.removeEventListener(Event.ENTER_FRAME, onStageEnterFrame);
stage.removeEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
_interval = 0;
}// end function
}// end class
}// end package
import flash.display.Sprite;
internal class Gun extends Sprite
{
public function Gun()
{
graphics.beginFill(0x000000);
graphics.drawCircle(0, 0, 10);
graphics.endFill();
}// end function
}// end class
internal class Bullet extends Sprite
{
public var angleRadian:Number;
public const SPEED:Number = 10;
public function Bullet()
{
graphics.lineStyle(1, 0x000000);
graphics.drawCircle(0, 0, 10);
graphics.endFill();
}// end function
}// end class
Run Code Online (Sandbox Code Playgroud)
兴趣点在于onStageEnterFrame()方法.有一个if声明检查_interval属性的值是否大于5,如果是,则创建新的子弹并射击,否则_interval属性的值会增加.该_interval物业的目的是腾出射击的子弹.
[UPDATE]
以下是运行示例Flash应用程序的图像:
鼠标按钮被按住在右上角,因此子弹被朝那个方向射击.
| 归档时间: |
|
| 查看次数: |
2554 次 |
| 最近记录: |