我正在制作这个游戏,我想检测我的子弹和食物之间的碰撞。 我不明白我怎样才能让我的食物对我的子弹做出反应并随之得分。
有人可以向我解释如何做到这一点或指向我某个方向。
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();
}
答案 0 :(得分:0)
您正在寻找的功能是hitTestObject()
。但是,这需要对您的代码进行一些修改。
我们需要一种方法来在我们制作它们之后参考我们的子弹和食物。为此,我们将制作容器foodContainer
和bulletContainer
。这些将分别容纳所有食物和子弹。
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);
}
好的,我们将所有资产存储在三件事上; bulletContainer
,foodContainer
和stage
(持有您的玩家)。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