![]() |
|
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 added humanto 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. |