Re: [問題] 發射子彈間隔失敗~~求解

看板Flash作者 (闇に沈んだ刃)時間11年前 (2013/12/02 21:38), 編輯推噓2(201)
留言3則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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 } -- 昔、とあるドSなひとは、ドMな人と出会った。   いつかふたりは恋して、Hなことをした。     それは──              S.H.M         シンプル.ハーモニック.モーション                      ──世界の一番美しいものであります。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.58.228

12/02 21:47, , 1F
看懂了~~小弟先來試試,大大感恩~~
12/02 21:47, 1F

12/02 21:58, , 2F
實測後非常成功~~~謝謝大大,果然是像大大說的
12/02 21:58, 2F

12/02 21:58, , 3F
有無數個timer在倒數,所以會變連發
12/02 21:58, 3F
文章代碼(AID): #1Id8rcKJ (Flash)
文章代碼(AID): #1Id8rcKJ (Flash)