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