Browse Source

Aggiungi supporto per la creazione e il disegno di texture di sfondo nel gioco

master
Matteo Benedetto 12 months ago
parent
commit
ebfe9dcceb
  1. 20
      engine/sdl2.py
  2. 14
      rats.py

20
engine/sdl2.py

@ -41,6 +41,14 @@ class GameWindow:
for i in range(5): 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))) 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): def load_joystick(self):
sdl2.SDL_Init(sdl2.SDL_INIT_JOYSTICK) 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)}) fonts.update({i: sdl2.ext.FontManager(font_path=font_file, size=i)})
return fonts 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_path = os.path.join("assets", path)
image = Image.open(image_path) image = Image.open(image_path)
if transparent_color: if transparent_color:
@ -67,6 +75,8 @@ class GameWindow:
new_data.append(item) new_data.append(item)
image.putdata(new_data) image.putdata(new_data)
scale = self.cell_size // 20 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) image = image.resize((image.width * scale, image.height * scale), Image.NEAREST)
return self.factory.from_surface(sdl2.ext.pillow_to_surface(image)) return self.factory.from_surface(sdl2.ext.pillow_to_surface(image))
@ -78,6 +88,9 @@ class GameWindow:
sprite.position = position sprite.position = position
self.renderer.copy(sprite, dstrect=sprite.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"): def draw_image(self, x, y, sprite, tag, anchor="nw"):
if not self.is_in_visible_area(x, y): if not self.is_in_visible_area(x, y):
return return
@ -144,7 +157,7 @@ class GameWindow:
sdl2.SDL_SetWindowFullscreen(self.window.window, flag) sdl2.SDL_SetWindowFullscreen(self.window.window, flag)
def is_in_visible_area(self, x, y): 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): def mainloop(self, **kwargs):
while self.running: while self.running:
@ -177,6 +190,7 @@ class GameWindow:
# Disegna qui gli sprite # 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.renderer.present()
self.performance = (sdl2.SDL_GetPerformanceCounter() - performance_start) / sdl2.SDL_GetPerformanceFrequency() * 1000 self.performance = (sdl2.SDL_GetPerformanceCounter() - performance_start) / sdl2.SDL_GetPerformanceFrequency() * 1000
if self.performance < self.delay: if self.performance < self.delay:
@ -250,5 +264,5 @@ class GameWindow:
if not dev[0]: if not dev[0]:
sdl2.SDL_PauseAudioDevice(dev[1], 1) sdl2.SDL_PauseAudioDevice(dev[1], 1)
sdl2.SDL_ClearQueuedAudio(dev[1]) sdl2.SDL_ClearQueuedAudio(dev[1])
dev[0] = True

14
rats.py

@ -31,6 +31,8 @@ class MiceMaze(controls.KeyBindings):
self.sounds = {} self.sounds = {}
for _ in range(5): for _ in range(5):
self.new_rat() self.new_rat()
self.background_texture = None
def count_rats(self): def count_rats(self):
count = 0 count = 0
@ -62,11 +64,17 @@ class MiceMaze(controls.KeyBindings):
return random.choice(self._valid_positions) return random.choice(self._valid_positions)
def draw_maze(self): def draw_maze(self):
if self.background_texture is None:
texture_tiles = []
for y, row in enumerate(self.map.matrix): for y, row in enumerate(self.map.matrix):
for x, cell in enumerate(row): for x, cell in enumerate(row):
variant = x*y % 4 variant = x*y % 4
tile = self.grasses[variant] if cell else self.tunnel tile = self.grasses[variant] if cell else self.tunnel
self.engine.draw_image(x * self.cell_size, y * self.cell_size, tile, tag="maze") 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): def game_over(self):
if self.game_end[0]: if self.game_end[0]:
if not self.game_end[1]: if not self.game_end[1]:
@ -150,8 +158,8 @@ class MiceMaze(controls.KeyBindings):
del self.sounds[key] del self.sounds[key]
def graphics_load(self): def graphics_load(self):
self.tunnel = self.engine.load_image("Rat/BMP_TUNNEL.png") 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") for i in range(4)] 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.rat_assets = {}
self.bomb_assets = {} self.bomb_assets = {}
for sex in ["MALE", "FEMALE", "BABY"]: for sex in ["MALE", "FEMALE", "BABY"]:

Loading…
Cancel
Save