From ebfe9dcceb128cc1133e766ae6b5ae26db92d806 Mon Sep 17 00:00:00 2001 From: Matteo Benedetto Date: Thu, 26 Dec 2024 00:12:00 +0100 Subject: [PATCH] Aggiungi supporto per la creazione e il disegno di texture di sfondo nel gioco --- engine/sdl2.py | 22 ++++++++++++++++++---- rats.py | 22 +++++++++++++++------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/engine/sdl2.py b/engine/sdl2.py index cf31cae..5a1f982 100644 --- a/engine/sdl2.py +++ b/engine/sdl2.py @@ -40,7 +40,15 @@ class GameWindow: self.audio_devs = [] for i in range(5): self.audio_devs.append((True, sdl2.SDL_OpenAudioDevice(None, 0, SDL_AudioSpec(freq=22050, aformat=sdl2.AUDIO_U8, channels=1, samples=2048), None, 0))) - + + def create_texture(self, tiles: list): + bg_surface = sdl2.SDL_CreateRGBSurface(0, self.width, self.height, 32, 0, 0, 0, 0) + for tile in tiles: + dstrect = sdl2.SDL_Rect(tile[1], tile[2], self.cell_size, self.cell_size) + sdl2.SDL_BlitSurface(tile[0], None, bg_surface, dstrect) + bg_texture = self.factory.from_surface(bg_surface) + sdl2.SDL_FreeSurface(bg_surface) + return bg_texture def load_joystick(self): sdl2.SDL_Init(sdl2.SDL_INIT_JOYSTICK) @@ -53,7 +61,7 @@ class GameWindow: fonts.update({i: sdl2.ext.FontManager(font_path=font_file, size=i)}) return fonts - def load_image(self, path, transparent_color=None): + def load_image(self, path, transparent_color=None, surface=False): image_path = os.path.join("assets", path) image = Image.open(image_path) if transparent_color: @@ -67,6 +75,8 @@ class GameWindow: new_data.append(item) image.putdata(new_data) scale = self.cell_size // 20 + if surface: + return sdl2.ext.pillow_to_surface(image.resize((image.width * scale, image.height * scale), Image.NEAREST)) image = image.resize((image.width * scale, image.height * scale), Image.NEAREST) return self.factory.from_surface(sdl2.ext.pillow_to_surface(image)) @@ -77,6 +87,9 @@ class GameWindow: else: sprite.position = position self.renderer.copy(sprite, dstrect=sprite.position) + + def draw_background(self, bg_texture): + self.renderer.copy(bg_texture, dstrect=sdl2.SDL_Rect(0, 0, self.width, self.height)) def draw_image(self, x, y, sprite, tag, anchor="nw"): if not self.is_in_visible_area(x, y): @@ -144,7 +157,7 @@ class GameWindow: sdl2.SDL_SetWindowFullscreen(self.window.window, flag) def is_in_visible_area(self, x, y): - return -self.w_offset <= x <= self.width - self.w_offset and -self.h_offset <= y <= self.height - self.h_offset + return -self.w_offset -self.cell_size <= x <= self.width - self.w_offset and -self.h_offset -self.cell_size <= y <= self.height - self.h_offset def mainloop(self, **kwargs): while self.running: @@ -177,6 +190,7 @@ class GameWindow: # Disegna qui gli sprite + #sdl2.SDL_RenderSetClipRect(self.renderer.sdlrenderer, sdl2.SDL_Rect(self.w_offset, self.h_offset, self.target_size[0], self.target_size[1])) self.renderer.present() self.performance = (sdl2.SDL_GetPerformanceCounter() - performance_start) / sdl2.SDL_GetPerformanceFrequency() * 1000 if self.performance < self.delay: @@ -250,5 +264,5 @@ class GameWindow: if not dev[0]: sdl2.SDL_PauseAudioDevice(dev[1], 1) sdl2.SDL_ClearQueuedAudio(dev[1]) - dev[0] = True + diff --git a/rats.py b/rats.py index d0073bd..e1e0fdb 100644 --- a/rats.py +++ b/rats.py @@ -31,6 +31,8 @@ class MiceMaze(controls.KeyBindings): self.sounds = {} for _ in range(5): self.new_rat() + self.background_texture = None + def count_rats(self): count = 0 @@ -62,11 +64,17 @@ class MiceMaze(controls.KeyBindings): return random.choice(self._valid_positions) def draw_maze(self): - for y, row in enumerate(self.map.matrix): - for x, cell in enumerate(row): - variant = x*y % 4 - tile = self.grasses[variant] if cell else self.tunnel - self.engine.draw_image(x * self.cell_size, y * self.cell_size, tile, tag="maze") + if self.background_texture is None: + + texture_tiles = [] + for y, row in enumerate(self.map.matrix): + for x, cell in enumerate(row): + variant = x*y % 4 + tile = self.grasses[variant] if cell else self.tunnel + texture_tiles.append((tile, x*self.cell_size, y*self.cell_size)) + self.background_texture = self.engine.create_texture(texture_tiles) + self.engine.draw_background(self.background_texture) + def game_over(self): if self.game_end[0]: if not self.game_end[1]: @@ -150,8 +158,8 @@ class MiceMaze(controls.KeyBindings): del self.sounds[key] def graphics_load(self): - self.tunnel = self.engine.load_image("Rat/BMP_TUNNEL.png") - self.grasses = [self.engine.load_image(f"Rat/BMP_1_GRASS_{i+1}.png") for i in range(4)] + self.tunnel = self.engine.load_image("Rat/BMP_TUNNEL.png", surface=True) + self.grasses = [self.engine.load_image(f"Rat/BMP_1_GRASS_{i+1}.png", surface=True) for i in range(4)] self.rat_assets = {} self.bomb_assets = {} for sex in ["MALE", "FEMALE", "BABY"]: