Saving Object Animations' States
With the introduction of the 1.5.0. plugin, Object animations can be done using the IPO curve editor in Blender.
This means that animations (such as opening a door) can now be made WITHOUT coding the door's movement using a python file.
However, although the POSITION of your animated object WILL be saved into the .sav file, when you leave your Age, the "state" of your animated object (e.g. if a door is "open" or "closed") is NOT remembered in the .sav file, and this may cause your animation to "glitch" if you re-enter your age and then re-animate the object (e.g. click the door button again to close an open door).
This can be avoided by using "built in" python files (Cyan's) and an SDL variable.
You will also need a 'simple' python file for your Age (YourAge.py) to enable the SDL file, and, of course, an SDL file (YourAge.sdl)
Below is an example of the Alcscript you could use to call the Cyan python files to write the SDL variable and thereby save the STATE of your object.
This example uses a synchronised avatar animation and several (synchronised) sound emitters to create an (animated) "push" button that opens (and closes) a door.
You will see that in the Alcscript there are TWO responders - one for opening the door, and one to close the door.
This is important! (and DIFFERENT from the example animation in the AnimTest.Age in the previous Wiki article)
All objects used in the following script are as follows:
1)The door button (SWDoorButton)
2)The clickable region (Doorswing)
3)The door (Door1)
4)Sound emitter for the BUTTON (emit_swdoorbutton)
5)Sound emitter for the door OPENING sound (emit_swingdoorOpen)
6)Sound emitter for the door CLOSING sound (emit_swingdoorClos)
7)The "empty" for the avatar animation point (DoorButtonOneshot)
8)The name of the avatar animation (DoorButtonTouch)
.... here are the alcscript sections for the various objects.
(You can see that the saving of the door's state is done in the "actions" section of the door button. I have included the other sections for reference purposes)
SWDoorButton: animations: - name: SWdoorbuttonclick autostart: 0 loop: 0 logic: modifiers: - tag: AutoClick cursor: poised flags: - localelement activators: - type: objectinvolume remote: Doorswing triggers: - any conditions: - type: activator activators: - type: picking - type: objectinbox satisfied: true actions: - type: pythonfile ref: $BoolToggle actions: - type: pythonfile tag: BoolToggle pythonfile: file: xAgeSDLBoolToggle parameters: - type: activator ref: logicmod:$AutoClick - type: string value: <SDL Name> - type: skip - type: skip - type: string value: <SDL Name> - type: pythonfile tag: BoolRespond pythonfile: file: xAgeSDLBoolRespond parameters: - type: string value: <SDL Name> - type: responder ref: :DoorOpen - type: responder ref: :DoorClose - type: bool value: false - type: bool value: true
DoorButtonOneshot: logic: actions: - type: oneshot name: DoorButtonOneshot oneshot: animation: DoorButtonTouch
Door1: animations: - name: DoorOpen1 autostart: 0 loop: 0 logic: actions: - type: responder name: DoorOpen responder: states: - cmds: - type: oneshotmsg params: receivers: - oneshotmod:DoorButtonOneshot callbacks: - marker: "DoorButtonTouch" receiver: respondermod:DoorOpen user: 0 waiton: -1 - type: animcmdmsg params: receivers: - 006D:Door1 animname: DoorOpen1 cmds: - setforewards - continue waiton: 0 - type: animcmdmsg params: receivers: - 006D:SWDoorButton animname: SWdoorbuttonclick cmds: - setforewards - continue waiton: 0 - type: soundmsg params: receivers: - 0011:emit_swingdoorOpen - 0011:emit_swdoorbutton cmds: - play - setvolume volume: 1 waiton: -1 nextstate: 1 waittocmd: - key: 0 #cmds with waiton of 0 msg: 0 #wait for callback for user 0 curstate: 0 flags: - detecttrigger - type: responder name: DoorClose responder: states: - cmds: - type: oneshotmsg params: receivers: - oneshotmod:DoorButtonOneshot callbacks: - marker: "DoorButtonTouch" receiver: respondermod:DoorClose user: 0 waiton: -1 - type: animcmdmsg params: receivers: - 006D:Door1 animname: DoorOpen1 cmds: - setbackwards - continue waiton: 0 - type: animcmdmsg params: receivers: - 006D:SWDoorButton animname: SWdoorbuttonclick cmds: - setforewards - continue waiton: 0 - type: soundmsg params: receivers: - 0011:emit_swingdoor - 0011:emit_swdoorbutton cmds: - play - setvolume volume: 1 waiton: -1 nextstate: 0 waittocmd: - key: 0 #cmds with waiton of 0 msg: 0 #wait for callback for user 0 curstate: 0 flags: - detecttrigger
emit_swingdoor: type: soundemit sound: flags: - is3dsound file: <name of closing door sound file> volume: 1 type: soundfx maxfdist: 50 minfdist: 50
emit_swingdoorOpen: type: soundemit sound: flags: - is3dsound file: <name of opening door sound file> volume: 1 type: soundfx maxfdist: 50 minfdist: 50
emit_swdoorbutton: type: soundemit sound: flags: - is3dsound file: <name of button sound file> volume: 1 type: soundfx maxfdist: 50 minfdist: 50
You will need to create (or add to) your SDL file and add the variable <SDL Name>
Sdl FILE:
VAR BOOL <SDL Name>[1] DEFAULT=0
Also see the SDL documentation.
Note: Global xAgeSDL* scripts will not properly initialize in Pahts shells due to the fact that they are not initially paged in.