HitTestObject i Actionscript 3.0

Permalänk
Medlem

HitTestObject i Actionscript 3.0

Hej!

Gör ett spel som projektarbete i gymnasiet och valde att använda mig av flash. Då ingen lärare på min skola tycks kunna detta språk vänder jag mig till er istället. Spelet går ut på att man ska komma så långt som möjligt som ett rymdskepp medan man undviker asteroider. Jag har lyckats få ihop allt med rörelse, slumpgenerator som spawnar asteroider, men nu stöter jag på problem när jag försöker lösa kollisionen. Jag kodar inte i frames utan i separata as filer(en för asteroiderna, en för skeppet osv.), och för nuvarande ser själva huvudscriptet ut som följande:

package com.asgamer.basics1
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;

public class Engine extends MovieClip
{

private var numStars:int = 80;
private var enemyList:Array = new Array();
private var ourShip:Ship;

public function Engine() : void
{
ourShip = new Ship(stage);
stage.addChild(ourShip);

ourShip.x = stage.stageWidth / 2;
ourShip.y = stage.stageHeight / 2;

for (var i:int = 0; i < numStars; i++)
{
stage.addChildAt(new Star(stage), stage.getChildIndex(ourShip));
}

addEventListener(Event.ENTER_FRAME, loop, false, 0, true);

}

private function loop(e:Event) : void
{
if (Math.floor(Math.random() * 10) == 5)
{
var enemy:Asteroid = new Asteroid(stage);
enemy.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemy, false, 0, true);
enemyList.push(enemy);

stage.addChild(enemy);
}
}

private function removeEnemy(e:Event)
{
enemyList.splice(enemyList.indexOf(e.currentTarget), 1);
}

}

}

Om någon av er skulle kunna hjälpa mig att få ett fungerande kollisionstest skulle jag vara väldigt tacksam!

Permalänk
Medlem

I din loop-metod placerar du lämpligtvis kollisionsdetekteringen.
Den bör lämpligtvis kalla på en checkCollisions()-metod som gör det.

Det finns flera olika sätt att göra själva kontrollen. Jag antar att det endast är skeppet som ska kunna kollidera med andra asteroider. Asteroiderna kan passera genom varandra? Loopa igenom hela din enemyList och kontrollera om någon av dessa kolliderar med ourShip.

Jag vet inte vad Ship och Asteroid är för objekt men du måste applicera korrekt kollisionsdetektering baserat på vad det är för "hitbox" för respektive objekt. Cirklar är ganska enkla om man kollar radien för objekten och avstånd mellan objekten.

Kollisionsdetektering är ganska resurskrävande. Speciellt eftersom det är en uträkning som oftast är en permutation av alla objekt. Det kan vara lämpligt att skapa en kollisionsrutmönster där du endast kontrollerar kollisioner mot objekt i respektive ruta så permutationerna blir färre.

Här är ett enkelt sätt att detektera kollision mellan två cirklar:
http://cgp.wikidot.com/circle-to-circle-collision-detection

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?