[Python] I want to add collision detection [duplicate]

Discussão em 'Python' iniciado por Stack, Abril 15, 2025.

  1. Stack

    Stack Membro Participativo

    It's my first game Im working on. And Collision detections are where my first roadblock is. Im new to coding so I would like to see where I went wrong, and how can I get better. My code is heavily inspired by user @rabbid76, and a lot of other sources found on internet. I started my developement recently and I want to better understand it.

    import pygame
    import sys
    import os
    import math
    import random

    # Initialize PyGame and fonts
    pygame.init()
    pygame.font.init()

    # Set up the game window
    screen_width = 1440
    screen_height = 900
    screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
    pygame.display.set_caption("cubic_days")

    # Set up the font object
    scorefont = pygame.font.SysFont("comicsansms", 36)

    # Set the frame rate
    clock = pygame.time.Clock()

    score = 0

    # Player settings
    player_width = 50
    player_height = 50
    player_x = screen_width // 2 - player_width // 2
    player_y = screen_height // 2 - player_height // 2
    player_speed = 5

    # Enemy settings
    enemy_width = 45
    enemy_height = 60
    enemy_speed = 4
    enemies = []

    # Spawn an enemy every 2 seconds minus one fourth of score
    enemy_timer = 0
    enemy_spawn_time = 2000 - score/4

    class Bullet:
    def __init__(self, x, y):
    self.pos = (player_x+23, player_y+2)
    mx, my = pygame.mouse.get_pos()
    self.dir = (mx - player_x, my - player_y)
    length = math.hypot(*self.dir)
    if length == 0.0:
    self.dir = (0, -1)
    else:
    self.dir = (self.dir[0]/length, self.dir[1]/length)
    angle = math.degrees(math.atan2(-self.dir[1], self.dir[0]))
    self.bullet = pygame.Surface((20, 12)).convert_alpha()
    self.bullet.fill((255, 255, 255))
    self.bullet = pygame.transform.rotate(self.bullet, angle)
    self.speed = 11.5

    def update(self):
    self.pos = (self.pos[0]+self.dir[0]*self.speed,
    self.pos[1]+self.dir[1]*self.speed)

    def draw(self, surf):
    bullet_rect=self.bullet.get_rect(center=self.pos)
    surf.blit(self.bullet, bullet_rect)

    pos = (player_x+23, player_y+2)
    bullets = []
    # loading image zone
    bg = pygame.image.load("bg.png")
    player_character = pygame.image.load("prototype.png")

    # shooting sound
    firing = pygame.mixer.Sound("fire.mp3")

    # beginner music playing script, i bet you expected more
    pygame.mixer.music.load("Forest_Funk.mp3")
    pygame.mixer.music.play(-1)

    # Main game loop
    while True:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    pygame.quit()
    sys.exit()
    if event.type == pygame.MOUSEBUTTONDOWN:
    bullets.append(Bullet(*pos))
    pygame.mixer.Sound.play(firing)

    Bullet.pos = (player_x, player_y)

    # Collision detection function
    def check_collision(Bullets, enemies):
    return Bullet.colliderect(enemies, False)

    # Check for collisions
    for bullet in bullets[:]:
    for enemy in enemies[:]:
    if check_collision((Bullet.pos[0], Bullet.pos[1]), (enemy[0], enemy[1], enemy_width, enemy_height)):
    bullets.remove(bullet)
    enemies.remove(enemy)
    score += 1
    break

    # Handle player movement
    keys = pygame.key.get_pressed()
    if keys[pygame.K_a]:
    player_x -= player_speed
    if keys[pygame.K_d]:
    player_x += player_speed
    if keys[pygame.K_s]:
    player_y += player_speed
    if keys[pygame.K_w]:
    player_y -= player_speed
    # exit code, yay. no more using alt tab
    if keys[pygame.K_ESCAPE]:
    pygame.quit()
    sys.exit()

    # Update enemy positions and spawn new ones
    current_time = pygame.time.get_ticks()
    if current_time - enemy_timer > enemy_spawn_time:
    enemy_x = random.randint(0, screen_width - enemy_width)
    enemy_y = -enemy_height
    enemies.append(pygame.Rect(enemy_x, enemy_y, enemy_width, enemy_height))
    enemy_timer = current_time

    for enemy in enemies:
    enemy.y += enemy_speed

    # Remove enemies that are off the screen
    enemies = [enemy for enemy in enemies if enemy.y < screen_height]

    screen.blit(bg, (0, 0))

    pygame.draw.rect(screen, (0, 128, 255), (player_x, player_y, player_width, player_height))

    for bullet in bullets[:]:
    bullet.update()
    if not screen.get_rect().collidepoint(bullet.pos):
    bullets.remove(bullet)

    for bullet in bullets:
    bullet.draw(screen)

    # Draw the enemies
    for enemy in enemies:
    pygame.draw.rect(screen, (255, 0, 0), enemy)

    pygame.display.update()

    Continue reading...

Compartilhe esta Página