
Cette extension Starling est une approche pour résoudre l'activation spatiale 2D / désactivation des objets de jeu. Il est censé prendre soin de montrer / cacher des éléments de jeu qui sont en dehors de l'écran par exemple, mais pas seulement ... vous pourrez essentiellement faire ce que vous voulez avec un objet de jeu lorsqu'il est considéré comme actif ou inactif.
Cette bibliothèque pourrait vous être utile si:
Pour plus de détails sur la mise en œuvre, veuillez consulter la page de démonstration.
Essayez-le ici!
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;
...
}Remarques importantes:
Le mode de débogage vous aidera à voir si vous avez choisi la bonne configuration (voir les aspects importants ci-dessous).
Vous pouvez l'activer simplement comme ceci:
_deactivator = new SpatialDeactivator( 32 , 32 , true ) ;
if ( _deactivator . debugSprite)
addChild ( _deactivator . debugSprite) ; Il suffit de cloner ou de télécharger le référentiel et de copier / coller le dossier src/ch dans votre répertoire src ou d'ajouter le dossier src/ à votre chemin de classe.
Un point important pour rendre cet outil efficace pour vous est de trouver la bonne taille de morceau pour s'adapter au mieux à vos besoins.
Vous pouvez tester et voir ce qui est le meilleur pour vous en activant le mode de débogage (voir la section).
J'utilise personnellement un rapport de 0.25 par rapport à la taille active de la zone.
new SpatialDeactivator( _activeAreaAABB . width * 0.25 , _activeAreaAABB . height * 0.25 ) ;Si votre zone active correspond à la vue de la caméra, l'utilisation de la marge pourrait être utile pour anticiper l'activation des objets de jeu à venir.
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 ) ;La taille d'un élément spatial devrait couvrir toute la taille de votre objet de jeu pour vous assurer que l'objet de jeu ne devient pas trop tôt ou actif trop ces derniers temps. Si nécessaire, la taille de vos éléments spatiaux peut également être un peu plus grande que vos objets de jeu:
_spatialElement . updateAABB( x - margin * 0.5 , y - margin * 0.5 , width + margin, height + margin) ;