Animation-Event Message

From TrainzOnline
(Difference between revisions)
Jump to: navigation, search
m
(Removed duplicated information)
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Generic events can be linked to an animation key frame to give a measure of control over script timing. This is a different mechanism from Sound_Event, which interfaces with a ''soundscript'' container in config.txt and does not require scripting.
+
Animation events are used to initiate some action, such as smoke effects, during an animation cycle that can be detected by script. This is a different mechanism from Sound_Event, which interfaces with a [["Soundscript" container]] in config.txt and does not require scripting.
 +
When an animation event occurs, the game engine will post a message in the form:
 +
"<major>, <minor>"
 +
where the major part of the message is always "Animation-Event" and the minor part is a message of your choice.
  
When an animation file, *.kin, is exported from Max, the exporter will make a query for an event file. Tick the box and you will be asked to browse to the file. The event information is added to the contents of the new animation.
+
The structure and format of event files can be found here: [[FBX file format]]
  
* To produce an animation event which can be read by script you need to insert a line or lines similar to that below to a plain text file and to save it with an *.evt file extension.
+
To use the posted message you should define a handler using:
 
+
002 Generic_Event animstart
+
 
+
* This example will result in the message ''Animation-Event,animstart'' being sent by the game whenever the animation plays past frame 2. 
+
* It is best to avoid issuing events on the first or last frames since these are not always converted reliably into messages.
+
* To use the message you should define a handler using:
+
  
 
  AddHandler(me,"Animation-Event","","AnimationHandler");
 
  AddHandler(me,"Animation-Event","","AnimationHandler");
Line 15: Line 12:
 
  void AnimationHandler(Message msg) {
 
  void AnimationHandler(Message msg) {
 
     if (msg.minor == "animstart")  
 
     if (msg.minor == "animstart")  
      Interface.Print("Animation has started");
+
      Interface.Print("Animation has started");   //action for the animstart event
 +
    else if (msg.minor == "do-something")
 +
      Interface.Print("Do something here");      //action for the do-something event
 
     else if (msg.minor == "animstop")  
 
     else if (msg.minor == "animstop")  
      Interface.Print("Animation has completed");
+
      Interface.Print("Animation has completed"); //action for the animstop event
 
  }
 
  }
  
* In practice the game engine often issues duplicate messages so you will need to ensure that you are not responding more often than necessary. One way of doing this is to use a boolean variable to keep track of what your script is doing and use this to ignore duplicating script actions.
+
In practice the game engine often issues duplicate messages so you will need to ensure that you are not responding more often than necessary. One way of doing this is to use a boolean variable to keep track of what your script is doing and use this to ignore duplicating script actions.
  
  
 
==See Also==
 
==See Also==
 +
* [[FBX file format]]
 
* [[List of Standard Messages]]
 
* [[List of Standard Messages]]

Latest revision as of 16:18, 3 July 2020

Animation events are used to initiate some action, such as smoke effects, during an animation cycle that can be detected by script. This is a different mechanism from Sound_Event, which interfaces with a "Soundscript" container in config.txt and does not require scripting. When an animation event occurs, the game engine will post a message in the form: "<major>, <minor>" where the major part of the message is always "Animation-Event" and the minor part is a message of your choice.

The structure and format of event files can be found here: FBX file format

To use the posted message you should define a handler using:

AddHandler(me,"Animation-Event","","AnimationHandler");
void AnimationHandler(Message msg) {
   if (msg.minor == "animstart") 
     Interface.Print("Animation has started");   //action for the animstart event
   else if (msg.minor == "do-something") 
     Interface.Print("Do something here");      //action for the do-something event
   else if (msg.minor == "animstop") 
     Interface.Print("Animation has completed"); //action for the animstop event
}

In practice the game engine often issues duplicate messages so you will need to ensure that you are not responding more often than necessary. One way of doing this is to use a boolean variable to keep track of what your script is doing and use this to ignore duplicating script actions.


[edit] See Also

Personal tools