Загрузить файлы в «/»
This commit is contained in:
124
render_tiles.py
Normal file
124
render_tiles.py
Normal file
@@ -0,0 +1,124 @@
|
||||
|
||||
|
||||
import pygame
|
||||
|
||||
from typing import List, Dict
|
||||
|
||||
|
||||
|
||||
class RenderTiles:
|
||||
|
||||
def __init__(self, tile_size: int = 64):
|
||||
|
||||
self.tile_size = tile_size
|
||||
|
||||
self.tile_sprites = {}
|
||||
|
||||
|
||||
|
||||
def load_tile_sprites(self, asset_manifest: Dict) -> Dict:
|
||||
|
||||
self.tile_sprites = {}
|
||||
|
||||
for tile_type, sprite_path in asset_manifest.get('tiles', {}).items():
|
||||
|
||||
try:
|
||||
|
||||
sprite = pygame.image.load(sprite_path).convert_alpha()
|
||||
|
||||
self.tile_sprites[tile_type] = pygame.transform.scale(sprite, (self.tile_size, self.tile_size))
|
||||
|
||||
except pygame.error:
|
||||
|
||||
print(f"Failed to load tile sprite: {sprite_path}")
|
||||
|
||||
self.tile_sprites[tile_type] = self._create_placeholder_tile(tile_type)
|
||||
|
||||
return self.tile_sprites
|
||||
|
||||
|
||||
|
||||
def draw_map(self, surface: pygame.Surface, map_tiles: List[List[Dict]], camera: Dict) -> None:
|
||||
|
||||
if not map_tiles:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
camera_x = camera.get('x', 0)
|
||||
|
||||
camera_y = camera.get('y', 0)
|
||||
|
||||
zoom = camera.get('zoom', 1.0)
|
||||
|
||||
|
||||
|
||||
screen_width = surface.get_width()
|
||||
|
||||
screen_height = surface.get_height()
|
||||
|
||||
|
||||
|
||||
start_col = max(0, int(camera_x // self.tile_size))
|
||||
|
||||
start_row = max(0, int(camera_y // self.tile_size))
|
||||
|
||||
end_col = min(len(map_tiles[0]), int((camera_x + screen_width / zoom) // self.tile_size) + 1)
|
||||
|
||||
end_row = min(len(map_tiles), int((camera_y + screen_height / zoom) // self.tile_size) + 1)
|
||||
|
||||
|
||||
|
||||
for row in range(start_row, end_row):
|
||||
|
||||
for col in range(start_col, end_col):
|
||||
|
||||
if row < len(map_tiles) and col < len(map_tiles[row]):
|
||||
|
||||
tile_data = map_tiles[row][col]
|
||||
|
||||
tile_type = tile_data.get('type', 'grass')
|
||||
|
||||
sprite = self.tile_sprites.get(tile_type, self._create_placeholder_tile(tile_type))
|
||||
|
||||
|
||||
|
||||
screen_x = (col * self.tile_size - camera_x) * zoom
|
||||
|
||||
screen_y = (row * self.tile_size - camera_y) * zoom
|
||||
|
||||
|
||||
|
||||
scaled_sprite = pygame.transform.scale(sprite, (int(self.tile_size * zoom), int(self.tile_size * zoom)))
|
||||
|
||||
surface.blit(scaled_sprite, (screen_x, screen_y))
|
||||
|
||||
|
||||
|
||||
def _create_placeholder_tile(self, tile_type: str) -> pygame.Surface:
|
||||
|
||||
surface = pygame.Surface((self.tile_size, self.tile_size), pygame.SRCALPHA)
|
||||
|
||||
color_map = {
|
||||
|
||||
'grass': (100, 200, 100),
|
||||
|
||||
'water': (100, 100, 255),
|
||||
|
||||
'mountain': (150, 150, 150),
|
||||
|
||||
'forest': (50, 150, 50),
|
||||
|
||||
'sand': (240, 230, 140)
|
||||
|
||||
}
|
||||
|
||||
color = color_map.get(tile_type, (200, 200, 200))
|
||||
|
||||
surface.fill(color)
|
||||
|
||||
pygame.draw.rect(surface, (50, 50, 50), surface.get_rect(), 1)
|
||||
|
||||
return surface
|
||||
|
||||
Reference in New Issue
Block a user