= PyGame Sprites I As found in [[bullet game]]. The first kind of sprite we used is a simple kind of sprite that we drew ourselves. == Creating the Sprite In Bullet game, we have a "class Zombie". Here is a brief analysis of the code. === init() To create the image of the sprite, we create a pygame surface large enough to hold the sprite. In this particular case we just want a square so we will use image.fill() on the surface to paint it a certain color. Then we're done. We get the rect info and set the rect.center and we're done. dx and dy is directional information we will use in update(). === update() In this case, update() is a somewhat special function that is intended to be called at regular intervals, in this case every frame (ex. 60 fps is 60 times per second). Understanding update() is very easy: * 1. Step the movement (using the speed variable). In this case we move once per second. * 2. Animate the image (changing the image we use based on time). This can be done in various ways, the way shown is not a requirement. * 3. handle movement by modifying rect.x and rect.y * 4. handle bounds (in this case if it goes off screen we remove it from the game). * 5. anything else The update function is usually the only hook function you will need, but you can create others to help you control the sprite in your game. One idea is to make an explosion routine that replaces the image with an explosion temporarily before removing it from the game. == The Code # Define the Zombie Sprite class SpaceShip(pygame.sprite.Sprite): HEIGHT = 20 WIDTH = 50 SPEED = 60 def __init__(self, x, y, dx = 0, dy = -1): super().__init__() # Create a surface for the bullet self.image = pygame.Surface((self.WIDTH, self.HEIGHT)) # Fill the surface with a color self.image.fill(self.COLOR) # Get the rectangle for positioning self.rect = self.image.get_rect() # directional info self.dx = dx self.dy = dy self.speed = self.SPEED # Set the initial position self.rect.center = (x, y) self.timer = 0 self.start = time.time() * 1000 def update(self): self.timer = (time.time() * 1000) - self.start # Wait to move zombie self.speed -= 1 if self.speed > 0: return # alternate image every time we move. if self.frame == 0: self.frame = 1 self.image = self.image_b else: self.frame = 0 self.image = self.image_a # Speed is 0, 'tick' to move: self.speed = self.SPEED # Move the zombie directionally self.rect.x += self.dx * self.STEP self.rect.y += self.dy * self.STEP if self.rect.bottom < 0: self.kill() print("zombie escaped n") if self.rect.top > Screen.HEIGHT: self.kill() print("zombie escaped s") if self.rect.left < 0: self.kill() print("zombie escaped w") if self.rect.right > Screen.WIDTH: self.kill() print("zombie escaped e")