检测我的子弹和食物之间的碰撞

时间:2014-06-12 16:41:30

标签: flash actionscript collision detection

我正在制作这个游戏,我想检测我的子弹和食物之间的碰撞。 我不明白我怎样才能让我的食物对我的子弹做出反应并随之得分。

有人可以向我解释如何做到这一点或指向我某个方向。

stop();

import flash.events.MouseEvent;

// maak nieuw kanon aan
var Player:player = new player();

// set de coordinaten van het kanon
Player.x = 425;
Player.y = 540;

// creeer het kanon
addChild(Player);

var score = 0;
score_txt.text = score;


//functie pijltjes besturing
stage.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
function reportKeyDown(event:KeyboardEvent):void 
{ 
var i:int; 
var options_num:int = 3;

// coordinaten pijltje naar links
if(event.keyCode == 37)
{
    Player.x -= 50
}
// coordinaten pijltje naar rechts 
if(event.keyCode == 39)
{
    Player.x += 50
}
// coordinaten pijltje naar rechts 
if(event.keyCode == 32)
{
    shoot()
}

// gooi random het eten door de lucht :)
i = Math.round(Math.random() * (options_num-1) + 1);
if(i == 1)
{
    eten()
}
} 

// vork schieten
function shoot(e:Event = null):void {
// maak nieuw vork aan
var Bullet:bullet = new bullet();

// zet coordinaten van de vork hetzelfde als het kanon
Bullet.x = Player.x+6;
Bullet.y = Player.y-20;

// creeer de vork
addChild(Bullet);
Bullet.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
    // laat fork bewegen
    movebullet(e)

})
 }
// snelheid schieten vork
function movebullet(e:Event):void {
e.target.y -= 60;
if(e.target.y <= 50) {
    e.target.removeEventListener(e.type, movebullet);
}
}

// eten schieten
function eten(e:Event = null):void {
// maak nieuw vork aan
var foodArray = new Array(kip, hamburger, pizza, patat, ijs);
var nummer = Math.floor(Math.random() * foodArray.length);
var Eten:MovieClip = new foodArray[nummer];

// coordinaten van het eten
Eten.x = 750;
Eten.y = randomMinMax(30, 70);

// creeer eten
addChild(Eten);
Eten.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
    // laat fork bewegen
    gooieten(e)
})
}
// snelheid schieten eten
function gooieten(e:Event):void {
e.target.x -= 20;
e.target.y += 0;
if(e.target.x <= 50) {
    e.target.removeEventListener(e.type, gooieten);
}
}



// random getallen creeren (gebruikt bij schieten van verschillende soorten eten)
function randomMinMax(min:Number, max:Number):Number
{
 return min + (max - min) * Math.random();
}

1 个答案:

答案 0 :(得分:0)

您正在寻找的功能是hitTestObject()。但是,这需要对您的代码进行一些修改。

我们需要一种方法来在我们制作它们之后参考我们的子弹和食物。为此,我们将制作容器foodContainerbulletContainer。这些将分别容纳所有食物和子弹。

import flash.display.Sprite

var foodContainer:Sprite = new Sprite()
var bulletContainer:Sprite = new Sprite()
addChild(foodContainer)
addChild(bulletContainer)

我们始终对这些容器有可靠的引用,我们可以随时访问它们。现在,每当我们制作新的子弹或食物时,我们都会将其添加到容器中,而不是将其添加到舞台上。

function shoot(e:Event = null):void {
    // make new bullet
    var Bullet:bullet = new bullet();

    //set bullet coordinates
    Bullet.x = Player.x+6;
    Bullet.y = Player.y-20;

    // add the bullet TO THE BULLETCONTAINER
    bulletContainer.addChild(Bullet);
}

(我已将其改为英文)

function addFood(e:Event = null):void
{
    //make new food
    var foodArray = new Array(kip,hamburger,pizza,patat,ijs);
    var randomNumber = Math.floor(Math.random() * foodArray.length);
    var food:MovieClip = new foodArray[randomNumber];

    // set coordinate of food
    food.x = 750;
    food.y = randomMinMax(30,70);

    // add the food TO THE FOODCONTAINER
    foodContainer.addChild(food);   
}

好的,我们将所有资产存储在三件事上; bulletContainerfoodContainerstage(持有您的玩家)。addEventListener(Event.ENTER_FRAME,testCollision) function testCollision(e:Event = null) { //for each bullet in the bulletContainer... for (var i=0;i<=bulletContainer.numChildren-1;i++) { //and for each food in the foodContainer... for (var j=0;i<=foodContainer.numChildren-1;j++) { //we use getChildAt() to reference each child //(a bullet is a child of the bulletContainer; you get the idea) var targetBullet = bulletContainer.getChildAt(i) var targetFood = foodContainer.getChildAt(j) //heres the magic statement, hitTestObject() if (targetBullet.hitTestObject(targetFood) { //do some action to increase the score } } } } 。 现在我们可以设置碰撞处理

bulletContainer

在上面的代码中,对于foodContainer中的每个项目符号,我们会遍历hitTestObject()中的每个食物,并检查它们是否正在接触。 然后,我们用分数做任何你想做的事情,我们已经完成了!

但是,使用{{1}}有一些缺点。这个页面给出了解释原因。 http://code.tutsplus.com/tutorials/quick-tip-collision-detection-between-circles--active-10523