2012-12-13 111 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()用于硬币,而不是将它们放在舞台上。