Python Forum
[PyGame] Problem with collision of player and enemy
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyGame] Problem with collision of player and enemy
#1
Question 
The game ends even though player did not touch the enemy in this code.
I do believe there is a problem with collision or with the image size of player and enemy, can anybody help me with this?

---

import pygame
import random
import sys
from pygame.locals import *

pygame.init()

screen_width = 1280  
screen_height = 720  
screen = pygame.display.set_mode((screen_width, screen_height))

clock = pygame.time.Clock()
player = pygame.image.load("C:/Users/USER/Downloads/Player.png")
player_size = player.get_rect().size
player_width = player_size[0]
player_height = player_size[1]
player = pygame.transform.scale(player, (int(player_width * 0.5), int(player_height * 0.5)))
player_x_pos = (screen_width / 2) - (player_width / 2)
player_y_pos = (screen_height / 2) - (player_height / 2)

to_x = 0
to_y = 0

font = pygame.font.SysFont('Sans', 30)
start_time = 0
second = 0

def game_restart(_second):
    restart_screen = pygame.display.set_mode((screen_width, screen_height))

    pygame.font.init()
    game_restart_font = pygame.font.SysFont('Sans', 30, True, True)
    game_restart_message = 'Game Over.'
    game_restart_object = game_restart_font.render(game_restart_message, True, (0, 0, 0))

    game_time_message = str(_second) + 's'
    game_time_object = game_restart_font.render(game_time_message, True, (255, 0, 0))

    running = True

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    running = True
        restart_screen.fill((255, 255, 255))
        restart_screen.blit(game_restart_object, (screen_width / 2, screen_height / 2))
        restart_screen.blit(game_time_object, (screen_width / 2, screen_height / 1.8))

        pygame.display.update()

# enemy
enemy_list = list()
class enemy_class:
    enemy_image = pygame.image.load("C:/Users/USER/Downloads/Enemy.png")
    enemy_size = enemy_image.get_rect().size
    enemy_width = enemy_size[0]
    enemy_height = enemy_size[1]
    enemy_image = pygame.transform.scale(enemy_image, (int(enemy_width * 0.5), int(enemy_height * 0.5)))
    enemy_x_pos = 0
    enemy_y_pos = 0
    enemy_speed = 0
    enemy_spawnPoint = None
    enemy_rad = 0

    def __init__(self):
        self.enemy_speed = random.choice([0.5, 1, 1.5, 2])
        self.enemy_spawnPoint = random.choice(['UP', 'DOWN', 'LEFT', 'RIGHT'])
        if self.enemy_spawnPoint == 'LEFT':
            self.enemy_x_pos = -self.enemy_width
            self.enemy_y_pos = random.randint(0, screen_height - self.enemy_height)
            self.enemy_rad = random.choice([(1, 3), (1, 2), (2, 2), (2, 1), (3, 1), (3, 0), (1, -3), (1, -2), (2, -2), (2, -1), (3, -1)])
        elif self.enemy_spawnPoint == 'RIGHT':
            self.enemy_x_pos = screen_width
            self.enemy_y_pos = random.randint(0, screen_height - self.enemy_height)
            self.enemy_rad = random.choice([(-1, 3), (-1, 2), (-2, 2), (-2, 1), (-3, 1), (-3, 0), (-1, -3), (-1, -2), (-2, -2), (-2, -1), (-3, -1)])
        elif self.enemy_spawnPoint == 'UP':
            self.enemy_x_pos = random.randint(0, screen_width - self.enemy_width)
            self.enemy_y_pos = -self.enemy_height
            self.enemy_rad = random.choice([(3, 1), (2, 1), (2, 2), (1, 2), (1, 3), (0, 3), (-3, 1), (-2, 1), (-2, 2), (-1, 2), (-1, 3)])
        elif self.enemy_spawnPoint == 'DOWN':
            self.enemy_x_pos = random.randint(0, screen_width - self.enemy_width)
            self.enemy_y_pos = screen_height
            self.enemy_rad = random.choice([(3, -1), (2, -1), (2, -2), (1, -2), (1, -3), (0, -3), (-3, -1), (-2, -1), (-2, -2), (-1, -2), (-1, -3)])

    def enemy_move(self):
        self.enemy_x_pos += self.enemy_speed * self.enemy_rad[0]
        self.enemy_y_pos += self.enemy_speed * self.enemy_rad[1]

    def boundary_UP(self):
        if self.enemy_y_pos < -self.enemy_height:
            return True

    def boundary_DOWN(self):
        if self.enemy_y_pos > screen_height:
            return True

    def boundary_LEFT(self):
        if self.enemy_x_pos < -self.enemy_width:
            return True

    def boundary_RIGHT(self):
        if self.enemy_x_pos > screen_width:
            return True

    def enemy_coll(self):
        self.enemy_rect = self.enemy_image.get_rect()
        self.enemy_rect.left = self.enemy_x_pos
        self.enemy_rect.top = self.enemy_y_pos

