Ok, I've created a test case using solids, it is pretty damned long, so sorry about that.
So there are two different problems with this, one that is easy to replicate, and one that takes a little work.
Hit "reshow" to display the objects. Hitting it again hides and then shows the objects again, allowing you to refresh them. pause/reset/resume changes the Dynamic Switcher values, the other commands are for shifting to different animation sequences.
Problem 1. If you are in either the Static or Diagonal animations, and hit reset more than once in a row, it causes the yellow and blue blocks to hop to the bottom right of the screen. This is never intended to happen, and does not happen while the other animations are up, nor does it happen if you alternate between reset and pause/resume, only if you attempt a reset when reset was the last thing that you did. I need to have a way where I can put a "reset" command in the code without needing to know what the previous state was, so that I can reliably reset the animation when re-showing it.
Problem 2. There is a light green block that is prominently visible. There is also a darker green block behind it, which I've made slightly larger so you can see it's there, but normally is identical in size. These two objects should always be perfectly synchronized, so that the background one would never be visible if everything is working right. At times, however, they can fall out of sync, wherein the background object is making it's movements a few seconds before or after the foreground one. This happens with other objects in the actual version but I've pared it down to just these two for the test case. Getting it to do this is a bit trial and error though, I do not know an exact sequence of movements that will cause it to "break," it basically just involves spamming the different animations a few times, maybe pausing, switching animations, resuming, and repeating this process several times, and it should "break" eventually. I can resolve this using "reset," and could ignore this issue if I could reliably "reset" the animations every time I switched between them, but due to Problem 1 that is not currently an easy option.
Code: Select all
default AniState = 0
default Movement = 0
label SwitcherTest:
while 1:
menu:
"What do you want?"
"Reshow":
hide Test_Animation
show Test_Animation at SpriteLocation
"Reset":
$ AniState = 1 if AniState != 1 else 2
"Pause":
$ AniState = 3
"Resume":
$ AniState = 5
"Static":
$ Movement = 0
"Diagonal":
$ Movement = 1
"Pulse":
$ Movement = 2
"Mid":
$ Movement = 3
"Low":
$ Movement = 4
image Test_Animation: #This is the primary image, the one that will get shown directly
LiveComposite(
(787,913),
(0,0), "Switcher1", # base layer
(0,0), "Switcher3", # top layer
(0,0), "SwitcherMask", # mask layer
(0,0), AlphaMask("Switcher4", "SwitcherMask"), # alphaed layer
)
zoom .55
offset (-290,210)
image Switcher1 = DisplayableSwitcher(displayable={ #Shows a darker green block
"Static": At("Switcher1_Object", Switcher1_Static()),
"Diagonal": At("Switcher1_Object", Switcher1_Diagonal()),
"Pulse": At("Switcher1_Object", Switcher1_Pulse()),
"Mid": At("Switcher1_Object", Switcher1_Mid()),
"Low": At("Switcher1_Object", Switcher1_Low())
},
conditions=(
("Movement == 1 and AniState == 0", ("Diagonal", )),
("Movement == 1 and AniState == 1", ("Diagonal", "reset")),
("Movement == 1 and AniState == 2", ("Diagonal", "reset")),
("Movement == 1 and AniState == 3", ("Diagonal", "pause")),
("Movement == 1 and AniState == 4", ("Diagonal", "show_paused")),
("Movement == 1 and AniState == 5", ("Diagonal", "resume")),
("Movement == 1 and AniState > 5", ("default", )),
("Movement == 2 and AniState == 0", ("Pulse", )),
("Movement == 2 and AniState == 1", ("Pulse", "reset")),
("Movement == 2 and AniState == 2", ("Pulse", "reset")),
("Movement == 2 and AniState == 3", ("Pulse", "pause")),
("Movement == 2 and AniState == 4", ("Pulse", "show_paused")),
("Movement == 2 and AniState == 5", ("Pulse", "resume")),
("Movement == 2 and AniState > 5", ("default", )),
("Movement == 3 and AniState == 0", ("Mid", )),
("Movement == 3 and AniState == 1", ("Mid", "reset")),
("Movement == 3 and AniState == 2", ("Mid", "reset")),
("Movement == 3 and AniState == 3", ("Mid", "pause")),
("Movement == 3 and AniState == 4", ("Mid", "show_paused")),
("Movement == 3 and AniState == 5", ("Mid", "resume")),
("Movement == 3 and AniState > 5", ("default", )),
("Movement >= 4 and AniState == 0", ("Low", )),
("Movement >= 4 and AniState == 1", ("Low", "reset")),
("Movement >= 4 and AniState == 2", ("Low", "reset")),
("Movement >= 4 and AniState == 3", ("Low", "pause")),
("Movement >= 4 and AniState == 4", ("Low", "show_paused")),
("Movement >= 4 and AniState == 5", ("Low", "resume")),
("Movement >= 4 and AniState > 5", ("default", )),
("Movement < 1 and AniState == 0", ("Static", )),
("Movement < 1 and AniState == 1", ("Static", "reset")),
("Movement < 1 and AniState == 2", ("Static", "reset")),
("Movement < 1 and AniState == 3", ("Static", "pause")),
("Movement < 1 and AniState == 4", ("Static", "show_paused")),
("Movement < 1 and AniState == 5", ("Static", "resume")),
("Movement < 1 and AniState > 5", ("default", )),
("True", ("default", ))
))
image Switcher3 = DisplayableSwitcher(displayable={ #shows a lighter green block
"Static": At("Switcher3_Object", Switcher1_Static()),
"Diagonal": At("Switcher3_Object", Switcher1_Diagonal()),
"Pulse": At("Switcher3_Object", Switcher1_Pulse()),
"Mid": At("Switcher3_Object", Switcher1_Mid()),
"Low": At("Switcher3_Object", Switcher1_Low()),
},
conditions=(
("Movement == 1 and AniState == 0", ("Diagonal", )),
("Movement == 1 and AniState == 1", ("Diagonal", "reset")),
("Movement == 1 and AniState == 2", ("Diagonal", "reset")),
("Movement == 1 and AniState == 3", ("Diagonal", "pause")),
("Movement == 1 and AniState == 4", ("Diagonal", "show_paused")),
("Movement == 1 and AniState == 5", ("Diagonal", "resume")),
("Movement == 1 and AniState > 5", ("default", )),
("Movement == 2 and AniState == 0", ("Pulse", )),
("Movement == 2 and AniState == 1", ("Pulse", "reset")),
("Movement == 2 and AniState == 2", ("Pulse", "reset")),
("Movement == 2 and AniState == 3", ("Pulse", "pause")),
("Movement == 2 and AniState == 4", ("Pulse", "show_paused")),
("Movement == 2 and AniState == 5", ("Pulse", "resume")),
("Movement == 2 and AniState > 5", ("default", )),
("Movement == 3 and AniState == 0", ("Mid", )),
("Movement == 3 and AniState == 1", ("Mid", "reset")),
("Movement == 3 and AniState == 2", ("Mid", "reset")),
("Movement == 3 and AniState == 3", ("Mid", "pause")),
("Movement == 3 and AniState == 4", ("Mid", "show_paused")),
("Movement == 3 and AniState == 5", ("Mid", "resume")),
("Movement == 3 and AniState > 5", ("default", )),
("Movement >= 4 and AniState == 0", ("Low", )),
("Movement >= 4 and AniState == 1", ("Low", "reset")),
("Movement >= 4 and AniState == 2", ("Low", "reset")),
("Movement >= 4 and AniState == 3", ("Low", "pause")),
("Movement >= 4 and AniState == 4", ("Low", "show_paused")),
("Movement >= 4 and AniState == 5", ("Low", "resume")),
("Movement >= 4 and AniState > 5", ("default", )),
("Movement < 1 and AniState == 0", ("Static", )),
("Movement < 1 and AniState == 1", ("Static", "reset")),
("Movement < 1 and AniState == 2", ("Static", "reset")),
("Movement < 1 and AniState == 3", ("Static", "pause")),
("Movement < 1 and AniState == 4", ("Static", "show_paused")),
("Movement < 1 and AniState == 5", ("Static", "resume")),
("Movement < 1 and AniState > 5", ("default", )),
("True", ("default", ))
))
image Switcher4 = DisplayableSwitcher(displayable={ #shows a yellow block, which gets alphaed
"Static": At("Switcher4_Object", Switcher4_Static()),
"Diagonal": At("Switcher4_Object", Switcher4_Diagonal()),
"Pulse": At("Switcher4_Object", Switcher4_Mid()),
"Mid": At("Switcher4_Object", Switcher4_Mid()),
"Low": At("Switcher4_Object", Switcher4_Mid())
},
conditions=(
("Movement == 1 and AniState == 0", ("Diagonal", )),
("Movement == 1 and AniState == 1", ("Diagonal", "reset")),
("Movement == 1 and AniState == 2", ("Diagonal", "reset")),
("Movement == 1 and AniState == 3", ("Diagonal", "pause")),
("Movement == 1 and AniState == 4", ("Diagonal", "show_paused")),
("Movement == 1 and AniState == 5", ("Diagonal", "resume")),
("Movement == 1 and AniState > 5", ("default", )),
("Movement == 2 and AniState == 0", ("Pulse", )),
("Movement == 2 and AniState == 1", ("Pulse", "reset")),
("Movement == 2 and AniState == 2", ("Pulse", "reset")),
("Movement == 2 and AniState == 3", ("Pulse", "pause")),
("Movement == 2 and AniState == 4", ("Pulse", "show_paused")),
("Movement == 2 and AniState == 5", ("Pulse", "resume")),
("Movement == 2 and AniState > 5", ("default", )),
("Movement > 1 and AniState == 0", ("Mid", )),
("Movement > 1 and AniState == 1", ("Mid", "reset")),
("Movement > 1 and AniState == 2", ("Mid", "reset")),
("Movement > 1 and AniState == 3", ("Mid", "pause")),
("Movement > 1 and AniState == 4", ("Mid", "show_paused")),
("Movement > 1 and AniState == 5", ("Mid", "resume")),
("Movement > 1 and AniState > 5", ("default", )),
("Movement >= 3 and AniState == 0", ("Low", )),
("Movement >= 3 and AniState == 1", ("Low", "reset")),
("Movement >= 3 and AniState == 2", ("Low", "reset")),
("Movement >= 3 and AniState == 3", ("Low", "pause")),
("Movement >= 3 and AniState == 4", ("Low", "show_paused")),
("Movement >= 3 and AniState == 5", ("Low", "resume")),
("Movement >= 3 and AniState > 5", ("default", )),
("Movement < 1 and AniState == 0", ("Static", )),
("Movement < 1 and AniState == 1", ("Static", "reset")),
("Movement < 1 and AniState == 2", ("Static", "reset")),
("Movement < 1 and AniState == 3", ("Static", "pause")),
("Movement < 1 and AniState == 4", ("Static", "show_paused")),
("Movement < 1 and AniState == 5", ("Static", "resume")),
("Movement < 1 and AniState > 5", ("default", )),
("True", ("default", ))
))
image SwitcherMask = DisplayableSwitcher(displayable={ #shows the blue alpha masking object
"Static": At("SwitcherMask_Object", Switcher4_StaticMask()),
"Diagonal": At("SwitcherMask_Object", Switcher4_StaticMask()),
"Pulse": At("SwitcherMaskB", Switcher1_Pulse()), #note how this one uses a different base object
"Mid": At("SwitcherMask_Object", Switcher1_Mid()),
"Low": At("SwitcherMask_Object", Switcher1_Low())
},
conditions=(
("Movement == 1 and AniState == 0", ("Diagonal", )),
("Movement == 1 and AniState == 1", ("Diagonal", "reset")),
("Movement == 1 and AniState == 2", ("Diagonal", "reset")),
("Movement == 1 and AniState == 3", ("Diagonal", "pause")),
("Movement == 1 and AniState == 4", ("Diagonal", "show_paused")),
("Movement == 1 and AniState == 5", ("Diagonal", "resume")),
("Movement == 1 and AniState > 5", ("default", )),
("Movement == 2 and AniState == 0", ("Pulse", )),
("Movement == 2 and AniState == 1", ("Pulse", "reset")),
("Movement == 2 and AniState == 2", ("Pulse", "reset")),
("Movement == 2 and AniState == 3", ("Pulse", "pause")),
("Movement == 2 and AniState == 4", ("Pulse", "show_paused")),
("Movement == 2 and AniState == 5", ("Pulse", "resume")),
("Movement == 2 and AniState > 5", ("default", )),
("Movement == 3 and AniState == 0", ("Mid", )),
("Movement == 3 and AniState == 1", ("Mid", "reset")),
("Movement == 3 and AniState == 2", ("Mid", "reset")),
("Movement == 3 and AniState == 3", ("Mid", "pause")),
("Movement == 3 and AniState == 4", ("Mid", "show_paused")),
("Movement == 3 and AniState == 5", ("Mid", "resume")),
("Movement == 3 and AniState > 5", ("default", )),
("Movement >= 4 and AniState == 0", ("Low", )),
("Movement >= 4 and AniState == 1", ("Low", "reset")),
("Movement >= 4 and AniState == 2", ("Low", "reset")),
("Movement >= 4 and AniState == 3", ("Low", "pause")),
("Movement >= 4 and AniState == 4", ("Low", "show_paused")),
("Movement >= 4 and AniState == 5", ("Low", "resume")),
("Movement >= 4 and AniState > 5", ("default", )),
("Movement < 1 and AniState == 0", ("Static", )),
("Movement < 1 and AniState == 1", ("Static", "reset")),
("Movement < 1 and AniState == 2", ("Static", "reset")),
("Movement < 1 and AniState == 3", ("Static", "pause")),
("Movement < 1 and AniState == 4", ("Static", "show_paused")),
("Movement < 1 and AniState == 5", ("Static", "resume")),
("Movement < 1 and AniState > 5", ("default", )),
("True", ("default", ))
))
image SwitcherMaskB = DisplayableSwitcher(displayable={ #this is an alternate alpha mask situation
"Static": At("SwitcherMask_Object", Switcher4_StaticMask()),
"Diagonal": At("SwitcherMask_Object", Switcher4_StaticMask()),
"Pulse": At("SwitcherMask_ObjectB", Switcher1_AnimB()), #this is the only one actually necessary, but more problems occur without it
"Mid": At("SwitcherMask_Object", Switcher1_Mid()),
"Low": At("SwitcherMask_Object", Switcher1_Low())
},
conditions=(
("Movement == 1 and AniState == 0", ("Diagonal", )),
("Movement == 1 and AniState == 1", ("Diagonal", "reset")),
("Movement == 1 and AniState == 2", ("Diagonal", "reset")),
("Movement == 1 and AniState == 3", ("Diagonal", "pause")),
("Movement == 1 and AniState == 4", ("Diagonal", "show_paused")),
("Movement == 1 and AniState == 5", ("Diagonal", "resume")),
("Movement == 1 and AniState > 5", ("default", )),
("Movement == 2 and AniState == 0", ("Pulse", )),
("Movement == 2 and AniState == 1", ("Pulse", "reset")),
("Movement == 2 and AniState == 2", ("Pulse", "reset")),
("Movement == 2 and AniState == 3", ("Pulse", "pause")),
("Movement == 2 and AniState == 4", ("Pulse", "show_paused")),
("Movement == 2 and AniState == 5", ("Pulse", "resume")),
("Movement == 2 and AniState > 5", ("default", )),
("Movement == 3 and AniState == 0", ("Mid", )),
("Movement == 3 and AniState == 1", ("Mid", "reset")),
("Movement == 3 and AniState == 2", ("Mid", "reset")),
("Movement == 3 and AniState == 3", ("Mid", "pause")),
("Movement == 3 and AniState == 4", ("Mid", "show_paused")),
("Movement == 3 and AniState == 5", ("Mid", "resume")),
("Movement == 3 and AniState > 5", ("default", )),
("Movement >= 4 and AniState == 0", ("Low", )),
("Movement >= 4 and AniState == 1", ("Low", "reset")),
("Movement >= 4 and AniState == 2", ("Low", "reset")),
("Movement >= 4 and AniState == 3", ("Low", "pause")),
("Movement >= 4 and AniState == 4", ("Low", "show_paused")),
("Movement >= 4 and AniState == 5", ("Low", "resume")),
("Movement >= 4 and AniState > 5", ("default", )),
("Movement < 1 and AniState == 0", ("Static", )),
("Movement < 1 and AniState == 1", ("Static", "reset")),
("Movement < 1 and AniState == 2", ("Static", "reset")),
("Movement < 1 and AniState == 3", ("Static", "pause")),
("Movement < 1 and AniState == 4", ("Static", "show_paused")),
("Movement < 1 and AniState == 5", ("Static", "resume")),
("Movement < 1 and AniState > 5", ("default", )),
("True", ("default", ))
))
image InternalSwitcher = DisplayableSwitcher(displayable={ #this controls the pulsing motion on a small blue block
"Pulse": At("InternalObject", Switcher1_AnimB()),
},
conditions=(
("Movement == 2 and AniState == 0", ("Pulse", )),
("Movement == 2 and AniState == 1", ("Pulse", "reset")),
("Movement == 2 and AniState == 2", ("Pulse", "reset")),
("Movement == 2 and AniState == 3", ("Pulse", "pause")),
("Movement == 2 and AniState == 4", ("Pulse", "show_paused")),
("Movement == 2 and AniState == 5", ("Pulse", "resume")),
("Movement == 2 and AniState > 5", ("default", )),
("True", ("default", ))
))
image Switcher1_Object: #this is the darker green block on the bottom
"True", Solid("#159457", xysize=(500,500))
image Switcher3_Object: #this is the light green block on the top layer
LiveComposite(
(787,913),
(0,0), Solid("#47ec9d", xysize=(500,500)),
(0,0), "InternalSwitcher",
)
image Switcher4_Object: #this is the yellow rectangle
LiveComposite(
(200,950),
(0,0), Solid("#d5f623", xysize=(200, 950)),
)
anchor (0.5,0.5)
zoom 1.05
alpha .8
pos (150,1000)
image InternalObject: #this is the small teal block that gets animated to pulse
contains:
Solid("#75d7ec", xysize=(100,100)),
anchor (0.40,0.65)
image SwitcherMask_Object: #this is the blue masking object
Solid("#7a8aff", xysize=(787, 1489))
alpha 0.2
image SwitcherMask_ObjectB: #this is the one used for the alternate mode
alpha .2
contains:
Solid("#7a8aff", xysize=(787, 1489))
anchor (0.40, 0.4)
#Transforms:
transform Switcher4_Static():
anchor (.5,.5)
rotate -10
transform Switcher4_StaticMask():
anchor (.5,.5)
offset (410,600)
xzoom 1.1
yzoom 1.05
transform Switcher4_Mid():
anchor (.5,.5)
rotate 0
transform Switcher4_Diagonal():
subpixel True
anchor (.5,.5)
block:
ease 2 rotate -5 #410
pause .5
ease 2.5 rotate 0
repeat
transform Switcher1_Diagonal():
subpixel True
ease 0.5 offset (0,-35) #top
block:
ease 2.5 offset (25,100)
ease 2 offset (0,-35)
pause .5
function AnimRepeat
repeat
transform Switcher1_Pulse():
subpixel True
offset (0,-40) #top
block:
ease 1 yoffset 35
ease 1.5 offset (0,-40)
function AnimRepeat
repeat
transform Switcher1_AnimA():
pos (316,600)
zoom 1.0
transform Switcher1_AnimB():
pos (316,600)
subpixel True
zoom 0.70
block:
pause .15
easein .25 zoom 0.9
linear .1 zoom 0.87
easeout .3 zoom 0.9
pause .5
easein .4 zoom 0.87
linear .1 zoom 0.9
easeout .45 zoom 0.70
pause .25
repeat
transform Switcher1_Mid():
subpixel True
ease 0.5 offset (0,50)
block:
ease 1 yoffset 120 #100
ease 1.5 offset (0,50)
function AnimRepeat
repeat
transform Switcher1_Low():
ease .5 offset (0,100)
block:
subpixel True
ease 1 yoffset 300
pause .5
ease 2 yoffset 100
function AnimRepeat
repeat
transform Switcher1_Static():
subpixel True
ease 1.5 offset (0,0)
function AnimRepeat
repeat
transform SpriteLocation():
pos (715,50)