2012-12-13 110 views
1

我一直在Flash CS5中開發這款簡單的汽車遊戲。汽車必須避免汽車垂直上升並拿起硬幣。我有三種類型的硬幣,在拾取時增加1,2和3分。我的問題是,當我用汽車撞到硬幣時,它會通過汽車並給出更多的分數。我也有問題,到目前爲止,從舞臺上移除...這裏的代碼:Actionscript 3 Score score on hitTestObject

var spex:Number = 0; 
var spey:Number = 4; 
var score:uint; 
var cars:Array = new Array ; 
var db:Number = 2; 
var db_coins:Number = 1; 
var i:Number = 0; 
for (i=0; i<=db; i++) 
{ 
    var traffic_mc:MovieClip = new traffic ; 
    cars.push(addChild(traffic_mc)); 
    cars[i].x = -500 * Math.random(); 
    cars[i].y = Math.random() * 400; 
    trace(cars[i].y); 
} 

for (i=0; i<=db_coins; i++) 
{ 
    var coin_y:MovieClip = new coin_yellow ; 
    coin_y.x = -500 * Math.random(); 
    coin_y.y = Math.random() * 400; 
    addChild(coin_y); 
    var coin_r:MovieClip = new coin_red ; 
    coin_y.x = -500 * Math.random(); 
    coin_y.y = Math.random() * 400; 
    addChild(coin_r); 
    var coin_b:MovieClip = new coin_blue ; 
    coin_b.x = -500 * Math.random(); 
    coin_b.y = Math.random() * 400; 
    addChild(coin_b); 
} 

stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown); 
function keydown(k:KeyboardEvent):void 
{ 
    if (k.keyCode == 37) 
    { 
     spex -= 4; 

    } 
    if (k.keyCode == 39) 
    { 
     spex += 4; 
    } 
} 
stage.addEventListener(Event.ENTER_FRAME, go); 
function go(e:Event):void 
{ 
    this.auto.x += spex; 
    if (this.auto.x < 25) 
    { 
     this.auto.x = 25; 
     spex = 0; 
    } 
    if (this.auto.x > 286) 
{ 
    this.auto.x = 286; 
    spex = 0; 
    } 
    for (i=0; i<=db; i++) 
    { 
     if (cars[i].hitTestObject(this.auto)) 
     { 
      trace("GAME OVER"); 
      stage.removeEventListener(KeyboardEvent.KEY_DOWN, keydown); 
      stage.removeEventListener(Event.ENTER_FRAME, go); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, retry); 
     } 
     cars[i].y += spey; 
     if (cars[i].y > 600) 
     { 
      cars[i].y = -50; 
      cars[i].x = Math.random() * 251; 
     } 
    } 

    for (i=0; i<=db_coins; i++) 
    { 
     if (coin_y.hitTestObject(this.auto)) 
     { 
      score += 1; 
      updateScore(); 
     } 
     coin_y.y += spey-2; 
     if (coin_y.y > 600) 
     { 
      coin_y.y = -50; 
      coin_y.x = Math.random() * 251; 
     } 
     if (coin_r.hitTestObject(this.auto)) 
     { 
      score += 2; 
      updateScore(); 
     } 
     coin_r.y += spey-2; 
     if (coin_r.y > 600) 
     { 
      coin_r.y = -50; 
      coin_r.x = Math.random() * 251; 
     } 
     if (coin_b.hitTestObject(this.auto)) 
     { 
      score += 3; 
      updateScore(); 
     } 
     coin_b.y += spey-2; 
     if (coin_b.y > 600) 
     { 
      coin_b.y = -50; 
      coin_b.x = Math.random() * 251; 
     } 
    } 
} 

stage.addEventListener(KeyboardEvent.KEY_DOWN, retry); 
function retry(k:KeyboardEvent):void 
{ 
    if (k.keyCode == 32) 
    { 
     stage.addEventListener(Event.ENTER_FRAME, go); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown); 
     for (i=0; i<=db; i++) 
     { 
      cars[i].y = -300 * Math.random(); 
      cars[i].x = Math.random() * 251; 
     } 

     for (i=0; i<=db_coins; i++) 
     { 
      coin_y.y = -300 * Math.random(); 
      coin_y.x = Math.random() * 251; 
      coin_r.y = -300 * Math.random(); 
      coin_r.x = Math.random() * 251; 
      coin_b.y = -300 * Math.random(); 
      coin_b.x = Math.random() * 251; 
     } 
     spex = 0; 
     spey = 4; 
     score = 0; 
     scorecounter.text = "Score: " + score.toString(); 
    } 
} 

//Scorecount 

function init():void 
{ 
    score = 0; 
    scorecounter.text = "Score: " + score.toString(); 
} 

function updateScore():void 
{ 
    scorecounter.text = "Score: " + score.toString(); 
} 

init(); 
+1

不清楚「db_coins」是什麼,以及爲什麼循環通過它(但從未使用迭代變量「i」)。你可以附加一個截圖嗎?無論如何,解決方案是在擊中時從舞臺上移除一枚硬幣。 – Teejay

+0

不錯的邏輯,upvoted。 – kvasirr

回答

0

我想你應該創建一個像hited一個變量:布爾和檢查先打。發生硬幣問題是因爲硬幣沒有一次擊中,它會擊中一段時間​​,導致你移動它的每一幀,並隨着它再次擊中它的移動。所以你必須檢查它並做出適當的「if-else」條件。

+0

這是另一個很好的解決方案......但通常硬幣在遊戲中消失時拾起:) – Teejay

+0

感謝您的答案,但我找到了解決方案! :) 只需將它從舞臺上移開即可。 coin_y.x = -1000; – fviktor99

+1

您可以使用removeChild()從舞臺上移除硬幣精靈顯示對象,否則您可能會在x = -1000處「堆積」硬幣。 – mitim

0

有一個比你決定使用的更好的解決方案。 spex是你用來滾動遊戲的變量。當你在汽車上運行hitTestObject時,只需將spex = 0;這會阻止遊戲死亡。

我同意mitim將removeChild()用於硬幣,而不是將它們放在舞臺上。