running = True

while running:
    clock.tick(30)

    screen.fill((255, 255, 255))

    time_since_enter = pygame.time.get_ticks() - start_time
    if time_since_enter > 1000:
        start_time = pygame.time.get_ticks()
        second += 1

    game_time_message = font.render(str(second) + 's', True, (255, 0, 0))
    screen.blit(game_time_message, (screen_width - game_time_message.get_width(), 0))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                to_x -= 7
            elif event.key == pygame.K_RIGHT:
                to_x += 7
            elif event.key == pygame.K_UP:
                to_y -= 7
            elif event.key == pygame.K_DOWN:
                to_y += 7

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                to_x = 0
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                to_y = 0

    player_x_pos += to_x
    player_y_pos += to_y

    if player_x_pos < 0:
        player_x_pos = 0
    elif player_x_pos > screen_width - player_width:
        player_x_pos = screen_width - player_width

    if player_y_pos < 0:
        player_y_pos = 0
    elif player_y_pos > screen_height - player_height:
        player_y_pos = screen_height - player_height

    enemy_list.append(enemy_class())


    # collision
    player_rect = player.get_rect()
    player_rect.left = player_x_pos
    player_rect.top = player_y_pos

    for i in enemy_list:
        i.enemy_coll()
        if player_rect.colliderect(i.enemy_rect):
            game_restart(second)



   
    screen.blit(player, (player_x_pos, player_y_pos))

    for i in enemy_list:
        i.enemy_move()
        screen.blit(i.enemy_image, (i.enemy_x_pos, i.enemy_y_pos))

    pygame.display.update()

pygame.quit()
buran write Dec-08-2023, 06:46 AM:
Please, use proper tags when post code, traceback, output, etc. This time I have added tags for you.
See BBcode help for more info.

Attached Files

Thumbnail(s)
       
Reply
#2
Your images are much larger than the painted part of the image. Crop the image to remove as much surround empty space as possible and your results will be better.

If you still don't like the collision detection, treat your images as circles and compute the distance between centers.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyGame] platformer enemy animation Yegor123 3 2,037 May-03-2023, 08:42 AM
Last Post: Windspar
  can't get collision detection to work in platform game chairmanme0wme0w 10 3,835 Aug-19-2022, 03:51 PM
Last Post: deanhystad
  How to make enemy chase me in pygame? Jan_97 3 4,429 Nov-23-2021, 05:08 PM
Last Post: Jan_97
  [PyGame] Collision in not happening onizuka 3 3,429 Sep-07-2020, 11:30 AM
Last Post: metulburr
  [PyGame] No collision detection onizuka 6 3,681 Aug-18-2020, 01:29 PM
Last Post: onizuka
  [PyGame] pygame, help with making a function to detect collision between player and enemy. Kris1996 3 3,359 Mar-07-2020, 12:32 PM
Last Post: Kris1996
  Problem with collision detection... michael1789 4 3,284 Nov-12-2019, 07:49 PM
Last Post: michael1789
  Arcade Collision Problem randor 0 2,695 Oct-28-2019, 11:17 PM
Last Post: randor
  Multiple wall collision in pacman rustyjoe 4 4,124 Aug-11-2019, 08:08 AM
Last Post: rustyjoe
  drawing, moving, and collision problems (pygame) SheeppOSU 26 14,768 Apr-22-2019, 03:09 AM
Last Post: SheeppOSU

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020