diff --git a/spine-android/app/src/main/java/com/esotericsoftware/spine/AnimationStateEvents.kt b/spine-android/app/src/main/java/com/esotericsoftware/spine/AnimationStateEvents.kt index 4dac08834..946f27c45 100644 --- a/spine-android/app/src/main/java/com/esotericsoftware/spine/AnimationStateEvents.kt +++ b/spine-android/app/src/main/java/com/esotericsoftware/spine/AnimationStateEvents.kt @@ -29,86 +29,84 @@ fun AnimationState(nav: NavHostController) { val TAG = "AnimationState" val controller = remember { - SpineController.Builder() - .setOnInitialized { controller -> - controller.skeleton.setScaleX(0.5f) - controller.skeleton.setScaleY(0.5f) + SpineController { controller -> + controller.skeleton.setScaleX(0.5f) + controller.skeleton.setScaleY(0.5f) - controller.skeleton.findSlot("gun")?.color = Color(1f, 0f, 0f, 1f) + controller.skeleton.findSlot("gun")?.color = Color(1f, 0f, 0f, 1f) - controller.animationStateData.setDefaultMix(0.2f) - controller.animationState.setAnimation(0, "walk", true).setListener(object : AnimationState.AnimationStateListener { - override fun start(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Walk animation event start") + controller.animationStateData.setDefaultMix(0.2f) + controller.animationState.setAnimation(0, "walk", true).setListener(object : AnimationState.AnimationStateListener { + override fun start(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Walk animation event start") + } + + override fun interrupt(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Walk animation event interrupt") + } + + override fun end(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Walk animation event end") + } + + override fun dispose(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Walk animation event dispose") + } + + override fun complete(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Walk animation event complete") + } + + override fun event(entry: AnimationState.TrackEntry?, event: Event?) { + Log.d(TAG, "Walk animation event event") + } + }) + controller.animationState.addAnimation(0, "jump", false, 2f) + controller.animationState.addAnimation(0, "run", true, 0f).setListener(object : AnimationState.AnimationStateListener { + override fun start(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Run animation event start") + } + + override fun interrupt(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Run animation event interrupt") + } + + override fun end(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Run animation event end") + } + + override fun dispose(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Run animation event dispose") + } + + override fun complete(entry: AnimationState.TrackEntry?) { + Log.d(TAG, "Run animation event complete") + } + + override fun event(entry: AnimationState.TrackEntry?, event: Event?) { + Log.d(TAG, "Run animation event event") + } + }) + + controller.animationState.addListener(object : AnimationState.AnimationStateListener { + override fun start(entry: AnimationState.TrackEntry?) {} + + override fun interrupt(entry: AnimationState.TrackEntry?) {} + + override fun end(entry: AnimationState.TrackEntry?) {} + + override fun dispose(entry: AnimationState.TrackEntry?) {} + + override fun complete(entry: AnimationState.TrackEntry?) {} + + override fun event(entry: AnimationState.TrackEntry?, event: Event?) { + if (event != null) { + Log.d(TAG, "User event: { name: ${event.data.name}, intValue: ${event.int}, floatValue: ${event.float}, stringValue: ${event.string} }") } - - override fun interrupt(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Walk animation event interrupt") - } - - override fun end(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Walk animation event end") - } - - override fun dispose(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Walk animation event dispose") - } - - override fun complete(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Walk animation event complete") - } - - override fun event(entry: AnimationState.TrackEntry?, event: Event?) { - Log.d(TAG, "Walk animation event event") - } - }) - controller.animationState.addAnimation(0, "jump", false, 2f) - controller.animationState.addAnimation(0, "run", true, 0f).setListener(object : AnimationState.AnimationStateListener { - override fun start(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Run animation event start") - } - - override fun interrupt(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Run animation event interrupt") - } - - override fun end(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Run animation event end") - } - - override fun dispose(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Run animation event dispose") - } - - override fun complete(entry: AnimationState.TrackEntry?) { - Log.d(TAG, "Run animation event complete") - } - - override fun event(entry: AnimationState.TrackEntry?, event: Event?) { - Log.d(TAG, "Run animation event event") - } - }) - - controller.animationState.addListener(object : AnimationState.AnimationStateListener { - override fun start(entry: AnimationState.TrackEntry?) {} - - override fun interrupt(entry: AnimationState.TrackEntry?) {} - - override fun end(entry: AnimationState.TrackEntry?) {} - - override fun dispose(entry: AnimationState.TrackEntry?) {} - - override fun complete(entry: AnimationState.TrackEntry?) {} - - override fun event(entry: AnimationState.TrackEntry?, event: Event?) { - if (event != null) { - Log.d(TAG, "User event: { name: ${event.data.name}, intValue: ${event.int}, floatValue: ${event.float}, stringValue: ${event.string} }") - } - } - }) - Log.d(TAG, "Current: ${controller.animationState.getCurrent(0)?.getAnimation()?.getName()}"); - } - .build() + } + }) + Log.d(TAG, "Current: ${controller.animationState.getCurrent(0)?.getAnimation()?.getName()}"); + } } Scaffold( diff --git a/spine-android/app/src/main/java/com/esotericsoftware/spine/DebugRendering.kt b/spine-android/app/src/main/java/com/esotericsoftware/spine/DebugRendering.kt index 4e3ccf30a..3f4d0c32b 100644 --- a/spine-android/app/src/main/java/com/esotericsoftware/spine/DebugRendering.kt +++ b/spine-android/app/src/main/java/com/esotericsoftware/spine/DebugRendering.kt @@ -47,14 +47,13 @@ fun DebugRendering(nav: NavHostController) { "spineboy.atlas", "spineboy-pro.json", context, - SpineController.Builder() - .setOnInitialized { - it.animationState.setAnimation(0, "walk", true) - } - .setOnAfterPaint { controller, canvas, commands -> - debugRenderer.render(controller.drawable, canvas, commands) - } - .build() + SpineController.Builder { controller -> + controller.animationState.setAnimation(0, "walk", true) + } + .setOnAfterPaint { controller, canvas, commands -> + debugRenderer.render(controller.drawable, canvas, commands) + } + .build() ) }, modifier = Modifier.padding(paddingValues) diff --git a/spine-android/app/src/main/java/com/esotericsoftware/spine/DressUp.kt b/spine-android/app/src/main/java/com/esotericsoftware/spine/DressUp.kt index 7d6ec70b0..0c4c0f41a 100644 --- a/spine-android/app/src/main/java/com/esotericsoftware/spine/DressUp.kt +++ b/spine-android/app/src/main/java/com/esotericsoftware/spine/DressUp.kt @@ -75,11 +75,9 @@ fun DressUp(nav: NavHostController) { } val controller = remember { - SpineController.Builder() - .setOnInitialized { - it.animationState.setAnimation(0, "dance", true) - } - .build() + SpineController { controller -> + controller.animationState.setAnimation(0, "dance", true) + } } fun toggleSkin(skinName: String) { diff --git a/spine-android/app/src/main/java/com/esotericsoftware/spine/IKFollowing.kt b/spine-android/app/src/main/java/com/esotericsoftware/spine/IKFollowing.kt index 83c0ed16e..b1810b6d9 100644 --- a/spine-android/app/src/main/java/com/esotericsoftware/spine/IKFollowing.kt +++ b/spine-android/app/src/main/java/com/esotericsoftware/spine/IKFollowing.kt @@ -35,21 +35,20 @@ fun IKFollowing(nav: NavHostController) { val crossHairPosition = remember { mutableStateOf(null) } val controller = remember { - SpineController.Builder() - .setOnInitialized { - it.animationState.setAnimation(0, "walk", true) - it.animationState.setAnimation(1, "aim", true) - } - .setOnAfterUpdateWorldTransforms { - val worldPosition = crossHairPosition.value ?: return@setOnAfterUpdateWorldTransforms - val skeleton = it.skeleton - val bone = skeleton.findBone("crosshair") ?: return@setOnAfterUpdateWorldTransforms - val parent = bone.parent ?: return@setOnAfterUpdateWorldTransforms - val position = parent.worldToLocal(Vector2(worldPosition.x.toFloat(), worldPosition.y.toFloat())) - bone.x = position.x - bone.y = position.y - } - .build() + SpineController.Builder { controller -> + controller.animationState.setAnimation(0, "walk", true) + controller.animationState.setAnimation(1, "aim", true) + } + .setOnAfterUpdateWorldTransforms { + val worldPosition = crossHairPosition.value ?: return@setOnAfterUpdateWorldTransforms + val skeleton = it.skeleton + val bone = skeleton.findBone("crosshair") ?: return@setOnAfterUpdateWorldTransforms + val parent = bone.parent ?: return@setOnAfterUpdateWorldTransforms + val position = parent.worldToLocal(Vector2(worldPosition.x.toFloat(), worldPosition.y.toFloat())) + bone.x = position.x + bone.y = position.y + } + .build() } Scaffold( diff --git a/spine-android/app/src/main/java/com/esotericsoftware/spine/Physics.kt b/spine-android/app/src/main/java/com/esotericsoftware/spine/Physics.kt index eae1fd4a2..583eb7665 100644 --- a/spine-android/app/src/main/java/com/esotericsoftware/spine/Physics.kt +++ b/spine-android/app/src/main/java/com/esotericsoftware/spine/Physics.kt @@ -36,31 +36,30 @@ fun Physics(nav: NavHostController) { val lastMousePosition = remember { mutableStateOf(null) } val controller = remember { - SpineController.Builder() - .setOnInitialized { controller -> - controller.animationState.setAnimation(0, "eyeblink-long", true) - controller.animationState.setAnimation(1, "wings-and-feet", true) + SpineController.Builder { controller -> + controller.animationState.setAnimation(0, "eyeblink-long", true) + controller.animationState.setAnimation(1, "wings-and-feet", true) + } + .setOnAfterUpdateWorldTransforms { controller -> + val lastMousePositionValue = lastMousePosition.value + if (lastMousePositionValue == null) { + lastMousePosition.value = mousePosition.value + return@setOnAfterUpdateWorldTransforms } - .setOnAfterUpdateWorldTransforms { controller -> - val lastMousePositionValue = lastMousePosition.value - if (lastMousePositionValue == null) { - lastMousePosition.value = mousePosition.value - return@setOnAfterUpdateWorldTransforms - } - val mousePositionValue = mousePosition.value ?: return@setOnAfterUpdateWorldTransforms + val mousePositionValue = mousePosition.value ?: return@setOnAfterUpdateWorldTransforms - val dx = mousePositionValue.x - lastMousePositionValue.x - val dy = mousePositionValue.y - lastMousePositionValue.y - val position = Point( - controller.skeleton.x.toInt(), - controller.skeleton.y.toInt() - ) - position.x += dx - position.y += dy - controller.skeleton.setPosition(position.x.toFloat(), position.y.toFloat()); - lastMousePosition.value = mousePositionValue - } - .build() + val dx = mousePositionValue.x - lastMousePositionValue.x + val dy = mousePositionValue.y - lastMousePositionValue.y + val position = Point( + controller.skeleton.x.toInt(), + controller.skeleton.y.toInt() + ) + position.x += dx + position.y += dy + controller.skeleton.setPosition(position.x.toFloat(), position.y.toFloat()); + lastMousePosition.value = mousePositionValue + } + .build() } Scaffold( diff --git a/spine-android/app/src/main/java/com/esotericsoftware/spine/PlayPause.kt b/spine-android/app/src/main/java/com/esotericsoftware/spine/PlayPause.kt index c1f99d9f4..bd514a42b 100644 --- a/spine-android/app/src/main/java/com/esotericsoftware/spine/PlayPause.kt +++ b/spine-android/app/src/main/java/com/esotericsoftware/spine/PlayPause.kt @@ -26,12 +26,9 @@ fun PlayPause( nav: NavHostController ) { val controller = remember { - SpineController.Builder() - .setOnInitialized { - it.animationState.setAnimation(0, "flying", true) - } - - .build() + SpineController { controller -> + controller.animationState.setAnimation(0, "flying", true) + } } val isPlaying = remember { mutableStateOf(controller.isPlaying) } diff --git a/spine-android/app/src/main/java/com/esotericsoftware/spine/SimpleAnimation.kt b/spine-android/app/src/main/java/com/esotericsoftware/spine/SimpleAnimation.kt index 9bbd34d0c..f48d85908 100644 --- a/spine-android/app/src/main/java/com/esotericsoftware/spine/SimpleAnimation.kt +++ b/spine-android/app/src/main/java/com/esotericsoftware/spine/SimpleAnimation.kt @@ -40,11 +40,9 @@ fun SimpleAnimation(nav: NavHostController) { "spineboy.atlas", "spineboy-pro.json", context, - SpineController.Builder() - .setOnInitialized { - it.animationState.setAnimation(0, "walk", true) - } - .build() + SpineController { + it.animationState.setAnimation(0, "walk", true) + } ) }, modifier = Modifier.padding(paddingValues) diff --git a/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineController.java b/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineController.java index b5b05c9b0..48b6efe12 100644 --- a/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineController.java +++ b/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineController.java @@ -17,15 +17,14 @@ import com.esotericsoftware.spine.android.utils.SpineControllerCallback; public class SpineController { public static class Builder { - private SpineControllerCallback onInitialized; + private final SpineControllerCallback onInitialized; private SpineControllerCallback onBeforeUpdateWorldTransforms; private SpineControllerCallback onAfterUpdateWorldTransforms; private SpineControllerBeforePaintCallback onBeforePaint; private SpineControllerAfterPaintCallback onAfterPaint; - public Builder setOnInitialized(SpineControllerCallback onInitialized) { + public Builder(SpineControllerCallback onInitialized) { this.onInitialized = onInitialized; - return this; } public Builder setOnBeforeUpdateWorldTransforms(SpineControllerCallback onBeforeUpdateWorldTransforms) { @@ -49,8 +48,7 @@ public class SpineController { } public SpineController build() { - SpineController spineController = new SpineController(); - spineController.onInitialized = onInitialized; + SpineController spineController = new SpineController(onInitialized); spineController.onBeforeUpdateWorldTransforms = onBeforeUpdateWorldTransforms; spineController.onAfterUpdateWorldTransforms = onAfterUpdateWorldTransforms; spineController.onBeforePaint = onBeforePaint; @@ -59,7 +57,7 @@ public class SpineController { } } - private @Nullable SpineControllerCallback onInitialized; + private final SpineControllerCallback onInitialized; private @Nullable SpineControllerCallback onBeforeUpdateWorldTransforms; private @Nullable SpineControllerCallback onAfterUpdateWorldTransforms; private @Nullable SpineControllerBeforePaintCallback onBeforePaint; @@ -71,6 +69,10 @@ public class SpineController { private double scaleX = 1; private double scaleY = 1; + public SpineController(SpineControllerCallback onInitialized) { + this.onInitialized = onInitialized; + } + protected void init(AndroidSkeletonDrawable drawable) { this.drawable = drawable; if (onInitialized != null) { diff --git a/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java b/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java index 6c9ea733e..a700c2e20 100644 --- a/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java +++ b/spine-android/spine-android/src/main/java/com/esotericsoftware/spine/android/SpineView.java @@ -120,12 +120,12 @@ public class SpineView extends View implements Choreographer.FrameCallback { public SpineView (Context context, AttributeSet attrs) { super(context, attrs); - this.controller = new SpineController(); + // TODO Load controller & assets fro attrs } - + public SpineView (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - this.controller = new SpineController(); + // TODO Load controller & assets fro attrs } public static SpineView loadFromAssets(String atlasFileName, String skeletonFileName, Context context, SpineController controller) {