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 = []
|
self.audio_devs = []
|
||||||
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))
|
||||||
|
|
||||||
@@ -77,6 +87,9 @@ class GameWindow:
|
|||||||
else:
|
else:
|
||||||
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):
|
||||||
@@ -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
|
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
for y, row in enumerate(self.map.matrix):
|
if self.background_texture is None:
|
||||||
for x, cell in enumerate(row):
|
|
||||||
variant = x*y % 4
|
texture_tiles = []
|
||||||
tile = self.grasses[variant] if cell else self.tunnel
|
for y, row in enumerate(self.map.matrix):
|
||||||
self.engine.draw_image(x * self.cell_size, y * self.cell_size, tile, tag="maze")
|
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):
|
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"]:
|
||||||
|
|||||||
Reference in New Issue
Block a user