[libgdx] EventData changed to have an Event setupPose field.

This commit is contained in:
Nathan Sweet 2026-03-25 00:19:51 -04:00
parent c7f328c079
commit 2aff881451
5 changed files with 40 additions and 73 deletions

View File

@ -2326,23 +2326,24 @@ public class SkeletonSerializer {
json.writeName("type");
json.writeValue("EventData");
Event setup = obj.getSetupPose();
json.writeName("int");
json.writeValue(obj.getInt());
json.writeValue(setup.getInt());
json.writeName("float");
json.writeValue(obj.getFloat());
json.writeValue(setup.getFloat());
json.writeName("string");
json.writeValue(obj.getString());
json.writeValue(setup.getString());
json.writeName("audioPath");
json.writeValue(obj.getAudioPath());
json.writeName("volume");
json.writeValue(obj.getVolume());
json.writeValue(setup.getVolume());
json.writeName("balance");
json.writeValue(obj.getBalance());
json.writeValue(setup.getBalance());
json.writeName("name");
json.writeValue(obj.getName());

View File

@ -39,12 +39,12 @@ import com.esotericsoftware.spine.AnimationState.AnimationStateListener;
* {@link AnimationStateListener#event(com.esotericsoftware.spine.AnimationState.TrackEntry, Event)}, and
* <a href="https://esotericsoftware.com/spine-events">Events</a> in the Spine User Guide. */
public class Event {
final float time;
final EventData data;
int intValue;
float floatValue;
String stringValue;
float volume, balance;
final float time;
public Event (float time, EventData data) {
if (data == null) throw new IllegalArgumentException("data cannot be null.");
@ -52,6 +52,7 @@ public class Event {
this.data = data;
}
/** The integer payload for this event. */
public int getInt () {
return intValue;
}
@ -60,6 +61,7 @@ public class Event {
this.intValue = intValue;
}
/** The float payload for this event. */
public float getFloat () {
return floatValue;
}
@ -68,6 +70,7 @@ public class Event {
this.floatValue = floatValue;
}
/** The string payload for this event. */
public String getString () {
return stringValue;
}
@ -77,6 +80,7 @@ public class Event {
this.stringValue = stringValue;
}
/** If an audio path is set, the volume for the audio. */
public float getVolume () {
return volume;
}
@ -85,6 +89,7 @@ public class Event {
this.volume = volume;
}
/** If an audio path is set, the left/right balance for the audio. */
public float getBalance () {
return balance;
}
@ -93,7 +98,7 @@ public class Event {
this.balance = balance;
}
/** The animation time this event was keyed. */
/** The animation time this event was keyed, or -1 for the setup pose. */
public float getTime () {
return time;
}

View File

@ -36,43 +36,19 @@ import com.badlogic.gdx.utils.Null;
* See <a href="https://esotericsoftware.com/spine-events">Events</a> in the Spine User Guide. */
public class EventData {
final String name;
int intValue;
float floatValue;
String stringValue;
@Null String audioPath;
float volume, balance;
final Event setupPose = new Event(-1, this);
public EventData (String name) {
if (name == null) throw new IllegalArgumentException("name cannot be null.");
this.name = name;
}
public int getInt () {
return intValue;
/** The setup values that are shared by all events with this data. */
public Event getSetupPose () {
return setupPose;
}
public void setInt (int intValue) {
this.intValue = intValue;
}
public float getFloat () {
return floatValue;
}
public void setFloat (float floatValue) {
this.floatValue = floatValue;
}
public String getString () {
return stringValue;
}
public void setString (String stringValue) {
if (stringValue == null) throw new IllegalArgumentException("stringValue cannot be null.");
this.stringValue = stringValue;
}
/** Path to an audio file relative to the audio path in the Spine project. */
/** Path to an audio file relative to the audio folder as defined in Spine. */
public @Null String getAudioPath () {
return audioPath;
}
@ -82,24 +58,6 @@ public class EventData {
this.audioPath = audioPath;
}
/** If an audio path is set, the volume for the audio. */
public float getVolume () {
return volume;
}
public void setVolume (float volume) {
this.volume = volume;
}
/** If an audio path is set, the left/right balance for the audio. */
public float getBalance () {
return balance;
}
public void setBalance (float balance) {
this.balance = balance;
}
/** The name of the event, unique across all events in the skeleton.
* <p>
* See {@link SkeletonData#findEvent(String)}. */

View File

@ -485,13 +485,14 @@ public class SkeletonBinary extends SkeletonLoader {
o = skeletonData.events.setSize(n = input.readInt(true));
for (int i = 0; i < n; i++) {
var data = new EventData(input.readString());
data.intValue = input.readInt(false);
data.floatValue = input.readFloat();
data.stringValue = input.readString();
Event setup = data.setupPose;
setup.intValue = input.readInt(false);
setup.floatValue = input.readFloat();
setup.stringValue = input.readString();
data.audioPath = input.readString();
if (data.audioPath != null) {
data.volume = input.readFloat();
data.balance = input.readFloat();
setup.volume = input.readFloat();
setup.balance = input.readFloat();
}
o[i] = data;
}
@ -1196,7 +1197,7 @@ public class SkeletonBinary extends SkeletonLoader {
event.intValue = input.readInt(false);
event.floatValue = input.readFloat();
event.stringValue = input.readString();
if (event.stringValue == null) event.stringValue = eventData.stringValue;
if (event.stringValue == null) event.stringValue = eventData.setupPose.stringValue;
if (event.data.audioPath != null) {
event.volume = input.readFloat();
event.balance = input.readFloat();

View File

@ -501,13 +501,14 @@ public class SkeletonJson extends SkeletonLoader {
// Events.
for (JsonValue eventMap = root.getChild("events"); eventMap != null; eventMap = eventMap.next) {
var data = new EventData(eventMap.name);
data.intValue = eventMap.getInt("int", 0);
data.floatValue = eventMap.getFloat("float", 0f);
data.stringValue = eventMap.getString("string", "");
Event setup = data.setupPose;
setup.intValue = eventMap.getInt("int", 0);
setup.floatValue = eventMap.getFloat("float", 0f);
setup.stringValue = eventMap.getString("string", "");
data.audioPath = eventMap.getString("audio", null);
if (data.audioPath != null) {
data.volume = eventMap.getFloat("volume", 1);
data.balance = eventMap.getFloat("balance", 0);
setup.volume = eventMap.getFloat("volume", 1);
setup.balance = eventMap.getFloat("balance", 0);
}
skeletonData.events.add(data);
}
@ -1243,15 +1244,16 @@ public class SkeletonJson extends SkeletonLoader {
var timeline = new EventTimeline(eventsMap.size);
int frame = 0;
for (JsonValue keyMap = eventsMap.child; keyMap != null; keyMap = keyMap.next, frame++) {
EventData eventData = skeletonData.findEvent(keyMap.getString("name"));
if (eventData == null) throw new SerializationException("Event not found: " + keyMap.getString("name"));
var event = new Event(keyMap.getFloat("time", 0), eventData);
event.intValue = keyMap.getInt("int", eventData.intValue);
event.floatValue = keyMap.getFloat("float", eventData.floatValue);
event.stringValue = keyMap.getString("string", eventData.stringValue);
EventData data = skeletonData.findEvent(keyMap.getString("name"));
if (data == null) throw new SerializationException("Event not found: " + keyMap.getString("name"));
Event setup = data.setupPose;
var event = new Event(keyMap.getFloat("time", 0), data);
event.intValue = keyMap.getInt("int", setup.intValue);
event.floatValue = keyMap.getFloat("float", setup.floatValue);
event.stringValue = keyMap.getString("string", setup.stringValue);
if (event.data.audioPath != null) {
event.volume = keyMap.getFloat("volume", eventData.volume);
event.balance = keyMap.getFloat("balance", eventData.balance);
event.volume = keyMap.getFloat("volume", setup.volume);
event.balance = keyMap.getFloat("balance", setup.balance);
}
timeline.setFrame(frame, event);
}