2011-08-11 33 views
0

我的目標是每次點擊船上都會發射子彈。事實上,發生的事情是,如果我點擊一次,子彈就會被擊中,但如果在第一顆子彈離開屏幕之前兩次點擊它,第一個子彈就會停止(它不會消失,只會停止)第二顆子彈被擊中。AS3中的事件流 - 拍攝子彈

public var ship:Ship = new Ship(); 
public var bullet:Bullet = new Bullet(); 

stage.addChild(ship); 


ship.addEventListener(MouseEvent.CLICK, shoot); 

function shoot(e:MouseEvent):void 
{ 

    stage.addEventListener(Event.ENTER_FRAME, bulletflies); 

} 

function bulletflies(e:Event):void 
{ 

    stage.addChild(bullet); 
    bullet.y -= 5; 
} 
+0

問題是什麼? –

+0

那麼,如果子彈在屏幕中間停下來,當我拍攝另一顆子彈時,是因爲我犯了一些錯誤。 – Daniel

+1

使用上面的代碼只有一次子彈的實例將存在。既然你說在屏幕上可以有兩顆子彈,我假設你已經遺漏了代碼,你不斷創造更多的子彈? – Allan

回答

2

設置爲它自己的類中的子彈,並有一流的循環運動在它自己的:

public class Bullet extends Sprite { 
    public function Bullet(ship:Ship) { 
     // this assumes that you've also set "Ship" up as it's own class 

     this.x = ship.x; 
     this.y = ship.y; 

     this.addEventListener(Event.ENTER_FRAME, this.enterFrameHandler); 
    } 

    private function enterFrameHandler(event:Event):void { 
     this.y -= 1; 
     // destroy this clip when it's outside of the stage - better mem managament 
     if(this.y < 0 || this.y > this.stage.stageHeight) { 
      this.removeEventListener(Event.ENTER_FRAME, this.enterFrameHandler); 
      this.parent.removeChild(this); 
     } 
    } 
} 

在你的船級,改變你的拍攝功能:

function shoot(e:MouseEvent):void { 
    this.addChild(new Bullet(this)); 
} 

將Ship作爲一個班級和Bullet作爲另一個班級是很好的做法。這樣每個對象都在照顧它是自己的。此外,如果你最終不得不EnemyBullet然後就可以開始使用繼承多態性(我敢打賭,你一定會喜歡這些,一旦你瞭解它們)。

+2

非常好,除了我不喜歡每個子彈擁有自己的ENTER_FRAME的想法 - 應該*真的*有一個step()函數爲所有的對象,並調用它的每個對象在main() – Marty

0

這是因爲你只有1顆子彈。

可以創建子彈的陣列,因此改變

public var bullet:Bullet = new Bullet(); 

public var bullets:Array = []; 

然後,

ship.addEventListener(MouseEvent.CLICK, shoot); 

function shoot(e:MouseEvent):void 
{ 

    var b:Bullet=new Bullet(); 
    b.addEventListener(Event.ENTER_FRAME, bulletflies); 
    stage.addChild(b); 
    bullets.push(b); 

} 

function bulletflies(e:Event):void 
{ 
    e.currentTarget.y -= 5; 
    if(e.currentTarget.y < 0 || e.currentTarget.y > stage.height) { 
    stage.removeChild(e.currentTarget); 
    bullets.splice(bullets.indexOf(e.currentTarget), 1); 
    } 
} 

- 編輯 -

響應於您的評論

我不喜歡有它自己的ENTER_FRAME

添加一行stage.addEventListener(Event.ENTER_FRAME, bulletflies);ship.addEventListener(MouseEvent.CLICK, shoot);

刪除b.addEventListener(Event.ENTER_FRAME, bulletflies);

,並更改事件處理程序,以每顆子彈的想法這樣的:

function bulletflies(e:Event):void 
{ 
    for each(var b:Bullet in bullets) { 
    b.y -= 5; 
    if(b.y < 0 || b.y > stage.height) { 
     stage.removeChild(b); 
     //bullets.splice(bullets.indexOf(b), 1); 
    } 
    } 
}