diff --git a/CREDITS.md b/CREDITS.md
index 0756603..1cb2871 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -74,6 +74,10 @@ This file provides credits for all assets, tools, and contributions that have be
## Contributors
+- **Davidek523**
+ - **Role**: Programmer
+ - **Github**: [davidek523](https://github.com/Davidek523)
+
- **Danilo Saiu**
- **Role**: Project overseer/programmer
- **Github**: [ultimateownsz](https://www.github.com/ultimateownsz)
diff --git a/data/new_maps/100x100_map.tmx b/data/new_maps/100x100_map.tmx
new file mode 100644
index 0000000..78454f4
--- /dev/null
+++ b/data/new_maps/100x100_map.tmx
@@ -0,0 +1,1055 @@
+
+
diff --git a/data/new_tilesets/Fort Tiles.tsx b/data/new_tilesets/Fort Tiles.tsx
new file mode 100644
index 0000000..158eb48
--- /dev/null
+++ b/data/new_tilesets/Fort Tiles.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/data/new_tilesets/Ships tiles.tsx b/data/new_tilesets/Ships tiles.tsx
new file mode 100644
index 0000000..47517a7
--- /dev/null
+++ b/data/new_tilesets/Ships tiles.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/data/new_tilesets/Water and Island tiles.tsx b/data/new_tilesets/Water and Island tiles.tsx
new file mode 100644
index 0000000..bba4afb
--- /dev/null
+++ b/data/new_tilesets/Water and Island tiles.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/data/new_tilesets/Water+.tsx b/data/new_tilesets/Water+.tsx
new file mode 100644
index 0000000..1bffb9e
--- /dev/null
+++ b/data/new_tilesets/Water+.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/images/tilesets/coast.png b/images/tilesets/coast.png
new file mode 100644
index 0000000..2ec36be
Binary files /dev/null and b/images/tilesets/coast.png differ
diff --git a/images/tilesets/ships/player_ship.png b/images/tilesets/ships/player_ship.png
new file mode 100644
index 0000000..a724970
Binary files /dev/null and b/images/tilesets/ships/player_ship.png differ
diff --git a/images/tilesets/ships/player_sloop.png b/images/tilesets/ships/player_sloop.png
new file mode 100644
index 0000000..29131f7
Binary files /dev/null and b/images/tilesets/ships/player_sloop.png differ
diff --git a/images/tilesets/ships/player_test_ship.png b/images/tilesets/ships/player_test_ship.png
new file mode 100644
index 0000000..5d3e9b8
Binary files /dev/null and b/images/tilesets/ships/player_test_ship.png differ
diff --git a/images/tilesets/temporary_water/0.png b/images/tilesets/temporary_water/0.png
new file mode 100644
index 0000000..df02529
Binary files /dev/null and b/images/tilesets/temporary_water/0.png differ
diff --git a/images/tilesets/water/0.png b/images/tilesets/water/0.png
new file mode 100644
index 0000000..7e597c6
Binary files /dev/null and b/images/tilesets/water/0.png differ
diff --git a/images/tilesets/water/1.png b/images/tilesets/water/1.png
new file mode 100644
index 0000000..79470d6
Binary files /dev/null and b/images/tilesets/water/1.png differ
diff --git a/images/tilesets/water/2.png b/images/tilesets/water/2.png
new file mode 100644
index 0000000..07c4660
Binary files /dev/null and b/images/tilesets/water/2.png differ
diff --git a/src/GUI/gameloop.py b/src/GUI/gameloop.py
new file mode 100644
index 0000000..5828ec4
--- /dev/null
+++ b/src/GUI/gameloop.py
@@ -0,0 +1,125 @@
+from os.path import join
+import sys
+
+# import dataclasses and typchecking
+from dataclasses import dataclass, field
+
+# import pygame related
+import pygame
+from pytmx.util_pygame import load_pygame # type: ignore
+
+# import Pygame specific objects, functions and functionality
+from src.settings import SCREEN_WIDTH, SCREEN_HEIGHT, TILE_SIZE, WORLD_LAYERS
+from src.support import import_folder, coast_importer, all_character_import
+import src.sprites
+from src.sprites import AnimatedSprites
+
+
+@dataclass
+class GUI:
+ """Graphial User Interface vertion of the game, using pygame-ce"""
+
+ screen_size: tuple[int, int] = (SCREEN_WIDTH, SCREEN_HEIGHT)
+ screen: pygame.Surface = field(init=False)
+
+ # groups
+ # all_sprites: pygame.sprite.Group = field(
+ # init=False, default_factory=pygame.sprite.Group
+ # )
+
+ def __post_init__(self):
+ pygame.init()
+ self.screen = pygame.display.set_mode(self.screen_size)
+ pygame.display.set_caption("PySeas")
+ self.clock = pygame.Clock()
+
+ # self.players: list[src.sprites.Player] = [src.sprites.Player()]
+
+ self.all_sprites = src.sprites.AllSprites()
+ self.running = True
+ self.import_assets()
+ self.setup(
+ tmx_maps=self.tmx_map["map"], player_start_pos="top_left_island"
+ ) # The start positions will be one of the 4 islands in the corners of the board
+ self.camera_mode = "drag"
+
+ def import_assets(self):
+ """load the map"""
+ # The map was made as a basic start for the game, it can be changes or altered if it is better for the overall flow of the game
+ self.tmx_map = {
+ "map": load_pygame(join(".", "data", "new_maps", "100x100_map.tmx"))
+ }
+
+ self.world_frames = {
+ "water": import_folder(".", "images", "tilesets", "water"),
+ "coast": coast_importer(6, 6, ".", "images", "tilesets", "coast"),
+ "ships": all_character_import(".", "images", "tilesets", "ships")
+ }
+ # print(self.world_frames["ships"])
+
+ def setup(self, tmx_maps, player_start_pos):
+ """create tiles"""
+
+ # Sea
+ for x, y, surface in tmx_maps.get_layer_by_name("Sea").tiles():
+ src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"])
+
+ # Water animated
+ for obj in tmx_maps.get_layer_by_name("Water"):
+ for x in range(int(obj.x), int(obj.x + obj.width), TILE_SIZE):
+ for y in range(int(obj.y), int(obj.y + obj.height), TILE_SIZE):
+ AnimatedSprites((x, y), self.world_frames["water"], self.all_sprites, WORLD_LAYERS["water"])
+
+ # Shallow water
+ for x, y, surface in tmx_maps.get_layer_by_name("Shallow Sea").tiles():
+ src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"])
+
+ # Islands
+ islands = tmx_maps.get_layer_by_name("Islands")
+ for x, y, surface in islands.tiles():
+ src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"])
+
+ # Enitites
+ for obj in tmx_maps.get_layer_by_name("Ships"):
+ if obj.name == "Player" and obj.properties["pos"] == player_start_pos:
+ self.player = src.sprites.Player(
+ pos = (obj.x, obj.y),
+ frames = self.world_frames["ships"]["player_test_ship"],
+ groups = self.all_sprites)
+
+ # Coast
+ for obj in tmx_maps.get_layer_by_name("Coast"):
+ terrain = obj.properties["terrain"]
+ side = obj.properties["side"]
+ AnimatedSprites((obj.x, obj.y), self.world_frames["coast"][terrain][side], self.all_sprites, WORLD_LAYERS["bg"])
+
+
+ def run(self) -> None:
+ """main loop of the game"""
+ while self.running:
+ self.handle_events()
+ self.render()
+
+ def handle_events(self) -> None:
+ """get events like keypress or mouse clicks"""
+ for event in pygame.event.get():
+ match event.type:
+ case pygame.QUIT:
+ pygame.quit()
+ sys.exit()
+
+ def render(self) -> None:
+ """draw sprites to the canvas"""
+ dt = self.clock.tick() / 1000
+ self.screen.fill("#000000")
+
+ self.all_sprites.update(dt)
+ self.all_sprites.draw(self.player.rect.center, self.player.player_preview, self.player.player_preview_rect)
+
+ '''No need to loop through the players because it is now in the sprite group AllSprites'''
+ # draw players on top of the other sprites
+ # for player in self.players:
+ # player.render(surface=self.screen)
+
+ pygame.display.update()
+
diff --git a/src/settings.py b/src/settings.py
index da849ba..f46d776 100644
--- a/src/settings.py
+++ b/src/settings.py
@@ -5,6 +5,14 @@
SCREEN_WIDTH, SCREEN_HEIGHT = 1280, 720
TILE_SIZE = 16
+ANIMATION_SPEED = 4
+
+WORLD_LAYERS = {
+ "water": 0,
+ "bg": 1,
+ "main": 2,
+ "top": 3
+}
FPS = 60
diff --git a/src/sprites.py b/src/sprites.py
index 9ad2a02..6592fce 100644
--- a/src/sprites.py
+++ b/src/sprites.py
@@ -2,17 +2,41 @@
import pygame
from pygame import FRect
-from src.settings import TILE_SIZE, SCREEN_HEIGHT, SCREEN_WIDTH
+from src.settings import TILE_SIZE, SCREEN_HEIGHT, SCREEN_WIDTH, ANIMATION_SPEED, WORLD_LAYERS
from src.inventory import Inventory
-# class Entity(pygame.sprite.Sprite):
-"""Will be later used on all entities, classes as Player will inherit from this class"""
-# def __init__(self, pos, surf, groups):
-# super().__init__(groups)
+class Entity(pygame.sprite.Sprite):
+ def __init__(self, pos, frames, groups):
+ super().__init__(groups)
+ self.z = WORLD_LAYERS["main"]
+
+ # graphics
+ self.frame_index, self.frames = 0, frames
+ self.facing_direction = "down"
+
+ # movement
+ self.direction = pygame.math.Vector2()
+ # self.speed = 250
+
+ # sprite setup
+ self.image = pygame.Surface((TILE_SIZE, TILE_SIZE))
+ self.image.fill("red")
+ # self.image = self.frames[self.get_state()][self.frame_index]
+ self.rect = self.image.get_frect(center = pos)
+
+ def animate(self, dt):
+ self.frame_index += ANIMATION_SPEED * dt
+ # self.image = self.frames[self.get_state()][int(self.frame_index % len(self.frames[self.get_state()]))]
-# self.image = surf
-# self.rect = self.image.get_frect(center=pos)
+ def get_state(self):
+ moving = bool(self.direction)
+ if moving:
+ if self.direction.x != 0:
+ self.facing_direction = "right" if self.direction.x > 0 else "left"
+ if self.direction.y != 0:
+ self.facing_direction = "down" if self.direction.x > 0 else "up"
+ return f"{self.facing_direction}{"" if moving else "_idle"}"
class AllSprites(pygame.sprite.Group):
@@ -24,32 +48,47 @@ def __init__(self):
self.display_surface = pygame.display.get_surface()
if not self.display_surface:
raise ValueError("Display surface is not initialized")
+
self.offset = pygame.math.Vector2()
+ self.scale = 2.0
- def draw(self, player_center, player_preview, player_preview_rect):
- self.offset.x = -(player_center[0] - SCREEN_WIDTH / 2)
- self.offset.y = -(player_center[1] - SCREEN_HEIGHT / 2)
+ def draw(self, player_center):
+ self.offset.x = -(player_center[0] * self.scale - SCREEN_WIDTH / 2)
+ self.offset.y = -(player_center[1] * self.scale - SCREEN_HEIGHT / 2)
- for sprite in self:
- self.display_surface.blit(sprite.image, sprite.rect.topleft + self.offset)
+ background_sprites = [sprite for sprite in self if sprite.z < WORLD_LAYERS["main"]]
+ main_sprites = [sprite for sprite in self if sprite.z == WORLD_LAYERS["main"]]
+ foreground_sprites = [sprite for sprite in self if sprite.z > WORLD_LAYERS["main"]]
- self.display_surface.blit(
- player_preview, player_preview_rect.topleft + self.offset
- )
+ for layer in (background_sprites, main_sprites, foreground_sprites):
+ for sprite in layer:
+ scaled_image = pygame.transform.scale(sprite.image,
+ (int(sprite.rect.width * self.scale), int(sprite.rect.height * self.scale)))
+ scaled_rect = scaled_image.get_rect(center=(sprite.rect.center[0] * self.scale, sprite.rect.center[1] * self.scale))
+ scaled_rect.topleft += self.offset
+ self.display_surface.blit(scaled_image, scaled_rect.topleft)
-class Player(pygame.sprite.Sprite):
+ # scaling of the ghost preview
+ # scaled_preview = pygame.transform.scale(player_preview,
+ # (int(player_preview_rect.width * self.scale), int(player_preview_rect.height * self.scale)))
+ # scaled_preview_rect = scaled_preview.get_rect(center=(player_preview_rect.center[0] * self.scale, player_preview_rect.center[1] * self.scale))
+ # scaled_preview_rect.topleft += self.offset
+
+ # self.display_surface.blit(scaled_preview, scaled_preview_rect.topleft)
+
+ # method for zooming (might be usefull later?)
+ # def set_scale(self, scale):
+ # self.scale = max(scale, 0.1)
+
+
+class Player(Entity):
"""move tile by tile"""
rect: FRect
- def __init__(self, pos, groups):
- super().__init__(groups)
- # TODO: replace with actual images
-
- self.image = pygame.Surface((TILE_SIZE, TILE_SIZE))
- self.image.fill("red")
- self.rect = self.image.get_frect(center=pos)
+ def __init__(self, pos, frames, groups):
+ super().__init__(pos, frames, groups)
# ghost preview
self.player_preview = self.image.copy()
@@ -58,8 +97,14 @@ def __init__(self, pos, groups):
self.inventory = Inventory()
self.mouse_have_been_pressed: bool = False
+ self.draggin = False
+ self.offset_x = 0
+ self.offset_y = 0
+
def input(self) -> None:
"""move the player and show a ghost to preview the move"""
+ # Reset direction
+ self.direction = pygame.math.Vector2(0, 0)
# gost preview
mouse_pos = pygame.mouse.get_pos()
@@ -69,67 +114,62 @@ def input(self) -> None:
delta_x = abs(self.rect.centerx - mouse_pos[0])
delta_y = abs(self.rect.centery - mouse_pos[1])
- # move the gost on the x axis
- self.player_preview_rect = self.rect.copy()
- if delta_x > delta_y:
- if delta_x < (TILE_SIZE / 2):
- # don't move the gost if the mouse is on the player hitbox
- self.player_preview_rect.x = self.rect.x
- elif mouse_pos[0] > self.rect.centerx:
- # go right
- self.player_preview_rect.x = self.rect.x + TILE_SIZE
- else:
- # go left
- self.player_preview_rect.x = self.rect.x - TILE_SIZE
- # move the gost on the y axis
- else:
- if delta_y < (TILE_SIZE / 2):
- # don't move if the mouse is on the player hitbox
- self.player_preview_rect.y = self.rect.y
- elif mouse_pos[1] > self.rect.centery:
- # go down
- self.player_preview_rect.y = self.rect.y + TILE_SIZE
- else:
- # go up
- self.player_preview_rect.y = self.rect.y - TILE_SIZE
+ # # move the gost on the x axis
+ # self.player_preview_rect = self.rect.copy()
+ # if delta_x > delta_y:
+ # if delta_x < (TILE_SIZE / 2):
+ # # don't move the gost if the mouse is on the player hitbox
+ # self.player_preview_rect.x = self.rect.x
+ # elif mouse_pos[0] > self.rect.centerx:
+ # # go right
+ # self.player_preview_rect.x = self.rect.x + TILE_SIZE
+ # else:
+ # # go left
+ # self.player_preview_rect.x = self.rect.x - TILE_SIZE
+ # # move the gost on the y axis
+ # else:
+ # if delta_y < (TILE_SIZE / 2):
+ # # don't move if the mouse is on the player hitbox
+ # self.player_preview_rect.y = self.rect.y
+ # elif mouse_pos[1] > self.rect.centery:
+ # # go down
+ # self.player_preview_rect.y = self.rect.y + TILE_SIZE
+ # else:
+ # # go up
+ # self.player_preview_rect.y = self.rect.y - TILE_SIZE
# move the player
if not pygame.mouse.get_pressed()[0]:
self.mouse_have_been_pressed = False
- return None
+ return
if self.mouse_have_been_pressed:
- return None
+ return
self.mouse_have_been_pressed = True
# move on the x axis
if delta_x > delta_y:
- if delta_x < (TILE_SIZE / 2):
- # don't move if the mouse is on the player hitbox
- return None
- if mouse_pos[0] > self.rect.centerx:
- # go right
- self.rect.x += TILE_SIZE
- else:
- # go left
- self.rect.x -= TILE_SIZE
- # move on the y axis
+ if delta_x >= (TILE_SIZE / 2):
+ if mouse_pos[0] > self.rect.centerx:
+ self.direction.x = 1
+ else:
+ self.direction.x = -1
else:
- if delta_y < (TILE_SIZE / 2):
- # don't move if the mouse is on the player hitbox
- return None
- if mouse_pos[1] > self.rect.centery:
- # go down
- self.rect.y += TILE_SIZE
- else:
- # go up
- self.rect.y -= TILE_SIZE
-
- return None
-
- def update(self) -> None:
+ if delta_y >= (TILE_SIZE / 2):
+ if mouse_pos[1] > self.rect.centery:
+ self.direction.y = 1
+ else:
+ self.direction.y = -1
+
+ self.rect.x += self.direction.x * TILE_SIZE
+ self.rect.y += self.direction.y * TILE_SIZE
+
+ # return None
+
+ def update(self, dt) -> None:
"""blit player image and gost preview to a given surface"""
self.input()
+ self.animate(dt)
class Tile(pygame.sprite.Sprite):
@@ -174,3 +214,24 @@ def draw(
"""Could be useful for a camera?"""
offset_rect = self.rect.move(offset)
display_surface.blit(self.image, offset_rect)
+
+
+class Sprite(pygame.sprite.Sprite):
+ def __init__(self, pos, surf, groups, z = WORLD_LAYERS["main"]):
+ super().__init__(groups)
+ self.image = surf
+ self.rect = self.image.get_frect(topleft=pos)
+ self.z = z
+
+
+class AnimatedSprites(Sprite):
+ def __init__(self, pos, frames, groups, z = WORLD_LAYERS["main"]):
+ self.frame_index, self.frames = 0, frames
+ super().__init__(pos, frames[self.frame_index], groups, z)
+
+ def animate(self, dt):
+ self.frame_index += ANIMATION_SPEED * dt
+ self.image = self.frames[int(self.frame_index % len(self.frames))]
+
+ def update(self, dt):
+ self.animate(dt)
diff --git a/src/states/game_running.py b/src/states/game_running.py
index 911e1c6..3edaa62 100644
--- a/src/states/game_running.py
+++ b/src/states/game_running.py
@@ -10,8 +10,10 @@
from src.states.base_state import BaseState
from src.states.paused import Paused
from src.inventory import Inventory
+from src.support import import_folder, coast_importer, all_character_import
+from src.sprites import AnimatedSprites
-from src.settings import TILE_SIZE
+from src.settings import TILE_SIZE, WORLD_LAYERS
import src.sprites
@@ -30,6 +32,7 @@ def __init__(self, game_state_manager) -> None:
super().__init__(game_state_manager)
# Initialize player inventory
+ self.clock = pygame.Clock()
self.player_inventory = Inventory()
self.load_inventory_from_json("data/inventory.json")
@@ -43,22 +46,47 @@ def setup(self, player_start_pos):
setup the map and player from the tiled file
"""
self.tmx_map = {
- "map": load_pygame(os.path.join(".", "data", "maps", "100x100_map.tmx"))
+ "map": load_pygame(os.path.join(".", "data", "new_maps", "100x100_map.tmx"))
}
+ self.world_frames = {
+ "water": import_folder(".", "images", "tilesets", "temporary_water"),
+ "coast": coast_importer(6, 6, ".", "images", "tilesets", "coast"),
+ "ships": all_character_import(".", "images", "tilesets", "ships")
+ }
+
+ # Sea
+ for x, y, surface in self.tmx_map["map"].get_layer_by_name("Sea").tiles():
+ src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"])
+
+ # Water animated
+ for obj in self.tmx_map["map"].get_layer_by_name("Water"):
+ for x in range(int(obj.x), int(obj.x + obj.width), TILE_SIZE):
+ for y in range(int(obj.y), int(obj.y + obj.height), TILE_SIZE):
+ AnimatedSprites((x, y), self.world_frames["water"], self.all_sprites, WORLD_LAYERS["water"])
+
+ # Shallow water
+ for x, y, surface in self.tmx_map["map"].get_layer_by_name("Shallow Sea").tiles():
+ src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"])
+
# Islands
islands = self.tmx_map["map"].get_layer_by_name("Islands")
for x, y, surface in islands.tiles():
- src.sprites.Tile(
- self.all_sprites,
- pos=(x * TILE_SIZE, y * TILE_SIZE),
- surf=surface,
- )
+ src.sprites.Sprite((x * TILE_SIZE, y * TILE_SIZE), surface, self.all_sprites, WORLD_LAYERS["bg"])
- # Objects
+ # Enitites
for obj in self.tmx_map["map"].get_layer_by_name("Ships"):
if obj.name == "Player" and obj.properties["pos"] == player_start_pos:
- self.player = src.sprites.Player((obj.x, obj.y), self.all_sprites)
+ self.player = src.sprites.Player(
+ pos = (obj.x, obj.y),
+ frames = self.world_frames["ships"]["player_test_ship"],
+ groups = self.all_sprites)
+
+ # Coast
+ for obj in self.tmx_map["map"].get_layer_by_name("Coast"):
+ terrain = obj.properties["terrain"]
+ side = obj.properties["side"]
+ AnimatedSprites((obj.x, obj.y), self.world_frames["coast"][terrain][side], self.all_sprites, WORLD_LAYERS["bg"])
def load_inventory_from_json(self, file_path: str):
"""Load initial inventory items from JSON file."""
@@ -75,8 +103,8 @@ def update(self, events) -> None:
"""
update each sprites and handle events
"""
-
- self.all_sprites.update()
+ dt = self.clock.tick() / 1000
+ self.all_sprites.update(dt)
# get events like keypress or mouse clicks
for event in events:
@@ -90,9 +118,7 @@ def render(self, screen) -> None:
"""draw sprites to the canvas"""
screen.fill("#000000")
self.all_sprites.draw(
- self.player.rect.center,
- self.player.player_preview,
- self.player.player_preview_rect,
+ self.player.rect.center
)
pygame.display.update()
diff --git a/src/support.py b/src/support.py
new file mode 100644
index 0000000..3b56490
--- /dev/null
+++ b/src/support.py
@@ -0,0 +1,80 @@
+import pygame
+from os.path import join
+from os import walk
+# from pytmx.util_pygame import load_pygame
+
+# imports
+def import_image(*path, alpha = True, format = 'png'):
+ full_path = join(*path) + f'.{format}'
+ surf = pygame.image.load(full_path).convert_alpha() if alpha else pygame.image.load(full_path).convert()
+ return surf
+
+def import_folder(*path):
+ frames = []
+ for folder_path, sub_folders, image_names in walk(join(*path)):
+ for image_name in sorted(image_names, key = lambda name: int(name.split('.')[0])):
+ full_path = join(folder_path, image_name)
+ surf = pygame.image.load(full_path).convert_alpha()
+ frames.append(surf)
+ return frames
+
+def import_folder_dict(*path):
+ frames = {}
+ for folder_path, sub_folders, image_names in walk(join(*path)):
+ for image_name in image_names:
+ full_path = join(folder_path, image_name)
+ surf = pygame.image.load(full_path).convert_alpha()
+ frames[image_name.split('.')[0]] = surf
+ return frames
+
+def import_sub_folders(*path):
+ frames = {}
+ for _, sub_folders, __ in walk(join(*path)):
+ if sub_folders:
+ for sub_folder in sub_folders:
+ frames[sub_folder] = import_folder(*path, sub_folder)
+ return frames
+
+def import_tilemap(cols, rows, *path):
+ frames = {}
+ surf = import_image(*path)
+ cell_width, cell_height = surf.get_width() / cols, surf.get_height() / rows
+ for col in range(cols):
+ for row in range(rows):
+ cutout_rect = pygame.Rect(col * cell_width, row * cell_height,cell_width,cell_height)
+ cutout_surf = pygame.Surface((cell_width, cell_height))
+ cutout_surf.fill('green')
+ cutout_surf.set_colorkey('green')
+ cutout_surf.blit(surf, (0,0), cutout_rect)
+ frames[(col, row)] = cutout_surf
+ return frames
+
+def coast_importer(cols, rows, *path):
+ frame_dict = import_tilemap(cols, rows, *path)
+ new_dict = {}
+ terrains = ["sand"]
+ sides = {
+ 'topleft': (0,0), 'top': (1,0), 'topright': (2,0),
+ 'left': (0,1), 'right': (2,1), 'bottomleft': (0,2),
+ 'bottom': (1,2), 'bottomright': (2,2)}
+ for index, terrain in enumerate(terrains):
+ new_dict[terrain] = {}
+ for key, pos in sides.items():
+ new_dict[terrain][key] = [frame_dict[(pos[0] + index * 3, pos[1] + row)] for row in range(0, rows, 3)]
+ return new_dict
+
+def character_importer(cols, rows, *path):
+ frame_dict = import_tilemap(cols, rows, *path)
+ new_dict = {}
+ for row, direction in enumerate(("down", "left", "right", "up")):
+ new_dict[direction] = [frame_dict[(col, row)] for col in range(cols)]
+ new_dict[f"{direction}_idle"] = [frame_dict[(0, row)]]
+ return new_dict
+
+def all_character_import(*path):
+ new_dict = {}
+ for _, _, image_names in walk(join(*path)):
+ for image in image_names:
+ image_name = image.split(".")[0]
+ new_dict[image_name] = character_importer(7, 4, *path, image_name)
+ return new_dict
\ No newline at end of file