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

This commit is contained in:
Matteo Benedetto
2024-12-26 00:12:00 +01:00
parent cb25866754
commit ebfe9dcceb
2 changed files with 33 additions and 11 deletions
+18 -4
View File
@@ -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