
Diese Starling -Erweiterung ist ein Ansatz zur Lösung von 2D -räumlichen Aktivierung / Deaktivierung von Spielobjekten. Es soll sich darum kümmern, Spielelemente zu zeigen / versteckt, die zum Beispiel außerhalb des Bildschirms liegen, aber nicht nur ... Sie werden im Grunde genommen mit einem Spielobjekt tun können, wenn es als aktiv oder inaktiv angesehen wird.
Diese Bibliothek könnte für Sie nützlich sein, wenn:
Weitere Informationen zur Implementierung finden Sie in der Demo -Seite.
Versuchen Sie es hier!
GameManager : private var _deactivator : SpatialDeactivator ;
private var _activeAreaAABB : Rectangle = new Rectangle ( 0 , 0 , 120 , 80 ) ;
public function MyGameManager()
{
// Create the spatial deactivator
_deactivator = new SpatialDeactivator(_activeAreaAABB.width * 0.25, _activeAreaAABB.height * 0.25);
Starling.current.juggler.add(_deactivator);
}
// Called at each frame...
public function update () : void
{
// Update active area when needed
_activeAreaAABB.x = ...; // Your complex stuff here
_activeAreaAABB.y = ...; // Your complex stuff here
_activeAreaAABB.width = ...; // Your complex stuff here
_activeAreaAABB.height = ...; // Your complex stuff here
// IMPORTANT TIP: Update only if AABB has changed!
_deactivator.updateActiveArea(_activeAreaAABB);
}
public function get deactivator() : SpatialDeactivator
{
return _deactivator;
}GameObject : private var _spatialElement : SpatialElement ;
public function MyGameObject(gameManager : MyGameManager)
{
// Setup game object core components
_mySprite = ...;
_myPhysicalBody = ...;
// IMPORTANT: Make sure that the object starts inactive!
// The deactivator will take care of activating it right away if needed.
onSpatialElementActivityChanged(false);
// Create spatial element
_spatialElement = new SpatialElement(gameManager.deactivator);
_spatialElement.activityChangedCallback = onSpatialElementActivityChanged;
// Initial position update
updatePosition();
}
// Called during frame update...
public function updatePosition() : void
{
// Update game object position & size
x = ...; // Your complex stuff here
y = ...; // Your complex stuff here
width = ...; // Your complex stuff here
height = ...; // Your complex stuff here
// IMPORTANT TIP: Update only if AABB has changed!
_spatialElement.updateAABB(x, y, width, height);
}
private function onSpatialElementActivityChanged( active : Boolean ) : void
{
// Activate / deactivate your object as you want.
_mySprite.visible = active;
_myPhysicalBody.enable = active;
...
}Wichtige Anmerkungen:
Mit dem Debug -Modus können Sie feststellen, ob Sie die richtige Konfiguration ausgewählt haben (siehe wichtige Aspekte unten).
Sie können es einfach so aktivieren:
_deactivator = new SpatialDeactivator( 32 , 32 , true ) ;
if ( _deactivator . debugSprite)
addChild ( _deactivator . debugSprite) ; Klonen oder laden Sie das Repository herunter und kopieren Sie den src/ch -Ordner in Ihr src -Verzeichnis oder fügen Sie den src/ Ordner Ihrem Klassenpfad hinzu.
Ein wichtiger Punkt, um dieses Tool für Sie effizient zu machen, besteht darin, die richtige Chunk -Größe zu finden, die am besten zu Ihren Anforderungen passt.
Sie können testen und sehen, was für Sie am besten ist, indem Sie den Debug -Modus aktivieren (siehe Abschnitt).
Ich persönlich verwende ein Verhältnis von 0.25 im Vergleich zur aktiven Flächengröße.
new SpatialDeactivator( _activeAreaAABB . width * 0.25 , _activeAreaAABB . height * 0.25 ) ;Wenn Ihr aktiver Bereich der Kameraansicht entspricht, kann die Verwendung von Rand nützlich sein, um die Aktivierung der kommenden Spielobjekte zu antizipieren.
private var _margin : Number = 20 ;
private var _activeAreaAABB : Rectangle = new Rectangle ( 0 , 0 , 120 + _margin , 80 + _margin ) ;
...
_activeAreaAABB . x = x - _margin * 0.5 ;
_activeAreaAABB . y = y - _margin * 0.5 ;
deactivator . updateActiveArea( _activeAreaAABB ) ;Die Größe eines räumlichen Elements sollte die gesamte Größe Ihres Spielobjekts abdecken, um sicherzustellen, dass das Spielobjekt in letzter Zeit nicht zu früh oder aktiv inaktiv wird. Bei Bedarf kann die Größe Ihrer räumlichen Elemente etwas größer sein als Ihre Spielobjekte Grenzen:
_spatialElement . updateAABB( x - margin * 0.5 , y - margin * 0.5 , width + margin, height + margin) ;