Re: [问题] 发射子弹间隔失败~~求解

楼主: KawasumiMai (さあ、死ぬがいい)   2013-12-02 21:38:42
※ 引述《mucoci (奇宝~)》之铭言:
: 小弟要作出 机体在射出子弹后,隔三秒才能再发射
: 由监听鼠标click 开始
: 完成后
: 一开始的确正常
: 但过一会儿如果连点鼠标后,就失常了
: 变成可以连发@@"
: 隔三秒的限制不见了~~
: 请各位高手协助看一下是哪的问题~
: 程式码如下
: //监听鼠标点击来发射子弹
: nowthis.stage.addEventListener(MouseEvent.MOUSE_DOWN,BulletEvent);
: function BulletEvent(me:MouseEvent):void
: {
: if (MouseEvent.CLICK && canfire == 1) //变量canfire用来控制是否可发射
这里很怪,if(MouseEvent.CLICK) 作用是?
me就是MouseEvent了,这样写未必能求得确切的反应
另外,在Mouse_Down function里面侦测Click
你需要先搞懂这两者的差异
: { 1可发射,2不可发射
恩...没啥问题
不过建议1可发射,0不可发射,或者干脆用boolean而不是Number
这算是sense
: canfire =2; //可发射后,立刻让接下来变不可发射
: 并移除鼠标点击的监听
: stage.removeEventListener(MouseEvent.MOUSE_DOWN,BulletEvent);
这一行不需要,当你已经使用canfire来判定是否可以发射的时候
没必要时常对MouseDown动作进行监听的开关
反正按下去当canfire不对的时候也不会有动作不是?
: //当鼠标按下时,在场景上创造一个子弹
: var ball_mc =new ball();
:   //设定子弹出现时的起始座标,正常来说应该是要设定在子弹的砲口处
: ball_mc.x=nowthis['warcarshooter_mc'].x;
: ball_mc.y=nowthis['warcarshooter_mc'].y;
: //这里是设定子弹行进的位移速度,分别计算出来并且写入子弹的属性内
:   //属性名称可以自己定
: ball_mc.MoveX=carbulletspeed/30*Math.cos((nowthis['warcarshooter_mc'].rotation-90)*Math.PI/180);
: ball_mc.MoveY=carbulletspeed/30*Math.sin((nowthis['warcarshooter_mc'].rotation-90)*Math.PI/180);
: ball_mc.rotation=nowthis['warcarshooter_mc'].rotation-90;
: nowthis.addChild(ball_mc);
: //赋予子弹一个ENTER_FRAME的事件
: ball_mc.addEventListener(Event.ENTER_FRAME,BulletMoveEvent);
: //下面是在3秒后,变可射击状态,同时加回鼠标监听
: setInterval(function ()
: {
: canfire = 1;
: stage.addEventListener(MouseEvent.MOUSE_DOWN,BulletEvent);
理由同上,没有移除就不用有加回来的动作
: }, 3000);
: }
: }
: 感谢~~
最大的问题点在于
setInterval跟Timer一样,都是一定时间就会"重复"的东西
而Timer可以设定次数,但setInterval好像不行
而你设定在BulletEvent里面进行setInterval的动作
每一个setInterval就会有一个"匿名"计数器
换句话说,每当你按一下就有一个无限的时间倒数在运转
所以当第二次以后,你按下去并且让canfire变成2之后
可能没半秒刚好第一个setInterval倒数完毕就把它变1了
这表示当几十次之后就有几十个setInterval在倒数
而AS3请用Timer,setInterval是AS2的东西
============================================================================
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
var canfire = 1;
//按下鼠标事件
stage.addEventListener(MouseEvent.MOUSE_DOWN,BulletEvent);
//设定三秒的Timer,后面的1是次数
var reset:Timer=new Timer(3000,1)
//Timer事件,三秒到就跑一次
reset.addEventListener(TimerEvent.TIMER,resetBullet)
function BulletEvent(me:MouseEvent):void {
//可以发射的话
if (canfire) {
//变成不能发射
canfire = 0;
//执行你要的动作
...................
//让倒数开始,因为有设定次数所以每次只会跑一次
reset.start()
}
}
function resetBullet(e:TimerEvent){
//让他变成可以发射
canfire=1
}
作者: mucoci (奇宝~)   2013-02-02 21:47:00
看懂了~~小弟先来试试,大大感恩~~实测后非常成功~~~谢谢大大,果然是像大大说的有无数个timer在倒数,所以会变连发

Links booklink

Contact Us: admin [ a t ] ucptt.com