
Ekstensi Starling ini adalah pendekatan untuk menyelesaikan aktivasi spasial 2D / penonaktifan objek game. Ini dimaksudkan untuk menjaga elemen game menunjukkan / menyembunyikan yang berada di luar layar misalnya, tetapi tidak hanya ... Anda pada dasarnya dapat melakukan apa pun yang Anda inginkan dengan objek game ketika dianggap aktif atau tidak aktif.
Perpustakaan ini bisa berguna untuk Anda jika:
Untuk perincian lebih lanjut tentang implementasi, harap lihat halaman demo.
Cobalah di sini!
GameManager Anda: 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 Anda: 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;
...
}Catatan Penting:
Mode debug akan membantu Anda untuk melihat apakah Anda telah memilih konfigurasi yang tepat (lihat aspek -aspek penting di bawah).
Anda dapat mengaktifkannya seperti ini:
_deactivator = new SpatialDeactivator( 32 , 32 , true ) ;
if ( _deactivator . debugSprite)
addChild ( _deactivator . debugSprite) ; Cukup klon atau unduh repositori dan salin/tempel folder src/ch ke direktori src Anda atau tambahkan folder src/ ke jalur kelas Anda.
Salah satu poin penting untuk membuat alat ini efisien bagi Anda adalah menemukan ukuran chunk yang benar sesuai dengan kebutuhan Anda.
Anda dapat menguji & melihat apa yang terbaik untuk Anda dengan mengaktifkan mode debug (lihat bagian).
Saya pribadi menggunakan rasio 0.25 dibandingkan dengan ukuran area aktif.
new SpatialDeactivator( _activeAreaAABB . width * 0.25 , _activeAreaAABB . height * 0.25 ) ;Jika area aktif Anda sesuai dengan tampilan kamera, menggunakan margin dapat berguna untuk mengantisipasi aktivasi objek game yang akan datang.
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 ) ;Ukuran elemen spasial harus mencakup seluruh ukuran objek game Anda untuk memastikan bahwa objek game tidak menjadi tidak aktif terlalu dini atau aktif akhir -akhir ini. Jika diperlukan, ukuran elemen spasial Anda bisa sedikit lebih besar dari batas objek game Anda juga:
_spatialElement . updateAABB( x - margin * 0.5 , y - margin * 0.5 , width + margin, height + margin) ;