【问题标题】:Issues With hitTestObject in ActionScript 3ActionScript 3 中的 hitTestObject 问题
【发布时间】:2013-03-23 04:11:35
【问题描述】:

我只是试图循环遍历子弹和敌人数组的两个数组,然后我对两者都执行 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");
                }
        }
    }
}

`

【问题讨论】:

  • 我意识到我的错误是在调用 shootPressed 时调用了该函数,但现在我将其更改为运行每一帧并且该函数是否传递了 e:Event 的参数并得到错误 --- TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 Game_fla::MainTimeline/testCollisions()[Game_fla.MainTimeline::frame1:199]-----------我该如何解决这个问题?

标签: actionscript-3 flash actionscript action


【解决方案1】:

看起来您只是在按下拍摄按钮时检查碰撞,这可以解释为什么它没有快速发生。我怀疑你想每帧都运行testCollisions

stage.addEventListener(Event.ENTER_FRAME, testCollisions);

【讨论】:

  • 是的,我真的很沮丧,想了想,我在按下拍摄时打电话给它,解决了,谢谢...现在问题是我收到错误 TypeError: Error #1009: Cannot访问空对象引用的属性或方法。在 Game_fla::MainTimeline/testCollisions()[Game_fla.MainTimeline::frame1:199]
  • 我得到这个错误可能是因为 testcollision 函数的参数是 e:Event??也许
  • 哦,是的,大概就是这样,解决了吗?
  • 现在我看,可能是因为你的bullets 数组一开始没有被初始化。我会将第 28 行更改为 var bullets:Array = new Array();,然后决定是否每次都在 fireBullet() 中重新创建它。
  • 是的,解决了,谢谢。你介意我是否可以将你链接到另一个问题,看看你是否可以帮助我,我不知道我的方式,所以除了开始一个新问题之外,我不知道如何再次发布我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多