
هذا الامتداد starling هو نهج لحل التنشيط المكاني 2D / إلغاء تنشيط كائنات اللعبة. من المفترض أن تعتني بعناصر الألعاب / إخفاءها خارج الشاشة على سبيل المثال ، ولكن ليس فقط ... ستتمكن من القيام بكل ما تريد بشكل أساسي مع كائن اللعبة عندما يُعتبر نشطًا أو غير نشط.
يمكن أن تكون هذه المكتبة مفيدة لك إذا:
لمزيد من التفاصيل حول التنفيذ ، يرجى إلقاء نظرة على الصفحة التجريبية.
جربه هنا!
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;
...
}ملاحظات مهمة:
سيساعدك وضع التصحيح على معرفة ما إذا كنت قد اخترت التكوين الصحيح (انظر الجوانب المهمة أدناه).
يمكنك تمكينها ببساطة مثل هذا:
_deactivator = new SpatialDeactivator( 32 , 32 , true ) ;
if ( _deactivator . debugSprite)
addChild ( _deactivator . debugSprite) ; ما عليك سوى استنساخ أو تنزيل المستودع ونسخ/لصق مجلد src/ch في دليل src الخاص بك أو إضافة المجلد src/ إلى مسار الفصل الخاص بك.
إحدى النقاط المهمة لجعل هذه الأداة فعالة بالنسبة لك هي العثور على حجم الجزء الصحيح لتناسب احتياجاتك.
يمكنك اختبار ومعرفة ما هو الأفضل لك من خلال تمكين وضع التصحيح (انظر القسم).
أنا شخصياً أستخدم نسبة 0.25 مقارنة بحجم المنطقة النشطة.
new SpatialDeactivator( _activeAreaAABB . width * 0.25 , _activeAreaAABB . height * 0.25 ) ;إذا كانت منطقتك النشطة تتوافق مع عرض الكاميرا ، فقد يكون استخدام الهامش مفيدًا لتنشيط كائنات اللعبة القادمة.
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 ) ;يجب أن يغطي حجم العنصر المكاني حجم كائن اللعبة الخاص بك للتأكد من أن كائن اللعبة لا يصبح غير نشط مبكرًا جدًا أو نشطًا مؤخرًا. إذا لزم الأمر ، يمكن أن يكون حجم عناصرك المكانية أكبر قليلاً من حدود كائنات اللعبة أيضًا:
_spatialElement . updateAABB( x - margin * 0.5 , y - margin * 0.5 , width + margin, height + margin) ;