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 already looked at the game tutorial, where it showed how to animate a walking sequence. However, that method only works when the sprite is changing its position in pixels on the screen, so it will not work for my sprite. This is because my sprite’s position is constantly at the centre of the screen.
The effect I’m trying to achieve is basically a GIF with a customisable frame speed, which is permanently in exactly the same position at the centre of the screen.
-
@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 . . .
-
-