Python Forum
How to make enemy chase me in pygame? - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Game Development (https://python-forum.io/forum-11.html)
+--- Thread: How to make enemy chase me in pygame? (/thread-35614.html)



How to make enemy chase me in pygame? - Jan_97 - Nov-22-2021

I've been working on a mini project for a while and I want to make an enemy object follow my player object around the map. I've tried various things like using functions in the while loop, making function that uses both enemy and player classes to deal with if statements etc, but nothing that I come up with is good enough. I'm also a little surprised at how few examples there are of this type of scenario, as I've tried to find some good showcasings for this type of task.

I've removed all code that isn't directly relevant to what I want to do to make it easier to read.

Any help is appreciated. I'm trying to learn pygame but it isn't easy for me...

import pygame,sys


#Color definitions
BLUE = (10,10,128)
RED = (255,0,0)
BLACK = (0,0,0)
#Screen width

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600


pygame.init()




class Player(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super().__init__()
        self.image = pygame.Surface([50,45])
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x
        self.score = 0

        self.change_x = 0
        self.change_y = 0
        self.walls = None

    def changespeed(self,x,y):
        self.change_x += x
        self.change_y += y

    def update(self):
        self.rect.x += self.change_x


        block_hit_list = pygame.sprite.spritecollide(self,self.walls, False)
        for block in block_hit_list:
            if self.change_x > 0:
                self.rect.right = block.rect.left
            else:
                self.rect.left = block.rect.right

        self.rect.y += self.change_y

        block_hit_list = pygame.sprite.spritecollide(self,self.walls, False)
        for block in block_hit_list:

            if self.change_y > 0:
                self.rect.bottom = block.rect.top
            else:
                self.rect.top = block.rect.bottom


class Player2(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super().__init__()
        self.image = pygame.Surface([50,45])
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x
        self.score = 0

        self.rect.x = 400
        self.rect.y = 40

        self.change_x = 0
        self.change_y = 0
        self.walls = None

    def changespeed(self,x,y):
        self.change_x += x
        self.change_y += y

    def update(self):
        self.rect.x += self.change_x





class Wall(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height):
        super().__init__()

        self.image = pygame.Surface([width, height])
        self.image.fill(BLUE)

        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x



#Wall init

wall_list = pygame.sprite.Group()

#Pygame definitions

screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
pygame.display.set_caption('test!')
all_sprite_list = pygame.sprite.Group()





#Left wall
wall = Wall(0,0,10,600)
wall_list.add(wall)
all_sprite_list.add(wall)
#top wall
wall = Wall(10,0,790,10)
wall_list.add(wall)
all_sprite_list.add(wall)

#Right wall
wall = Wall (790,0,10,600)
wall_list.add(wall)
all_sprite_list.add(wall)

#Bottom wall
wall = Wall (0,590,1000,300)
wall_list.add(wall)
all_sprite_list.add(wall)


#Create the player
player = Player(50,50)
all_sprite_list.add(player)
player.walls = wall_list

player2 = Player2(50,50)
all_sprite_list.add(player2)
player2.walls = wall_list


clock = pygame.time.Clock()

#Loop

done = False

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True


        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                player.changespeed(-3, 0)
            elif event.key == pygame.K_d:
                player.changespeed(3,0)
            elif event.key == pygame.K_w:
                player.changespeed(0,-3)
            elif event.key == pygame.K_s:
                player.changespeed(0,3)

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                player.changespeed(3,0)
            elif event.key == pygame.K_d:
                player.changespeed(-3,0)
            elif event.key == pygame.K_w:
                player.changespeed(0,3)
            elif event.key == pygame.K_s:
                player.changespeed(0,-3)


    all_sprite_list.update()
    screen.fill(BLACK)
    all_sprite_list.draw(screen)
    pygame.display.flip()
    clock.tick(60)
    pygame.display.flip()





pygame.quit()



RE: How to make enemy chase me in pygame? - metulburr - Nov-22-2021

Take a look at this code for pathfinding
https://github.com/Mekire/find-a-way-astar-pathfinding


RE: How to make enemy chase me in pygame? - BashBedlam - Nov-22-2021

Here you go. I've addedhumanto Player2and use those co-ordinates to have it chase Player. See line 62 and lines 81 through 89.
import pygame,sys
 
 
#Color definitions
BLUE = (10,10,128)
RED = (255,0,0)
BLACK = (0,0,0)
#Screen width
 
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
 
 
pygame.init()
 
 
 
 
class Player(pygame.sprite.Sprite):
	def __init__(self,x,y):
		super().__init__()
		self.image = pygame.Surface([50,45])
		self.image.fill(BLUE)
		self.rect = self.image.get_rect()
		self.rect.y = y
		self.rect.x = x
		self.score = 0
 
		self.change_x = 0
		self.change_y = 0
		self.walls = None
 
	def changespeed(self,x,y):
		self.change_x += x
		self.change_y += y
 
	def update(self):
		self.rect.x += self.change_x
 
 
		block_hit_list = pygame.sprite.spritecollide(self,self.walls, False)
		for block in block_hit_list:
			if self.change_x > 0:
				self.rect.right = block.rect.left
			else:
				self.rect.left = block.rect.right
 
		self.rect.y += self.change_y
 
		block_hit_list = pygame.sprite.spritecollide(self,self.walls, False)
		for block in block_hit_list:
 
			if self.change_y > 0:
				self.rect.bottom = block.rect.top
			else:
				self.rect.top = block.rect.bottom
 
 
class Player2(pygame.sprite.Sprite):
	def __init__(self,x,y,human):
		super().__init__()
		self.human = human
		self.image = pygame.Surface([50,45])
		self.image.fill(RED)
		self.rect = self.image.get_rect()
		self.rect.y = y
		self.rect.x = x
		self.score = 0
 
		self.rect.x = 400
		self.rect.y = 40
 
		self.change_x = 0
		self.change_y = 0
		self.walls = None
 
	def changespeed(self,x,y):
		self.change_x += x
		self.change_y += y
 
	def update(self):
		if self.human.rect.x > self.rect.x :
			self.rect.x += 1
		if self.human.rect.x < self.rect.x :
			self.rect.x -= 1
		if self.human.rect.y > self.rect.y :
			self.rect.y += 1
		if self.human.rect.y < self.rect.y :
			self.rect.y -= 1
 
 
 
 
 
class Wall(pygame.sprite.Sprite):
	def __init__(self,x,y,width,height):
		super().__init__()
 
		self.image = pygame.Surface([width, height])
		self.image.fill(BLUE)
 
		self.rect = self.image.get_rect()
		self.rect.y = y
		self.rect.x = x
 
 
 
#Wall init
 
wall_list = pygame.sprite.Group()
 
#Pygame definitions
 
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
pygame.display.set_caption('test!')
all_sprite_list = pygame.sprite.Group()
 
 
 
 
 
#Left wall
wall = Wall(0,0,10,600)
wall_list.add(wall)
all_sprite_list.add(wall)
#top wall
wall = Wall(10,0,790,10)
wall_list.add(wall)
all_sprite_list.add(wall)
 
#Right wall
wall = Wall (790,0,10,600)
wall_list.add(wall)
all_sprite_list.add(wall)
 
#Bottom wall
wall = Wall (0,590,1000,300)
wall_list.add(wall)
all_sprite_list.add(wall)
 
 
#Create the player
player = Player(50,50)
all_sprite_list.add(player)
player.walls = wall_list
 
player2 = Player2(50,50, player)
all_sprite_list.add(player2)
player2.walls = wall_list
 
 
clock = pygame.time.Clock()
 
#Loop
 
done = False
 
while not done:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			done = True
 
 
		elif event.type == pygame.KEYDOWN:
			if event.key == pygame.K_a:
				player.changespeed(-3, 0)
			elif event.key == pygame.K_d:
				player.changespeed(3,0)
			elif event.key == pygame.K_w:
				player.changespeed(0,-3)
			elif event.key == pygame.K_s:
				player.changespeed(0,3)
 
		elif event.type == pygame.KEYUP:
			if event.key == pygame.K_a:
				player.changespeed(3,0)
			elif event.key == pygame.K_d:
				player.changespeed(-3,0)
			elif event.key == pygame.K_w:
				player.changespeed(0,3)
			elif event.key == pygame.K_s:
				player.changespeed(0,-3)
 
 
	all_sprite_list.update()
	screen.fill(BLACK)
	all_sprite_list.draw(screen)
	pygame.display.flip()
	clock.tick(60)
	pygame.display.flip()
 
 
 
 
 
pygame.quit()



RE: How to make enemy chase me in pygame? - Jan_97 - Nov-23-2021

Thank you guys.