Wieder trivial: Wenn die x- und y-koordinaten übereinander liegen. Frage: Welche x- und y-koordinaten?
Langsam wird einem bewusst, dass Kollision doch schwieriger ist als man es zuerst vermutet. Gerade bei Actionscript gibt es ziemlich viele Tutorials für Kollision, die alle mehr oder weniger funktionieren aber auch früher oder später über die Kollision mit unregelmäßigen Objekten stolpern. Hier würde ich eine Methode, die ich mal in einem Spielprogrammierungsbuch gelesen habe, empfehlen: Man teilt den Körper in einzelne Kollisionsquadrate ein. Kümmern wir uns aber nun um eine Methode, die ich von den bestehenden ausgehend entwickelt habe, die bei einer Stage mit vielen Objekten sehr effektiv arbeitet.
Theorie:
- Kollisionsobjekte sind in einem eigenen Array gespeichert
- zu jedem Kollisionsobjekt gibt es ein extra Objekt, dass alle Positionsdaten enthält
- wir prüfen erst grob etwas kollidiert oder nicht
- wenn es eine Kollision gibt, dann wird die Kollision fein geprüft, ob die Kollision auch wirklich stattfindet
Praxis:
Array mit Kollisionsobjekten:
var _stage:Array
Kollisionsdaten Objekt:
class StageDatas
{
private var _x:int;
private var _y:int;
private var _index:int;
public function StageDatas(index:int, x:int, y:int)
{
_x = x;
_y = y;
_index = index;
}
public function get x():int
{
return _x;
}
public function get y():int
{
return _y;
}
public function get index():int
{
return _index;
}
public function set x(x:int):void
{
_x = x;
}
public function set y(y:int):void
{
_y = y;
}
public function set index(index:int):void
{
_index = index;
}
}
Grobe Kollisionskontrolle
var hitObject:Sprite;
var data:StageDatas;
for(var i:int = 0; i < _stage.length; i++)
{
hitObject = _stage[i];
if(!_activeObject.LastHit.hitTestPoint(_activePic.x + wOff,
_activePic.y + hOff, true) ||
!_activeObject.LastHit.hitTestPoint(_activePic.x +
_activePic.width + wOff, _activePic.y + hOff,
true))
{
//hier euren Code, wenn keine Kollision stattfindet
}
else
{
//hier kommt noch mehr Code
}
}
Feine Kollisionsprüfung
else
{
for(var i:int = 0; i < _stage.length; i++)
{
hitObject = _stage[i];
if(_activeObject.LastHit != hitObject)
{
data = _stageData[i];
if((_activeObject.LeftCollision.x == data.x + hitObject.width ||
_activeObject.LeftCollision.x + leftOff == data.x + hitObject.width) &&
_activeObject.LeftCollision.y >= data.y && _player.dx < 0)
{
//hier der Code
}
else if((_activeObject.RightCollision.x == data.x ||
_activeObject.RightCollision.x + rightOff == data.x) &&
_activeObject.RightCollision.y >= data.y && _activeObject.dx > 0)
{
//hier der Code
}
}
}
}
Damit haben wir uns eine einfache Kollisionserkennung gebaut. Wie immer ohne Funktionsgarantie und auf eigene Verantwortung. Beim nächsten mal werde ich für euch eine Playerklasse aufziehen.
Wie immer viel Spaß damit.