0
\$\begingroup\$

I'm trying to get a turtle sprite to chase a falling algae sprite utilising Pygame's inbuilt functionality. I have spent many hours reviewing questions and answers and suspect I'm missing some foundational logic as a beginner.

Below is the full code pared down to essential lines only.

No errors are displayed, yet the turtle sprite does not move.

import pygame
import random
from random import randint

#GLOBAL VARIABLES
BACKGROUND_COLOR = pygame.Color('black')
screen_width = 1400
screen_height = 1000
win = pygame.display.set_mode((screen_width, screen_height))
display_surface = pygame.display.get_surface()
display_rect = display_surface.get_rect()
clock = pygame.time.Clock()

class Turtle(pygame.sprite.Sprite):
    def __init__(self):
        super(Turtle, self).__init__()
        self.image = pygame.image.load('T10.png').convert_alpha()
        self.x = random.randrange(60, (screen_width - 60), 1)                                                
        self.y = random.randrange(60, (screen_height - 60), 1) 
        self.pos = pygame.Vector2(self.x, self.y)
        self.rect = self.image.get_rect()
        self.rect.x = self.x
        self.rect.y = self.y
        self.velocity = 5

    def move(self):
        self.pos.move_towards_ip(algae.pos, self.velocity)

    def update(self):
        self.move()

class Algae(pygame.sprite.Sprite):
    def __init__(self):
        super(Algae, self).__init__()
        self.width = 20
        self.height = 20
        self.surf = pygame.Surface((self.width, self.height), pygame.SRCALPHA)
        self.rect = self.surf.get_rect()
        self.x = -5
        self.y = -5
        self.pos = pygame.Vector2(self.x, self.y)
        pygame.draw.circle(self.surf, pygame.Color('green'), (10, 10), 4)
        self.list = []
        

pygame.init()
pygame.display.set_caption("EvoSim")

turtle = Turtle()
algae = Algae()
turtle_group = pygame.sprite.Group(turtle)
algae_group = pygame.sprite.Group(algae)
all_sprites = pygame.sprite.Group()
collide_list = pygame.sprite.Group(algae)                       #not currently in use

algae_spawn = pygame.USEREVENT + 1                              #algae spawn event
pygame.time.set_timer(algae_spawn, randint(0, 10000))           #algae spawn timer

def main():
    while True:
        clock.tick(15)
        bg = pygame.image.load('bg.png')
        win.blit(bg, (0, 0))
        turtle.rect.clamp_ip(pygame.display.get_surface().get_rect())
        turtle_group.draw(win)
        turtle_group.update()

        for event in pygame.event.get():                 
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == algae_spawn:      #falling algae spawn on random timer
                algae.x = random.randrange(10, win.get_width()-10)
                algae.list.append(pygame.Rect(algae.x, -20, 20, 20))
                collide_list.add(algae)

        for algae.rect in algae.list[:]:
            algae.rect.y += 1                                      
            if algae.rect.top > win.get_height():                   
                algae.list.remove(algae.rect)

        for algae.rect in algae.list:
            win.blit(algae.surf, algae.rect)
    

        pygame.display.update()

if __name__ == '__main__':
    main()
\$\endgroup\$
2
  • 1
    \$\begingroup\$ Am I reading this correctly that pos is a variable you've defined for Turtle, not part of the Sprite base class? If so, just changing pos won't tell the sprite to move. You'd need to copy the new values from pos into the sprite's position (which from examples I'm looking at seems to be done via its rect member). \$\endgroup\$
    – DMGregory
    Nov 15 at 19:46
  • \$\begingroup\$ Thank you for sharing and taking the time to review. Your answer worked perfectly. \$\endgroup\$
    – Lone
    Nov 16 at 13:26

1 Answer 1

1
\$\begingroup\$

pygame.sprite.Group.draw:

Draws the contained Sprites to the Surface argument. This uses the Sprite.image attribute for the source surface, and Sprite.rect for the position.

So we need to update image.rect after the image position changes:

    def move(self):
        self.pos.move_towards_ip(algae.pos, self.velocity)
        self.rect.x = self.pos.x
        self.rect.y = self.pos.y
\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .