-
-
Notifications
You must be signed in to change notification settings - Fork 74
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
19 changed files
with
661 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,158 @@ | ||
package ktx.ashley | ||
|
||
import com.badlogic.ashley.core.Engine | ||
import com.badlogic.ashley.core.Entity | ||
import com.badlogic.ashley.core.EntityListener | ||
import com.badlogic.ashley.core.Family | ||
import com.badlogic.ashley.systems.IntervalIteratingSystem | ||
import com.badlogic.ashley.systems.IteratingSystem | ||
import com.badlogic.ashley.systems.SortedIteratingSystem | ||
|
||
/** | ||
* An [EntityListener] only requiring an implementation of the [entityAdded] method. | ||
* | ||
* An empty implementation is provided for the [entityRemoved] method. By default, the entity removal event is ignored. | ||
* | ||
* To handle more types of events, consider implementing [EntityListener] directly. | ||
*/ | ||
interface EntityAdditionListener : EntityListener { | ||
/** | ||
* Invoked when a matching [Entity] is added to the [Engine]. | ||
* | ||
* See [EntityListener.entityAdded]. | ||
*/ | ||
override fun entityAdded(entity: Entity) | ||
|
||
override fun entityRemoved(entity: Entity) = Unit | ||
} | ||
|
||
/** | ||
* An [EntityListener] only requiring an implementation of the [entityRemoved] method. | ||
* | ||
* An empty implementation is provided for the [entityAdded] method. By default, the entity addition event is ignored. | ||
* | ||
* To handle more types of events, consider implementing [EntityListener] directly. | ||
*/ | ||
interface EntityRemovalListener : EntityListener { | ||
/** | ||
* Invoked when a matching [Entity] is removed from the [Engine]. | ||
* | ||
* See [EntityListener.entityRemoved]. | ||
*/ | ||
override fun entityRemoved(entity: Entity) | ||
|
||
override fun entityAdded(entity: Entity) = Unit | ||
} | ||
|
||
// A family that matches any entity in the engine. Used to make Family an optional parameter in the API. | ||
@PublishedApi internal val anyFamily = Family.all().get() | ||
|
||
/** | ||
* Adds an [EntityAdditionListener] to this [Engine] and returns a reference to the new listener instance. | ||
* The listener calls [onAdded] lambda every time an entity addition event is triggered. | ||
* | ||
* The [family] parameter allows targeting a specific subset of entities. By default, [anyFamily] is used, | ||
* matching every entity within the engine. | ||
* | ||
* The [priority] argument affects the order in which the listeners are triggered. Lower value means higher | ||
* priority. | ||
* | ||
* To remove this [EntityListener] from the [Engine] afterwards, retain the reference returned by | ||
* this method and pass it to [Engine.removeEntityListener]. | ||
*/ | ||
inline fun Engine.onEntityAdded( | ||
family: Family = anyFamily, | ||
priority: Int = 0, | ||
crossinline onAdded: (entity: Entity) -> Unit | ||
): EntityAdditionListener { | ||
val listener = object : EntityAdditionListener { | ||
override fun entityAdded(entity: Entity) { | ||
onAdded.invoke(entity) | ||
} | ||
} | ||
|
||
addEntityListener(family, priority, listener) | ||
return listener | ||
} | ||
|
||
/** | ||
* Adds an [EntityRemovalListener] to this [Engine] and returns a reference to the new listener instance. | ||
* The listener calls [onRemoved] lambda every time an entity addition event is triggered. | ||
* | ||
* The [family] parameter allows targeting a specific subset of entities. By default, [anyFamily] is used, | ||
* matching every entity within the engine. | ||
* | ||
* The [priority] argument affects the order in which the listeners are triggered. Lower value means higher | ||
* priority. | ||
* | ||
* To remove this [EntityListener] from the [Engine] afterwards, retain the reference returned by this method | ||
* and pass it to [Engine.removeEntityListener]. | ||
*/ | ||
inline fun Engine.onEntityRemoved( | ||
family: Family = anyFamily, | ||
priority: Int = 0, | ||
crossinline onRemoved: (entity: Entity) -> Unit | ||
): EntityRemovalListener { | ||
val listener = object : EntityRemovalListener { | ||
override fun entityRemoved(entity: Entity) { | ||
onRemoved.invoke(entity) | ||
} | ||
} | ||
|
||
addEntityListener(family, priority, listener) | ||
return listener | ||
} | ||
|
||
/** | ||
* A wrapper for [Engine.onEntityAdded] that uses this [IteratingSystem]'s [Family] | ||
* as a filter for the [EntityAdditionListener]. | ||
*/ | ||
inline fun IteratingSystem.onEntityAdded( | ||
priority: Int = 0, | ||
crossinline onAdded: (entity: Entity) -> Unit | ||
): EntityAdditionListener = engine.onEntityAdded(family, priority, onAdded) | ||
|
||
/** | ||
* A wrapper for [Engine.onEntityRemoved] that uses this [IteratingSystem]'s [Family] | ||
* as a filter for the [EntityRemovalListener]. | ||
*/ | ||
inline fun IteratingSystem.onEntityRemoved( | ||
priority: Int = 0, | ||
crossinline onRemoved: (entity: Entity) -> Unit | ||
): EntityRemovalListener = engine.onEntityRemoved(family, priority, onRemoved) | ||
|
||
/** | ||
* A wrapper for [Engine.onEntityAdded] that uses this [IntervalIteratingSystem]'s [Family] | ||
* as a filter for the [EntityAdditionListener]. | ||
*/ | ||
inline fun IntervalIteratingSystem.onEntityAdded( | ||
priority: Int = 0, | ||
crossinline onAdded: (entity: Entity) -> Unit | ||
): EntityAdditionListener = engine.onEntityAdded(family, priority, onAdded) | ||
|
||
/** | ||
* A wrapper for [Engine.onEntityRemoved] that uses this [IntervalIteratingSystem]'s [Family] | ||
* as a filter for the [EntityRemovalListener]. | ||
*/ | ||
inline fun IntervalIteratingSystem.onEntityRemoved( | ||
priority: Int = 0, | ||
crossinline onRemoved: (entity: Entity) -> Unit | ||
): EntityRemovalListener = engine.onEntityRemoved(family, priority, onRemoved) | ||
|
||
/** | ||
* A wrapper for [Engine.onEntityAdded] that uses this [SortedIteratingSystem]'s [Family] | ||
* as a filter for the [EntityAdditionListener]. | ||
*/ | ||
inline fun SortedIteratingSystem.onEntityAdded( | ||
priority: Int = 0, | ||
crossinline onAdded: (entity: Entity) -> Unit | ||
): EntityAdditionListener = engine.onEntityAdded(family, priority, onAdded) | ||
|
||
/** | ||
* A wrapper for [Engine.onEntityRemoved] that uses this [SortedIteratingSystem]'s [Family] | ||
* as a filter for the [EntityRemovalListener]. | ||
*/ | ||
inline fun SortedIteratingSystem.onEntityRemoved( | ||
priority: Int = 0, | ||
crossinline onRemoved: (entity: Entity) -> Unit | ||
): EntityRemovalListener = engine.onEntityRemoved(family, priority, onRemoved) |
Oops, something went wrong.