import math import pygame SCREEN_WIDTH = 1280 SCREEN_HEIGHT = 720 class Game: def __init__(self): pygame.init() pygame.display.set_caption("School Game") self.clock = pygame.Clock() self.screen: pygame.Surface = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) ) self.display: pygame.Surface = pygame.Surface( (self.screen.get_width() // 2, self.screen.get_height() // 2) ) self.movement: list[bool] = [False, False, False, False] self.running: bool = True self.dt: int = 0 self.player_pos = pygame.Vector2(self.display.get_width() / 2, self.display.get_height() / 2) self.item_rect = pygame.Rect(60, 40, 10, 10) self.flashlight_rect = (self.player_pos, 50) self.flashlight = 0 self.color_item = (0, 0, 0) self.speed = 300 self.player_width = 20 self.player_height = 20 self.walls = [ pygame.Rect(100, 100, 20, 50) ] # self.circle = pygame.geometry.Circle(self.player_pos[0], self.player_pos[1], 30) def run(self) -> None: while self.running: # Background self.display.fill((0, 0, 0, 0)) self.player_rect = pygame.Rect(self.player_pos[0]-10, self.player_pos[1]-10, self.player_width, self.player_height) # Event-Keys for event in pygame.event.get(): if event.type == pygame.QUIT: self.running = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: self.running = False if event.key == pygame.K_LSHIFT: self.speed = 600 if event.type == pygame.KEYUP: if event.key == pygame.K_LSHIFT: self.speed = 300 # Player-Draw # self.flashlight = pygame.draw.circle(self.display, (255, 255, 255, 0), self.flashlight_rect[0], self.flashlight_rect[1]) """RAYCASTING""" ray_end = pygame.Vector2() light_points = [] vector = pygame.Vector2(75, 0) # Lichtstrahlen berechnen for i in range(360): rotated = vector.rotate(i) ray_end = self.player_pos + rotated # Überschneidung mit den Wänden prüfen for wall in self.walls: überschneidung = wall.clipline(self.player_pos, ray_end) if überschneidung: schnittpunkt = pygame.Vector2(überschneidung[0]) ray_end = schnittpunkt light_points.append(ray_end) pygame.draw.polygon( self.display, "yellow", light_points ) pygame.draw.rect(self.display, self.color_item, self.item_rect) pygame.draw.rect(self.display, (255, 0, 0), self.player_rect) for wall in self.walls: pygame.draw.rect(self.display, "grey", wall) # Smooth Movement keys = pygame.key.get_pressed() if keys[pygame.K_w]: self.player_pos.y -= self.speed * self.dt if keys[pygame.K_s]: self.player_pos.y += self.speed * self.dt if keys[pygame.K_a]: self.player_pos.x -= self.speed * self.dt if keys[pygame.K_d]: self.player_pos.x += self.speed * self.dt if self.player_pos[1] < self.player_height/2: self.player_pos[1] = self.player_height/2 if self.player_pos[1] > SCREEN_HEIGHT/2-self.player_height/2: self.player_pos[1] = SCREEN_HEIGHT/2-self.player_height/2 if self.player_pos[0] < self.player_width/2: self.player_pos[0] = self.player_width/2 if self.player_pos[0] > SCREEN_WIDTH/2-self.player_width/2: self.player_pos[0] = SCREEN_WIDTH/2-self.player_width/2 if self.rect_circle_collision(self.item_rect, self.flashlight_rect): self.color_item = (0, 0, 255) else: self.color_item = (0, 0, 0) self.screen.blit( pygame.transform.scale(self.display, self.screen.get_size()) ) pygame.display.update() self.dt = self.clock.tick(60) / 3000 def rect_circle_collision(self, rect, circle): rect_x, rect_y, rect_w, rect_h = rect circle_x = circle[0][0] circle_y = circle[0][1] circle_r = circle[1] # Calculate the closest point on the rectangle to the center of the circle closest_x = max(rect_x, min(circle_x, rect_x + rect_w)) closest_y = max(rect_y, min(circle_y, rect_y + rect_h)) # Calculate the distance between the center of the circle and the closest point on the rectangle dx = circle_x - closest_x dy = circle_y - closest_y distance = (dx ** 2 + dy ** 2) ** 0.5 return distance <= circle_r # def calculate_flashlight_radiate(self, degrees: int, start_pos: tuple[int, int] | list[int, int] | pygame.Vector2, length: int) -> tuple[int, int]: # angle_deg = degrees # Angle in degrees # # Convert degrees to radians for math functions # angle_rad = math.radians(angle_deg) # end_x = start_pos[0] + length * math.cos(angle_rad) # end_y = start_pos[1] - length * math.sin(angle_rad) # Minus because y increases downward in Pygame # end_pos = (int(end_x), int(end_y)) # return end_pos game = Game() game.run()