Aggiungi supporto per la creazione e il disegno di texture di sfondo nel gioco
This commit is contained in:
+18
-4
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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"]:
|
||||
|
||||
Reference in New Issue
Block a user