2013-03-23 76 views
0

我只是想通過兩個數組循環兩個數組的子彈和敵人數組,然後我對兩個執行hitTestObject,但似乎無法工作,直到敵人變得非常接近玩家或子彈。 這裏是我的代碼遺憾的是,我的代碼是馬虎`在ActionScript 3中的hitTestObject的問題

// ******* IMPORTS ***** 
import flash.events.MouseEvent; 
import flash.events.Event; 
import flash.events.KeyboardEvent; 
import flash.events.MouseEvent; 
import flash.display.MovieClip; 
import flash.events.KeyboardEvent; 

//*****VARIABLES**** 

var leftPressed:Boolean = false; 
var rightPressed:Boolean = false; 
var upPressed:Boolean = false; 
var shootDown:Boolean = false; 

var ySpeed:int = 0; 
var xSpeed:int = 0; 

var scrollX:int = 0; 
var scrollY:int = 0; 

var speedConstant:int = 5; 

var friction:Number = 0.6; 

var level:Number = 1; 

var bullets:Array; 
var container_mc:MovieClip; 
var enemies:Array; 
var tempEnemy:MovieClip; 


// BUTTON EVENTS EITHER CLICKED OR NOT 

left_btn.addEventListener(MouseEvent.MOUSE_DOWN, moveLeft); 
right_btn.addEventListener(MouseEvent.MOUSE_DOWN, moveRight); 
up_btn.addEventListener(MouseEvent.MOUSE_DOWN, moveUp); 
shoot_btn.addEventListener(MouseEvent.MOUSE_DOWN, shootPressed); 

left_btn.addEventListener(MouseEvent.MOUSE_UP, leftUp); 
right_btn.addEventListener(MouseEvent.MOUSE_UP, rightUp); 
up_btn.addEventListener(MouseEvent.MOUSE_UP, upUp); 

stage.addEventListener(Event.ENTER_FRAME, makeEnemies); 



player.gotoAndStop('still'); 


stage.addEventListener(Event.ENTER_FRAME,onenter); 

function onenter(e:Event):void{ 
    if (rightPressed == true && leftPressed == false){ 
     player.x += 8; 
     player.scaleX = 1; 
     player.gotoAndStop("walking"); 
     cloud.x -= 8; 


    } else if (leftPressed == true && rightPressed == false){ 
     player.x -= 8; 
     player.scaleX = -1; 
     player.gotoAndStop('walking'); 
     cloud.x += 8; 

    } else if(upPressed == true && leftPressed == false && rightPressed == false){ 


     } 
     else{ 
     rightPressed = false; 
     leftPressed = false; 
     player.gotoAndStop('still')} 

} 
// **** MOVEMENT CONTROLS ********* 



function shootPressed(e:MouseEvent):void{ 
    shootDown = true; 
    if(shootDown == true){ 
     fireBullet(); 
     testCollisions(); 
     } 

    } 


function fireBullet():void 
{ 
    var playerDirection:String; 
    if(player.scaleX < 0){ 
     playerDirection = "left"; 
    } else if(player.scaleX > 0){ 
     playerDirection = "right"; 
    } 
    var bullet:Bullet = new Bullet(player.x, player.y, playerDirection); 
    bullets = new Array(); 
    bullet.y = 288; 
    stage.addChild(bullet); 
    bullets.push(bullet); 
    trace(bullets); 

} 

// BUTTON FUNCTIONS 

function moveLeft(e:MouseEvent):void 
{ 
    if(MouseEvent.MOUSE_DOWN){ 
    leftPressed = true; 
    }else if (MouseEvent.MOUSE_UP) { 
     leftPressed = false; 
     } 

} 
function moveRight(e:MouseEvent):void 
{ 
    if (MouseEvent.MOUSE_DOWN){ 
    rightPressed = true; 
    }else if (MouseEvent.MOUSE_UP){ 
     rightPressed = false; 
     } 

} 
function moveUp(e:MouseEvent):void 
{ 
    if(MouseEvent.MOUSE_DOWN){ 
     upPressed = true; 
     } else if (MouseEvent.MOUSE_UP) { 
      upPressed = false; 
      } 

} 



function leftUp(e:MouseEvent):void 
{ 
    leftPressed = false; 
} 
function rightUp(e:MouseEvent):void 
{ 
    rightPressed = false; 
} 
function upUp(e:MouseEvent):void 
{ 
    upPressed = false; 
} 




enemies = new Array(); 

//Call this function for how many enemies you want to make... 
function makeEnemies(e:Event):void 
{ 
    var chance:Number = Math.floor(Math.random() * 60); 
if (chance <= 2){ 

    //Make sure a Library item linkage is set to Enemy... 
    tempEnemy = new enemy(); 
    tempEnemy.speed = 80; 
    tempEnemy.x = Math.round(Math.random() * stage.stageWidth) * -10; 
    addChild(tempEnemy); 
    enemies.push(tempEnemy); 
    moveEnemies(); 
    } 
} 


function moveEnemies():void 
{ 
    var tempEnemy:MovieClip; 
    for (var i:int =enemies.length-1; i>=0; i--) 
    { 
     tempEnemy = enemies[i]; 
     tempEnemy.x += tempEnemy.speed; 
     tempEnemy.y = 285; 
    } 
} 



//Check for collisions between an enemies array and a Lasers array 
function testCollisions():void 
{ 

    var tempEnemy:MovieClip; 
    var tempLaser:MovieClip; 

    Enemy:for (var i:int=enemies.length-1; i >= 0; i--) 
    { 
     tempEnemy = enemies[i]; 
     for (var j:int=bullets.length-1; j>=0; j--) 
     { 
      tempLaser = bullets[j]; 
      if (tempLaser.hitTestObject(tempEnemy)) 
      { 
       removeChild(tempEnemy); 
       trace("BULLET HIT"); 
       break Enemy; 
      } else if(tempEnemy.hitTestObject(player)){ 
       removeChild(tempEnemy); 
       trace("HIT PLAYER"); 
       } 
     } 
    } 
} 

`

+0

我意識到自己的錯誤,我叫當shootPressed被調用的函數,但現在我改變了它運行的每一幀,也做了功能通過E的參數:事件並得到錯誤--- TypeError:錯誤#1009:無法訪問空對象引用的屬性或方法。 \t at Game_fla :: MainTimeline/testCollisions()[Game_fla.MainTimeline :: frame1:199] -----------我該如何解決這個問題? – AlanZ2223 2013-03-23 04:43:49

回答

0

看起來好像當按下拍攝按鈕,這可以解釋爲什麼它不會很快發生的事情你只是碰撞檢測。我懷疑你想運行testCollisions不是每幀:

stage.addEventListener(Event.ENTER_FRAME, testCollisions); 
+0

是的我真的很沮喪,想到這一點,我在拍攝時按下它,並解決它謝謝你...現在的問題是我得到一個錯誤TypeError:錯誤#1009:無法訪問屬性或方法的一個空對象引用。 \t at Game_fla :: MainTimeline/testCollisions()[Game_fla.MainTimeline :: frame1:199] – AlanZ2223 2013-03-23 04:40:20

+0

我得到這個錯誤可能是因爲testcollision函數的參數是e:Event?也許 – AlanZ2223 2013-03-23 04:40:52

+0

哦,是的,這可能是它,它解決了嗎? – 2013-03-23 04:42:41