Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
Sprite animation from sprite sheet at 8 FPS?
-
@JonB, I’ve also never used Action.wait before, so I’d appreciate an example of this, thanks.
Remember, I’m still a noob here lol
-
@Vile :
import time #this module is needed to get the system time
In your set-up code:
self.last_update = time.process_time()
In your update method:
current_time = time.process_time() if current_time - self.last_update > 0.125: self.last_update = current_time modify_the_sprite
-
I tried your method, but it seems that anything I put into the update function doesn’t get used...
Here’s the updated code:
from scene import * import time sprite_sheet = [ Texture('IMG_0227.png').subtexture(Rect(0,0,0.25,1)), Texture('IMG_0227.png').subtexture(Rect(0.25,0,0.25,1)), Texture('IMG_0227.png').subtexture(Rect(0.5,0,0.25,1)), Texture('IMG_0227.png').subtexture(Rect(0.75,0,.25,1)), ] class MyScene (Scene): def setup(self): self.screen="game" self.background_color = 'black' self.last_update = time.process_time() self.sprite = SpriteNode(sprite_sheet[0], scale = 1, position = self.size / 2, parent = self) self.add_child(self.sprite) n=0 def update(self): current_time = time.process_time() if current_time - self.last_update > 0.125: self.last_update = current_time #modify_the_sprite self.sprite.texture=sprite_sheet[n] n=n+1 run(MyScene())
-
Wait it actually works, I just had the wrong indentation on the update function XD
Here’s the code:
from scene import * import time sprite_sheet = [ Texture('IMG_0227.png').subtexture(Rect(0,0,0.25,1)), Texture('IMG_0227.png').subtexture(Rect(0.25,0,0.25,1)), Texture('IMG_0227.png').subtexture(Rect(0.5,0,0.25,1)), Texture('IMG_0227.png').subtexture(Rect(0.75,0,.25,1)), ] class MyScene (Scene): def setup(self): self.screen="game" self.background_color = 'black' self.last_update = time.process_time() self.sprite = SpriteNode(sprite_sheet[0], scale = 1, position = self.size / 2, parent = self) self.add_child(self.sprite) self.n=0 def update(self): #self.sprite.texture=sprite_sheet[1] current_time = time.process_time() if current_time - self.last_update > 0.05: self.last_update = current_time #modify_the_sprite self.sprite.texture=sprite_sheet[self.n] self.n=self.n+1 if self.n > 3: self.n=0 run(MyScene())
Thanks a lot for your help!
-
dont use time.process_time. instead use scene.t -- scene includes t which is the time since the start of the scene, and dt, which is the time since last update.
-
@JonB, I tried using scene.t and scene.dt, but I can’t get it working...
-
Instead of using the time function that I suggested, put Scene.t (mind the capital S)
CORRECTION: it is self.t (instance attribute), thanks @JonB
self.dt is not directly suitable for your case; it gives you the time lapsed since the last call to update().
-
I think it should be self.t.
it is an instance attribute, not a class attrib, if memory serves -- the time is incremented in the running scene only. -
Following @JonB advice, this works
. . . self.last_t = self.t def update(self): #self.sprite.texture=sprite_sheet[1] if (self.t-self.last_t) > 0.05: #modify_the_sprite self.last_t = self.t . . .
-
-