#1
|
|||
|
|||
Timer Actions problem
Hello,
I wrote a small script basically want to play some animation paths in a specific schedule and every animation path can be played more than once. In this script, I create an animation path for a ball and another animation path for a duck. The array time_to_go[] and object[] make a schedule for the ball and duck. Here I would like firstly duck start to move; and after 3 seconds, ball start to move; and after another 3 seconds, ball start to move again. Then done. unfortunately the ball will start the 3rd time after my schedule. Could somebody help me diagnose what's wrong with it. Thanks, Code:
import viz import math viz.go() viz.clearcolor(0.5,0.5,1) viz.add('tut_ground.wrl') #Add 2 models. #One is a ball, the other is a duck. model = [] ball = viz.add('ball.wrl') duck = viz.add('duck.cfg') model.append(ball) model.append(duck) #Add the path. #path[0] is for the ball, path[1] is for the duck. path = [] for x in range(2): pa = viz.addAnimationPath() path.append(pa) positions = [ [5,1,6], [0,1,3], [-150,1,6] ] for x in range(len(positions)): cp = viz.addControlPoint() cp.setPosition(positions[x]) path[0].add(cp,x+1) path[1].add(cp,x+1) for x in range(2): path[x].constantspeed(viz.ON,10) path[x].loop(viz.OFF) path[x].translatemode(viz.BEZIER) path[x].setAutoRotate(viz.ON) #Link the model to a path. ball.link(path[0]) duck.link(path[1]) def mytimer(num): for x in range(2): pos = model[x].getPosition() if pos[0] < -15 : path[x].pause() path[x].reset() model[x].setPosition(0,0,0) def donothing(): pass #The following arrays means: #Firstly: duck start to move #After 3 seconds, ball start to move #After another 3 seconds, ball start to move again time_to_go = [0, 3, 6] object = [1, 0, 0] #1 means duck, 0 means ball #Create an array of timer action myTimerAction = [] for x in range(3): if (x == 0) : myTimerAction.append(vizact.ontimer2(0, 1, donothing)) path[object[0]].play() else: wait = time_to_go[x] - time_to_go[0] myTimerAction.append(vizact.ontimer2(wait, 1, path[object[x]].play)) viz.callback(viz.TIMER_EVENT,mytimer) viz.starttimer(0,0,viz.PERPETUAL) Last edited by whj; 04-08-2009 at 12:41 PM. |
#2
|
|||
|
|||
Seems like I can play a lot of animation paths in a specific schedule, but every animation path can be played only once. Otherwise it would be messed up. Any hint?
|
#3
|
|||
|
|||
It looks like you are creating 2 vizact.ontimer2 objects for the ball when you only need one that repeats once. Try changing the 3 to a 2 in this for loop
Code:
#Create an array of timer action myTimerAction = [] for x in range(3): |
#4
|
|||
|
|||
Hi,
I think the 3 is actually len(time_to_go) or len(object). Because I define 3 events. I just put "donothing" as the first event (for duck action), and put ball actions as the 2nd and the 3rd event. Thanks, Haojie |
#5
|
|||
|
|||
Seems to me that the array of myTimerAction got initialized correctly, but after path[x].pause() and path[x].reset(), the animation path were messed up. Any suggestion?
|
#6
|
|||
|
|||
This code loops three times
Code:
object = [1, 0, 0] #1 means duck, 0 means ball #Create an array of timer action myTimerAction = [] for x in range(3): if (x == 0) : myTimerAction.append(vizact.ontimer2(0, 1, donothing)) path[object[0]].play() else: wait = time_to_go[x] - time_to_go[0] myTimerAction.append(vizact.ontimer2(wait, 1, path[object[x]].play)) |
#7
|
|||
|
|||
I don't understand that "a timer object is created that will repeat one time, so the ball's path will be played twice." Why will it REPEAT one time? I thought the ball should be play only two times in a total. How do you suggest to change my reset code?
Thanks a lot! |
#8
|
|||
|
|||
Because you have repeats set to 1 this timer will be called twice and the path will be played twice.
Code:
vizact.ontimer2(wait, 1, path[object[x]].play) |
#9
|
|||
|
|||
Oh!!! I always thought the second argument of vizact.ontimer2 was the number of times to active the timer. Sorry about that. I should set it to 0. I'll correct it and see what happened....
Thanks a lot! |
#10
|
|||
|
|||
Thank you, Jeff. It works!
Now I make a little change on the reset part. I would like to reset the object (duck or ball) right before being played. But I got the following error: Traceback (most recent call last): File "C:\Program Files\WorldViz\Vizard30/python\vizact.py", line 2980, in __ontimer val = event.call() File "C:\Program Files\WorldViz\Vizard30/python\vizact.py", line 2803, in _callStatic return self.func(*self.args,**self.kwargs) TypeError: 'NoneType' object is not callable Could you please help me find the problem again? Thanks! Code:
import viz import math viz.go() viz.clearcolor(0.5,0.5,1) viz.add('tut_ground.wrl') #Add 2 models. #One is a ball, the other is a duck. model = [] ball = viz.add('ball.wrl') duck = viz.add('duck.cfg') model.append(ball) model.append(duck) #Add the path. #path[0] is for the ball, path[1] is for the duck. path = [] for x in range(2): pa = viz.addAnimationPath() path.append(pa) positions = [ [5,1,6], [0,1,3], [-150,1,6] ] for x in range(len(positions)): cp = viz.addControlPoint() cp.setPosition(positions[x]) path[0].add(cp,x+1) path[1].add(cp,x+1) for x in range(2): path[x].constantspeed(viz.ON,10) path[x].loop(viz.OFF) path[x].translatemode(viz.BEZIER) path[x].setAutoRotate(viz.ON) #Link the model to a path. ball.link(path[0]) duck.link(path[1]) def mytimer(num): pass def reset(k): path[k].pause() path[k].reset() model[k].setPosition(0,0,0) #The following arrays means: #Firstly: duck start to move #After 3 seconds, ball start to move #After another 3 seconds, ball start to move again time_to_go = [0, 3, 6] object = [1, 0, 0] #1 means duck, 0 means ball #Create an array of timer action for x in range(len(object)): if (x == 0) : path[object[0]].play() else: wait = time_to_go[x] - time_to_go[0] vizact.ontimer2(wait, 0, reset(object[x])) vizact.ontimer2(wait+0.00001, 0, path[object[x]].play) viz.callback(viz.TIMER_EVENT,mytimer) viz.starttimer(0,0,viz.PERPETUAL) |
#11
|
|||
|
|||
The error is in this line
Code:
vizact.ontimer2(wait, 0, reset(object[x])) Code:
vizact.ontimer2(wait, 0, reset, object[x]) |
#12
|
|||
|
|||
Thank you so much for your help, especially at weekend.
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
array problem | mrvr | Vizard | 8 | 03-10-2014 09:20 PM |
Sound Looping Problem | JMOwens | Vizard | 4 | 09-29-2010 09:42 PM |
Timer speed | Jerry | Vizard | 1 | 12-08-2006 11:01 AM |
problem with female animations | vmonkey | Vizard | 1 | 10-07-2005 10:36 AM |
Weird lagging/choppiness when avatars perform actions | vjonshih | Vizard | 8 | 11-30-2004 04:08 PM |