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...