1

Im trying to make an enemy follow the player which is moved by the mouse. The player spawns in but does not move. Here is my (new & edited)code : This is the player class (no problem with that):

class Player(pg.sprite.Sprite):
def __init__(self):
    self.groups = all_sprites
    pg.sprite.Sprite.__init__(self, self.groups)
    self.image = pg.Surface((Player_SIZE, Player_SIZE))
    self.image.fill(BLUE)
    self.rect = self.image.get_rect()
    self.pos = vec(randint(0, WIDTH), randint(0, HEIGHT))
    self.vel = vec(MAX_SPEED, 0).rotate(uniform(0, 360))
    self.acc = vec(0, 0)
    self.rect.center = self.pos

def follow_mouse(self):
    mpos = pg.mouse.get_pos()
    self.acc = (mpos - self.pos).normalize() * 0.5

def seek(self, target):
    self.desired = (target - self.pos).normalize() * MAX_SPEED
    steer = (self.desired - self.vel)
    if steer.length() > MAX_FORCE:
        steer.scale_to_length(MAX_FORCE)
    return steer

def seek_with_approach(self, target):
    self.desired = (target - self.pos)
    dist = self.desired.length()
    self.desired.normalize_ip()
    if dist < APPROACH_RADIUS:
        self.desired *= dist / APPROACH_RADIUS * MAX_SPEED
    else:
        self.desired *= MAX_SPEED
    steer = (self.desired - self.vel)
    if steer.length() > MAX_FORCE:
        steer.scale_to_length(MAX_FORCE)
    return steer

def update(self):
    # self.follow_mouse()
    self.acc = self.seek_with_approach(pg.mouse.get_pos())
    # equations of motion
    self.vel += self.acc
    if self.vel.length() > MAX_SPEED:
        self.vel.scale_to_length(MAX_SPEED)
    self.pos += self.vel
    if self.pos.x > WIDTH:
        self.pos.x = 0
    if self.pos.x < 0:
        self.pos.x = WIDTH
    if self.pos.y > HEIGHT:
        self.pos.y = 0
    if self.pos.y < 0:
        self.pos.y = HEIGHT
    self.rect.center = self.pos
 

This is the enemy class:

class Enemy(pg.sprite.Sprite):
def __init__(self):
    self.groups = all_sprites
    pg.sprite.Sprite.__init__(self, self.groups)
    self.image = pg.Surface((Player_SIZE, Player_SIZE))
    self.image.fill(RED)
    self.rect = self.image.get_rect()
    self.pos = vec(randint(0, WIDTH), randint(0, HEIGHT))
    self.vel = vec(MAX_SPEED1, 0).rotate(uniform(0, 360))
    self.acc = vec(0, 0)
    self.rect.center = self.pos

def follow_player1(self):
    ppos = self.pos.x, self.pos.y
    self.acc = (ppos - self.pos).normalize() * 0.5

def seek1(self, target):
    self.desired = (ppos - self.pos).normalize() * MAX_SPEED1
    steer = (self.desired - self.vel)
    if steer.length() > MAX_FORCE1:
        steer.scale_to_length(MAX_FORCE1)
    return steer

def seek_with_approach1(self, target):
    self.desired = (ppos - self.pos)
    dist = self.desired.length()
    self.desired.normalize_ip()
    if dist < APPROACH_RADIUS:
        self.desired *= dist / APPROACH_RADIUS * MAX_SPEED1
    else:
        self.desired *= MAX_SPEED1
    steer = (self.desired - self.vel)
    if steer.length() > MAX_FORCE1:
        steer.scale_to_length(MAX_FORCE1)
    return steer

def update1(self):
    # self.follow_mouse()
    self.acc = self.seek_with_approach(ppos)
    # equations of motion
    self.vel += self.acc
    if self.vel.length() > MAX_SPEED1:
        self.vel.scale_to_length(MAX_SPEED1)
    self.pos += self.vel
    if self.pos.x > WIDTH:
        self.pos.x = 0
    if self.pos.x < 0:
        self.pos.x = WIDTH
    if self.pos.y > HEIGHT:
        self.pos.y = 0
    if self.pos.y < 0:
        self.pos.y = HEIGHT
    self.rect.center = self.pos

This is the main loop (Game loop, and there is no problem with it... I think):

#Main loop
all_sprites = pg.sprite.Group()
Player()
Enemy()
paused = False
running = True
while running:
    clock.tick(FPS)
    for event in pg.event.get():
        if event.type == pg.QUIT:
            running = False
               

    if not paused:
        all_sprites.update()

    screen.fill(DARKGRAY)
    all_sprites.draw(screen)

    pg.display.flip()

pg.quit()

I will be editing the code if I changed anything dramatic. Thank you in advance

Rabbid76
  • 177,135
  • 25
  • 101
  • 146
Summon
  • 77
  • 4
  • 2
    The `'''` should be `\`\`\`` for the code formatting to work correctly. Or you could simply just remove them if you've indented all code one step. – Ted Klein Bergman Mar 22 '21 at 22:05
  • 3
    Python tends to do a good job of giving descriptive error messages. That stack trace should have the line number, though just searching your code for `ppos` makes it pretty obvious you're using that variable in three places where it could only work if that variable is defined outside of this class. Which it apparently isn't, given the error. – kungphu Mar 22 '21 at 23:30
  • this still does nothing to the enemy – Summon Mar 23 '21 at 12:02
  • Related: [pygame 2 dimensional movement of an enemy towards the player, how to calculate x and y velocity?](https://stackoverflow.com/questions/66404707/pygame-2-dimensional-movement-of-an-enemy-towards-the-player-how-to-calculate-x/66406985#66406985) and [How to make smooth movement in pygame](https://stackoverflow.com/questions/64087982/how-to-make-smooth-movement-in-pygame/64088747#64088747) – Rabbid76 Sep 30 '21 at 20:50

0 Answers0