From 37f45a6e97b94ec1bb383fda168c8fc060a8a688 Mon Sep 17 00:00:00 2001 From: Stan_Lewry Date: Sat, 17 Jul 2021 13:28:11 +0100 Subject: [PATCH] restructure --- Algorithm.py | 102 +++++++ Alogorithms.py | 0 Assets/doomSheet.png | Bin 0 -> 114190 bytes Debug.py | 1 + GameObject.py | 34 +++ InputHandler.py | 9 +- Main.py | 336 ++-------------------- Player.py | 32 +++ Renderer.py | 79 +++++ Texture.py | 76 +++-- World.py | 4 + WorldGen.py | 20 ++ WorldTemplates.py | 15 + __pycache__/Algorithm.cpython-39.pyc | Bin 0 -> 2376 bytes __pycache__/Debug.cpython-39.pyc | Bin 0 -> 148 bytes __pycache__/GameObject.cpython-39.pyc | Bin 0 -> 1800 bytes __pycache__/InputHandler.cpython-39.pyc | Bin 1386 -> 1498 bytes __pycache__/Player.cpython-39.pyc | Bin 0 -> 1251 bytes __pycache__/Renderer.cpython-39.pyc | Bin 0 -> 2780 bytes __pycache__/Texture.cpython-39.pyc | Bin 1606 -> 961 bytes __pycache__/World.cpython-39.pyc | Bin 0 -> 187 bytes __pycache__/WorldGen.cpython-39.pyc | Bin 0 -> 720 bytes __pycache__/WorldTemplates.cpython-39.pyc | Bin 5877 -> 6085 bytes 23 files changed, 365 insertions(+), 343 deletions(-) create mode 100644 Algorithm.py delete mode 100644 Alogorithms.py create mode 100644 Assets/doomSheet.png create mode 100644 Debug.py create mode 100644 GameObject.py create mode 100644 Player.py create mode 100644 Renderer.py create mode 100644 WorldGen.py create mode 100644 __pycache__/Algorithm.cpython-39.pyc create mode 100644 __pycache__/Debug.cpython-39.pyc create mode 100644 __pycache__/GameObject.cpython-39.pyc create mode 100644 __pycache__/Player.cpython-39.pyc create mode 100644 __pycache__/Renderer.cpython-39.pyc create mode 100644 __pycache__/World.cpython-39.pyc create mode 100644 __pycache__/WorldGen.cpython-39.pyc diff --git a/Algorithm.py b/Algorithm.py new file mode 100644 index 0000000..627f22a --- /dev/null +++ b/Algorithm.py @@ -0,0 +1,102 @@ +import World +import Debug + +def computeVisibility(player): + for y in range(World.worldHeight): + for x in range(World.worldWidth): + # reset visibility + World.world[y][x].visible = False + #circle = generateCircle(player.worldX, player.worldY, player.sightRange) + circle = generateSquare(player.worldX, player.worldY, player.sightRange) + for x, y in circle: + Debug.debugRects.append((x, y, (255, 255, 255))) + # debugs = [(x, y, (255, 255, 255)) for x, y in circle] + # debugRects.append(debugs) + for coord in circle: + #world[coord[1]][coord[0]].visible = True + pass + + for coord in circle: + line(player.worldX, player.worldY, coord[0], coord[1]) + +def generateSquare(x, y, radius): + square = [] + for i in range(radius): + square.append((x + i, y + radius)) + square.append((x - i, y + radius)) + square.append((x + i, y - radius)) + square.append((x - i, y - radius)) + square.append((x + radius, y - i)) + square.append((x + radius, y + i)) + square.append((x - radius, y - i)) + square.append((x - radius, y + i)) + square.append((x + radius, y + radius)) + square.append((x - radius, y - radius)) + square.append((x + radius, y - radius)) + square.append((x - radius, y + radius)) + return square + +def generateCircle(x0, y0, radius): + circle = [] + f = 1 - radius + ddf_x = 1 + ddf_y = -2 * radius + x = 0 + y = radius + circle.append((x0, y0 + radius)) + circle.append((x0, y0 - radius)) + circle.append((x0 + radius, y0)) + circle.append((x0 - radius, y0)) + + while x < y: + if f >= 0: + y -= 1 + ddf_y += 2 + f += ddf_y + x += 1 + ddf_x += 2 + f += ddf_x + circle.append((x0 + x, y0 + y)) + circle.append((x0 - x, y0 + y)) + circle.append((x0 + x, y0 - y)) + circle.append((x0 - x, y0 - y)) + circle.append((x0 + y, y0 + x)) + circle.append((x0 - y, y0 + x)) + circle.append((x0 + y, y0 - x)) + circle.append((x0 - y, y0 - x)) + return circle + +def line(x0, y0, x1, y1): + dx = abs(x1 - x0) + dy = abs(y1 - y0) + x, y = x0, y0 + sx = -1 if x0 > x1 else 1 + sy = -1 if y0 > y1 else 1 + if dx > dy: + err = dx / 2.0 + while x != x1: + if x in range(0, World.worldWidth - 1) and y in range (0, World.worldHeight - 1) and not World.world[y][x].containsSolid(): + World.world[y][x].visible = True + Debug.debugRects.append((x, y, (255, 0, 0))) + err -= dy + if err < 0: + y += sy + err += dx + x += sx + else: + break + else: + err = dy / 2.0 + while y != y1: + if x in range(0, World.worldWidth - 1) and y in range (0, World.worldHeight - 1) and not World.world[y][x].containsSolid(): + World.world[y][x].visible = True + Debug.debugRects.append((x, y, (255, 0, 0))) + err -= dx + if err < 0: + x += sx + err += dy + y += sy + else: + break + World.world[y][x].visible = True + Debug.debugRects.append((x, y, (255, 0, 0))) diff --git a/Alogorithms.py b/Alogorithms.py deleted file mode 100644 index e69de29..0000000 diff --git a/Assets/doomSheet.png b/Assets/doomSheet.png new file mode 100644 index 0000000000000000000000000000000000000000..08a709bcad58de7fc1e76ff1fdb45a63e9e325b9 GIT binary patch literal 114190 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 1 / self.fps: + self.timer = 0 + # increment animation frame + if self.textureX < Texture.animationDict[self.texture][2]: + self.textureX += 1 + else: + self.textureX = 0 + +class WorldCell(): + def __init__(self): + self.objects = [] # order this list somehow to get Z + self.visible = True + + def containsSolid(self): + return any(ob.solid for ob in self.objects) \ No newline at end of file diff --git a/InputHandler.py b/InputHandler.py index 8108d51..7526bb2 100644 --- a/InputHandler.py +++ b/InputHandler.py @@ -6,13 +6,14 @@ from dataclasses import dataclass class InputState: xy: Tuple = (0, 0) quit: bool = False - zoomLevel: float = 1.0 + zoomLevel: float = 0.5 showDebug: bool = False + debugLevel: int = 0 inputMade: bool = False maxZoom = 3.0 minZoom = 1.0 - +maxDebugLevel = 2 globalInputState = InputState() def handleInputs(): @@ -39,7 +40,9 @@ def handleInputs(): elif event.key == pygame.K_LEFTBRACKET and newInputState.zoomLevel >= minZoom: newInputState.zoomLevel -= 0.5 elif event.key == pygame.K_F3: - newInputState.showDebug = not newInputState.showDebug + if newInputState.debugLevel < maxDebugLevel: + newInputState.debugLevel += 1 + else: newInputState.debugLevel = 0 newInputState.inputMade = not newInputState == globalInputState # now replace the global one with our new one diff --git a/Main.py b/Main.py index bf077df..a664620 100644 --- a/Main.py +++ b/Main.py @@ -1,331 +1,49 @@ import pygame import pygame.font -from pygame import transform -import os -from collections import namedtuple -from pygame import sprite -from pygame.constants import SCRAP_SELECTION, SYSTEM_CURSOR_SIZENESW -import WorldTemplates -import Texture +import Player +import WorldGen +import World import InputHandler +import Renderer +import Algorithm +import Debug -screenWidth = 1920 -screenHeight = 1080 -worldWidth = 20 * 3 -worldHeight = 20 * 3 -objPixelWidth = 32 -objPixelHeight = 32 - -# int a = 1 -# int b = -1 -# unsigned int a = 5 -# uint8 myint = 255; -# float myFloat = 0.0001f; -# double myDouble = 0.0000000001f; - -pygame.init() -pygame.display.set_caption("Medieval Game") -gameFolder = os.path.dirname(__file__) -screen = pygame.display.set_mode([screenWidth, screenHeight]) -playerImage = pygame.image.load(os.path.join('Assets', 'player_debug.png')) -dirtImage = pygame.image.load(os.path.join('Assets', 'dirt.png')) -grassImage = pygame.image.load(os.path.join('Assets', 'grass.png')) -woodWallImage = pygame.image.load(os.path.join('Assets', 'woodWall.png')) - -debugRects = [] - -class GameObject(): - def __init__(self, worldX, worldY, texture, solid): - self.texture = texture - self.worldX = worldX - self.worldY = worldY - self.solid = solid - self.textureX = Texture.spriteDict[self.texture][0] - self.textureY = Texture.spriteDict[self.texture][1] - -class AnimationObject(GameObject): - def __init__(self, worldX, worldY, texture, solid, fps): - GameObject.__init__(self, worldX, worldY, texture, solid) - self.fps = fps - self.timer = 0 - - def update(self, deltaTime): - self.timer += deltaTime - if self.timer > 1 / self.fps: - self.timer = 0 - # increment animation frame - if self.textureX < Texture.animationDict[self.texture][2]: - self.textureX += 1 - else: - self.textureX = 0 - -class Door(GameObject): - def __init__(self, worldX, worldY, texture, open): - GameObject.__init__(self, worldX, worldY, texture, not open) - - def interact(): - print("player interacted with the door") - -class WorldCell(): - def __init__(self): - self.objects = [] # order this list somehow to get Z - self.visible = True - - def containsSolid(self): - return any(ob.solid for ob in self.objects) - -def genWorld(): - template = WorldTemplates.worldTemplate5 - output = [[]] - for y in range(worldHeight): - row = [] - for x in range(worldWidth): - cell = WorldCell() - if template[y][x] == 0: - cell.objects.append(GameObject(x, y, "dirt", False)) - elif template[y][x] == 1: - cell.objects.append(GameObject(x, y, "grass", False)) - elif template[y][x] == 2: - cell.objects.append(GameObject(x, y, "wood_wall", True)) - elif template[y][x] == 3: - cell.objects.append(GameObject(x, y, "wood_wall_side", True)) - elif template[y][x] == 4: - cell.objects.append(GameObject(x, y, "floor_planks", False)) - elif template[y][x] == 5: - cell.objects.append(GameObject(x, y, "floor_planks_shadow", False)) - elif template[y][x] == 6: - cell.objects.append(GameObject(x, y, "wood_wall_shadow", True)) - elif template[y][x] == 7: - cell.objects.append(GameObject(x, y, "grass_border_right", False)) - elif template[y][x] == 8: - cell.objects.append(GameObject(x, y, "grass_border_top", False)) - elif template[y][x] == 9: - cell.objects.append(GameObject(x, y, "grass_border_top_right_inner", False)) - elif template[y][x] == 10: - cell.objects.append(GameObject(x, y, "grass_border_top_right_outer", False)) - elif template[y][x] == 11: - cell.objects.append(GameObject(x, y, "grass_border_top_left_outer", False)) - elif template[y][x] == 12: - cell.objects.append(GameObject(x, y, "grass_border_top_left_inner", False)) - elif template[y][x] == 13: - cell.objects.append(GameObject(x, y, "grass_border_left", False)) - row.append(cell) - output.insert(y, row) - return output - -world = genWorld() - -class Player(GameObject): - def __init__(self, worldX, worldY): - GameObject.__init__(self, worldX, worldY, "player", False) - self.direction = (0, 1) - self.sightRange = 16 - - def update(self): - self.direction = InputHandler.globalInputState.xy - - if self.direction == (0, 1): - self.texture = "player" - elif self.direction == (0, -1): - self.texture = "player_north" - elif self.direction == (1, 0): - self.texture = "player_east" - elif self.direction == (-1, 0): - self.texture = "player_west" - - self.textureX = Texture.spriteDict[self.texture][0] - self.textureY = Texture.spriteDict[self.texture][1] - - desiredX, desiredY = self.worldX + self.direction[0], self.worldY + self.direction[1] - - if -1 < desiredX < worldWidth and -1 < desiredY < worldHeight: - if not world[int(desiredY)][int(desiredX)].containsSolid(): - self.worldX = desiredX - self.worldY = desiredY - -player = Player(30,30) -testAnim = AnimationObject(10, 10, "test_anim", False, 8) -door = Door(11, 13, "wood_door_open", True) -world[13][11].objects.append(door) -world[10][10].objects.append(testAnim) - -def computeVisibility(): - for y in range(worldHeight): - for x in range(worldWidth): - # reset visibility - world[y][x].visible = False - circle = generateCircle(player.worldX, player.worldY, player.sightRange) - for x, y in circle: - debugRects.append((x, y, (255, 255, 255))) - # debugs = [(x, y, (255, 255, 255)) for x, y in circle] - # debugRects.append(debugs) - for coord in circle: - #world[coord[1]][coord[0]].visible = True - pass - - for coord in circle: - line(player.worldX, player.worldY, coord[0], coord[1]) - -def generateCircle(x0, y0, radius): - circle = [] - f = 1 - radius - ddf_x = 1 - ddf_y = -2 * radius - x = 0 - y = radius - circle.append((x0, y0 + radius)) - circle.append((x0, y0 - radius)) - circle.append((x0 + radius, y0)) - circle.append((x0 - radius, y0)) - - while x < y: - if f >= 0: - y -= 1 - ddf_y += 2 - f += ddf_y - x += 1 - ddf_x += 2 - f += ddf_x - circle.append((x0 + x, y0 + y)) - circle.append((x0 - x, y0 + y)) - circle.append((x0 + x, y0 - y)) - circle.append((x0 - x, y0 - y)) - circle.append((x0 + y, y0 + x)) - circle.append((x0 - y, y0 + x)) - circle.append((x0 + y, y0 - x)) - circle.append((x0 - y, y0 - x)) - return circle - -def line(x0, y0, x1, y1): - dx = abs(x1 - x0) - dy = abs(y1 - y0) - x, y = x0, y0 - sx = -1 if x0 > x1 else 1 - sy = -1 if y0 > y1 else 1 - if dx > dy: - err = dx / 2.0 - while x != x1: - if x in range(0, worldWidth - 1) and y in range (0, worldHeight - 1) and not world[y][x].containsSolid(): - world[y][x].visible = True - debugRects.append((x, y, (255, 0, 0))) - err -= dy - if err < 0: - y += sy - err += dx - x += sx - else: - break - else: - err = dy / 2.0 - while y != y1: - if x in range(0, worldWidth - 1) and y in range (0, worldHeight - 1) and not world[y][x].containsSolid(): - world[y][x].visible = True - debugRects.append((x, y, (255, 0, 0))) - err -= dx - if err < 0: - x += sx - err += dy - y += sy - else: - break - debugRects.append((x, y, (255, 0, 0))) - world[y][x].visible = True - - - -def renderAll(cam, zoomLevel): - actualWidth = int(objPixelWidth * zoomLevel) - actualHeight = int(objPixelHeight * zoomLevel) - screenTopX = (cam[0] * actualWidth) - (screenWidth / 2) - screenTopY = (cam[1] * actualHeight) - (screenHeight / 2) - - sheet = pygame.transform.scale(Texture.spriteSheet, (int(Texture.sheetWidth * zoomLevel), int(Texture.sheetHeight * zoomLevel))) - - for y in range(worldHeight): - for x in range(worldWidth): - if (world[y][x].visible): - for gameObj in world[y][x].objects: - worldX = (gameObj.worldX * actualWidth) - (actualWidth / 2) - worldY = (gameObj.worldY * actualHeight) - (actualHeight / 2) - screen.blit(sheet, - (worldX - screenTopX, worldY - screenTopY), - (gameObj.textureX * actualWidth, - gameObj.textureY * actualHeight, - actualWidth, - actualHeight)) - - worldX = (player.worldX * actualWidth) - (actualWidth / 2) - worldY = (player.worldY * actualHeight) - (actualHeight / 2) - sheetPos = Texture.spriteDict[player.texture] - screen.blit(sheet, (worldX - screenTopX, worldY - screenTopY), - (player.textureX * actualWidth, - player.textureY * actualHeight, - actualWidth, - actualHeight)) - -def renderDebugUI(): - headerSurf = Texture.font.render("Medieval Game Debug Mode", False, (255,0,0)) - playerPosSurf = Texture.font.render("Player Pos ({x},{y})".format(x=player.worldX, y=player.worldY), - False, (255, 255, 255)) - screen.blit(headerSurf, (0, 0)) - screen.blit(playerPosSurf, (0, 30)) - infoSurf = Texture.font.render("Standing on:", False, (255, 255, 255)) - screen.blit(infoSurf, (0, 60)) - - y = 90 - for gameObj in world[int(player.worldY)][int(player.worldX)].objects: - objSurf = Texture.font.render("{t}".format(t=gameObj.texture), False, (0, 0, 255)) - screen.blit(objSurf, (16, y)) - y += 30 - -def renderDebug(cam, zoomLevel): - actualWidth = int(objPixelWidth * zoomLevel) - actualHeight = int(objPixelHeight * zoomLevel) - screenTopX = (cam[0] * actualWidth) - (screenWidth / 2) - screenTopY = (cam[1] * actualHeight) - (screenHeight / 2) - - for r in debugRects: - worldX = (r[0] * actualWidth) - (actualWidth / 2) - worldY = (r[1] * actualHeight) - (actualHeight / 2) +def main(): + renderer = Renderer.Renderer(1920, 1080) - s = pygame.Surface((actualWidth, actualHeight)) - s.set_alpha(128) - s.fill(r[2]) - screen.blit(s, (worldX - screenTopX, worldY - screenTopY)) + World.world = WorldGen.generateWorld() - # for r in debugRects: - # playerWorldX = (player.worldX * actualWidth) - (actualWidth / 2) - # playerWorldY = (player.worldY* actualHeight) - (actualHeight / 2) - # worldX = (r[0] * actualWidth) - (actualWidth / 2) - # worldY = (r[1] * actualHeight) - (actualHeight / 2) + player = Player.Player(2, 2) - # pygame.draw.line(screen, (255, 0, 0), - # (playerWorldX - screenTopX, playerWorldY - screenTopY), - # (worldX - screenTopX, worldY - screenTopY), - # 1) -def main(): + # begin game loop getTicksLastFrame = 0 t = 0 deltaTime = 0 - #zoomLevel = 1.0 while not InputHandler.globalInputState.quit: + # Compute delta time t = pygame.time.get_ticks() deltaTime = (t - getTicksLastFrame) / 1000.0 getTicksLastFrame = t + + Debug.debugRects.clear() + InputHandler.handleInputs() + player.update() - debugRects.clear() - #circle(player.worldX, player.worldY, 16) - computeVisibility() - #line(player.worldX, player.worldY, 40, 40) - testAnim.update(deltaTime) + + Algorithm.computeVisibility(player) + + cam = (player.worldX, player.worldY) - screen.fill((14, 40, 37)) - renderAll(cam, InputHandler.globalInputState.zoomLevel) - if InputHandler.globalInputState.showDebug: renderDebug(cam, InputHandler.globalInputState.zoomLevel) - renderDebugUI() + + renderer.renderWorld(cam, InputHandler.globalInputState.zoomLevel, player) + if InputHandler.globalInputState.debugLevel > 0: + renderer.renderDebugUI(player, deltaTime) + if InputHandler.globalInputState.debugLevel > 1: + renderer.renderDebugRects(cam, InputHandler.globalInputState.zoomLevel) + pygame.display.flip() pygame.quit() diff --git a/Player.py b/Player.py new file mode 100644 index 0000000..4b770b2 --- /dev/null +++ b/Player.py @@ -0,0 +1,32 @@ +import GameObject +import InputHandler +import Texture +import World + +class Player(GameObject.GameObject): + def __init__(self, worldX, worldY): + GameObject.GameObject.__init__(self, worldX, worldY, "player_south", False) + self.direction = (0, 1) + self.sightRange = 18 + + def update(self): + self.direction = InputHandler.globalInputState.xy + + if self.direction == (0, 1): + self.texture = "player_south" + elif self.direction == (0, -1): + self.texture = "player_north" + elif self.direction == (1, 0): + self.texture = "player_east" + elif self.direction == (-1, 0): + self.texture = "player_west" + + self.textureX = Texture.spriteDict[self.texture][0] + self.textureY = Texture.spriteDict[self.texture][1] + + desiredX, desiredY = self.worldX + self.direction[0], self.worldY + self.direction[1] + + if -1 < desiredX < World.worldWidth and -1 < desiredY < World.worldHeight: + if not World.world[int(desiredY)][int(desiredX)].containsSolid(): + self.worldX = desiredX + self.worldY = desiredY \ No newline at end of file diff --git a/Renderer.py b/Renderer.py new file mode 100644 index 0000000..68e2444 --- /dev/null +++ b/Renderer.py @@ -0,0 +1,79 @@ +import pygame +import Texture +import World +import Debug + +class Renderer: + def __init__(self, screenWidth, screenHeight): + self.screenWidth = screenWidth + self.screenHeight = screenHeight + pygame.init() + pygame.display.set_caption("pyRogue") + self.screen = pygame.display.set_mode([self.screenWidth, self.screenHeight]) + + def renderWorld(self, cam, zoomLevel, player): + actualWidth = int(Texture.spriteSize * zoomLevel) + actualHeight = int(Texture.spriteSize * zoomLevel) + screenTopX = (cam[0] * actualWidth) - (self.screenWidth / 2) + screenTopY = (cam[1] * actualHeight) - (self.screenHeight / 2) + + sheet = pygame.transform.scale(Texture.spriteSheet, (int(Texture.sheetWidth * zoomLevel), int(Texture.sheetHeight * zoomLevel))) + + self.screen.fill((14, 40, 37)) + + for y in range(World.worldHeight): + for x in range(World.worldWidth): + if (World.world[y][x].visible): + for gameObj in World.world[y][x].objects: + worldX = (gameObj.worldX * actualWidth) - (actualWidth / 2) + worldY = (gameObj.worldY * actualHeight) - (actualHeight / 2) + self.screen.blit(sheet, + (worldX - screenTopX, worldY - screenTopY), + (gameObj.textureX * actualWidth, + gameObj.textureY * actualHeight, + actualWidth, + actualHeight)) + + worldX = (player.worldX * actualWidth) - (actualWidth / 2) + worldY = (player.worldY * actualHeight) - (actualHeight / 2) + self.screen.blit(sheet, (worldX - screenTopX, worldY - screenTopY), + (player.textureX * actualWidth, + player.textureY * actualHeight, + actualWidth, + actualHeight)) + + def renderDebugUI(self, player, deltaTime): + drawY = 0 + headerSurf = Texture.font.render("PyRoguelike Debug Mode", False, (255,0,0)) + fpsSurf = Texture.font.render(f'{int(1 / deltaTime)} FPS', False, (255, 255, 255)) + playerPosSurf = Texture.font.render("Player Pos ({x},{y})".format(x=player.worldX, y=player.worldY), + False, (255, 255, 255)) + self.screen.blit(headerSurf, (0, drawY)) + drawY += 30 + self.screen.blit(fpsSurf, (0, drawY)) + drawY += 30 + self.screen.blit(playerPosSurf, (0, drawY)) + drawY += 30 + infoSurf = Texture.font.render("Standing on:", False, (255, 255, 255)) + self.screen.blit(infoSurf, (0, drawY)) + drawY += 30 + + for gameObj in World.world[int(player.worldY)][int(player.worldX)].objects: + objSurf = Texture.font.render("{t}".format(t=gameObj.texture), False, (0, 0, 255)) + self.screen.blit(objSurf, (16, drawY)) + drawY += 30 + + def renderDebugRects(self, cam, zoomLevel): + actualWidth = int(Texture.spriteSize * zoomLevel) + actualHeight = int(Texture.spriteSize * zoomLevel) + screenTopX = (cam[0] * actualWidth) - (self.screenWidth / 2) + screenTopY = (cam[1] * actualHeight) - (self.screenHeight / 2) + + for r in Debug.debugRects: + worldX = (r[0] * actualWidth) - (actualWidth / 2) + worldY = (r[1] * actualHeight) - (actualHeight / 2) + + s = pygame.Surface((actualWidth, actualHeight)) + s.set_alpha(128) + s.fill(r[2]) + self.screen.blit(s, (worldX - screenTopX, worldY - screenTopY)) \ No newline at end of file diff --git a/Texture.py b/Texture.py index 80a6416..e3acc14 100644 --- a/Texture.py +++ b/Texture.py @@ -3,45 +3,59 @@ import pygame.font import os pygame.font.init() gameFolder = os.path.dirname(__file__) -spriteSheet = pygame.image.load(os.path.join('Assets', 'sheet.png')) +spriteSheet = pygame.image.load(os.path.join('Assets', 'doomSheet.png')) animationSheet = pygame.image.load(os.path.join('Assets', 'animation.png')) font = pygame.font.Font(os.path.join('Assets','alagard.ttf'), 30) sheetWidth = spriteSheet.get_width() sheetHeight = spriteSheet.get_height() # multiply coords by sprite size :) -spriteSize = 32 +spriteSize = 128 spriteDict = { - "player" : (1, 19), - "player_north" : (0, 19), - "player_east" : (2, 19), - "player_west" : (3, 19), - "dirt" : (1, 0), - "grass" : (2, 0), - "stone" : (3, 0), - "wood" : (4, 0), - "floor_planks" : (5, 0), - "wood_wall" : (6, 0), - "wood_idk" : (7, 0), - "wood_wall_side" : (8, 0), - "floor_planks_shadow" : (9, 0), - "wood_wall_shadow" : (0, 1), - "grass_border_bottom_right_inner" : (1, 1), - "grass_border_bottom" : (2, 1), - "grass_border_bottom_left_inner" : (3, 1), - "grass_border_right" : (4, 1), - "grass_border_bottom_left_outer" : (5, 1), - "grass_border_left" : (6, 1), - "grass_border_top_right_inner" : (7, 1), - "grass_border_top" : (8, 1), - "grass_border_top_left_inner" : (9, 1), - "grass_border_top_left_outer" : (0, 2), - "grass_border_top_right_outer" : (1, 2), - "grass_border_bottom_right_outer" : (2, 2), - "wood_door_closed" : (3, 2), - "wood_door_open" : (4, 2), - "test_anim" : (0, 6) + "player_south" : (0, 0), + "player_west" : (1, 0), + "player_north" : (2, 0), + "player_east" : (3, 0), + "wall_green" : (0, 1), + "wall_brick" : (1, 1), + "wall_pipes" : (2, 1), + "wall_vent" : (3, 1), + "wall_slime" : (4, 1), + "wall_side" : (5, 1), + "floor_tile" : (0, 2), + "floor_panels" : (1, 2) } +# spriteDict = { +# "player" : (1, 19), +# "player_north" : (0, 19), +# "player_east" : (2, 19), +# "player_west" : (3, 19), +# "dirt" : (1, 0), +# "grass" : (2, 0), +# "stone" : (3, 0), +# "wood" : (4, 0), +# "floor_planks" : (5, 0), +# "wood_wall" : (6, 0), +# "wood_idk" : (7, 0), +# "wood_wall_side" : (8, 0), +# "floor_planks_shadow" : (9, 0), +# "wood_wall_shadow" : (0, 1), +# "grass_border_bottom_right_inner" : (1, 1), +# "grass_border_bottom" : (2, 1), +# "grass_border_bottom_left_inner" : (3, 1), +# "grass_border_right" : (4, 1), +# "grass_border_bottom_left_outer" : (5, 1), +# "grass_border_left" : (6, 1), +# "grass_border_top_right_inner" : (7, 1), +# "grass_border_top" : (8, 1), +# "grass_border_top_left_inner" : (9, 1), +# "grass_border_top_left_outer" : (0, 2), +# "grass_border_top_right_outer" : (1, 2), +# "grass_border_bottom_right_outer" : (2, 2), +# "wood_door_closed" : (3, 2), +# "wood_door_open" : (4, 2), +# "test_anim" : (0, 6) +# } #Animation name, startX, startY, endX animationDict = { diff --git a/World.py b/World.py index e69de29..14d3f38 100644 --- a/World.py +++ b/World.py @@ -0,0 +1,4 @@ + +worldWidth = 10 +worldHeight = 10 +world = [[]] \ No newline at end of file diff --git a/WorldGen.py b/WorldGen.py new file mode 100644 index 0000000..f40cb9f --- /dev/null +++ b/WorldGen.py @@ -0,0 +1,20 @@ +import WorldTemplates +import World +import GameObject + +def generateWorld(): + template = WorldTemplates.worldTemplate6 + output = [[]] + for y in range(World.worldHeight): + row = [] + for x in range(World.worldWidth): + cell = GameObject.WorldCell() + if template[y][x] == 1: + cell.objects.append(GameObject.GameObject(x, y, "wall_vent", True)) + elif template[y][x] == 2: + cell.objects.append(GameObject.GameObject(x, y, "wall_side", True)) + elif template[y][x] == 3: + cell.objects.append(GameObject.GameObject(x, y, "floor_tile", False)) + row.append(cell) + output.insert(y, row) + return output \ No newline at end of file diff --git a/WorldTemplates.py b/WorldTemplates.py index 93325c5..4d23c60 100644 --- a/WorldTemplates.py +++ b/WorldTemplates.py @@ -1,3 +1,5 @@ +# Some simple world layouts to use for debug + # 0 = Dirt # 1 = Grass # 2 = Wood Wall @@ -135,4 +137,17 @@ worldTemplate5 = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 8,12, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +] + +worldTemplate6 = [ + [2, 1, 1, 1, 1, 1, 1, 1, 1, 2], + [2, 3, 3, 3, 3, 3, 3, 3, 3, 2], + [2, 3, 3, 3, 3, 3, 3, 3, 3, 2], + [2, 3, 3, 3, 3, 3, 3, 3, 3, 2], + [2, 3, 3, 3, 3, 3, 3, 3, 3, 2], + [2, 3, 3, 3, 3, 3, 3, 3, 3, 2], + [2, 3, 3, 3, 3, 3, 3, 3, 3, 2], + [2, 3, 3, 3, 3, 3, 3, 3, 3, 2], + [2, 3, 3, 3, 3, 3, 3, 3, 3, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], ] \ No newline at end of file diff --git a/__pycache__/Algorithm.cpython-39.pyc b/__pycache__/Algorithm.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0536861e611eb0cddba8f7cc207220a01be38a76 GIT binary patch literal 2376 zcma)7OK%)S5boDJcKjeVCSHTEI3S_DL`Fh@q9`&-h&Wlu1_G;%ob~p2J?ruAPS0%c zNBlH#E-Efr_P>`5x65VbtBrOkg`tBbn_P z$9@~{MU+N6acJhdVLw#uEZj;)Z50~V{{Obr-rGmw3TMScm%)VcC<1Zv$Nf>EzpT=GF!%0c&Fs^FLXp}bHv>*(PY*q`gjAnRsc$2sg)vP*MGSq7QwZbh^PI1aza%L z&K}=))JyG4`YC}KTq!<*8MV+ZXrVnxL3`S=GvcRs*KOGyLcyW(8c0q0btW_l{M-;7}-Hu zPM#U~xMa&O5Imk~P3q)`LQRG9tEv5VkRc3m2w4M*eWC72+Gi5^Lp6u~!?It)Y(oD} zWWhTm53~#RT%Bn*qf%t7$0cy_h`k_yc_k*UFtBj62Nm31A*b#ulAcLt8r$|VzgIg& zzn*l98$k!!0j32ykYb;x-?gV}mSKTL=Ao?*+D$f-vt+aX6ELrc&4buEaQ66SbQZl4 zAEMLIV1y?$J^o)YimMpGkDf$@(c37?sFT+xG&xRQ|F=(jvw0imz`P4f!fu(^bxXvr z8vN>>vq)pc@b*qxlqO8P!kb%RX;(f7GuIjPvv$-^w+3+}6;=~9kKzp!wwTSRckvsG z6L9;(CL2SOhtQ^o++-;r>Dcg4sS2yr0u22eTKWJ4f$}y>19}JEg1q z3g~)?79g`kf*A)sCGZ33#~=^KxPWit@8Sied^Xi}KS;Q*$!2Q)65}di4q_ UZ*kb<=BJeAq}qXO`V7Pj0LY{z1^@s6 literal 0 HcmV?d00001 diff --git a/__pycache__/GameObject.cpython-39.pyc b/__pycache__/GameObject.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..269f615b36b769560b2d82f3eee44e961f4461ab GIT binary patch literal 1800 zcmbtUO>Y}F5GA=ES{s(5I&B*FjO4+glXLt3dHfZ!EA5We@8fzIu{BVR7^Z-fWbS zTpt39BTVx?gkobZ*;q&}#VZC+51zi=ew3c8Z%(EvtFr*xxLKBQOs)1YBfwvX)h87$$NML0`OGMwd&G)J5_B;v^SYW1?7Yh}ZqD_zK^%l~IK zFjbLD+dE!<-!?Oy*Xm)O)izo>J-yPN#ewyWDxPb~ScfF2s=5d9n(03N{`n%iKl#=u zZ6>Bp%VP3aS9D=BnO*4Wbgqj0OifmW7|t$ilq7kX*GWRb%nk(O;qte~7dO{-cRNQY zC)`RDG)e4slAKp^UXZ?%BroP^(SFf45Xp}eloBj)`^Z_mi zgMx?l##d#2p4NF)E)k~kbc1v%l0*0ol$!ktbb+t{*8Xn+XAO`|z!<{WVJKP*W8dZG zZeqRXGh>4~KUX>qHC5_eP-x=d=7p&e1dwrg@jcXcaeE`@VOQRas?v?FR4(~rSR3Yp zgbn`^tOZS>Q`%GhF+211V@ZT1tEjyxXgdu+S8t!4G5xjk#3h}lC_}ebxa;~OO?b4t zr6X~{56IvyLr+^r5aWK@)tOl8_!kRT3cDp$QK!dL9lB{N2yGkAXELqT9`q%@cKLvZ z;uar>#jVXMw3|n9pa&G@Jrd;FvgtNytN2cHl)8xz1c@OUM?4BNS^gKPw!WwL`al&$ zMo+mLq*I9;B9!APH3Nr2g2n?riqUZ_Y_D?7#@OCZxyero^_sV&S*7nXCvJR-=`yFc zx7fQnc*Tj$3wkj)Dt_;pbyfovfAH!MSyCs!H{8rVsBR%HNo5ad(w*R+V*{m*xpIx8XriWocm! zhgVJr?4{*}{s?}Wp7v(^{#y|~!w%Ob7+-vN%_-NBg?!hdugJ2G4|H@#7GIMEkDW-~ bzIbAfv%V{UjSkwDcSx|fM;(dXt-;`5N6A<` literal 0 HcmV?d00001 diff --git a/__pycache__/InputHandler.cpython-39.pyc b/__pycache__/InputHandler.cpython-39.pyc index 8bdfa786f921eb75c61c463a2647e1732a5f1f30..69a6c6cfc1574f1a19252b3cce42bb80e93c78bf 100644 GIT binary patch delta 566 zcmYjNv2N5r5S>{&$=cpKMIo15E_YBOLx@5^p$VZ$10o0oiNX@PIPB`UoZ}p8UqmFM zM1l|Cv_AkP9TF`C1r?v*3d&F+N(#iRB~I*0Z)Tp}%hnFC+fG+0jzeJ*fAfRuZ@7nvUV81*q(fW7Us-tTwb>FiCx{WLh&q4WuordFUl?u zlif6*+_h7jMb3nyuM-sp<#c{B?591=?1&aY6v#M_pC)mZsZ2YTb}g(}ShcWbVabA> j@!#I+1=VuCd3Yp8iQ2NxvN-~Q90gBb5ZxW%xH}Glh@gNbmM0of6AJ^F*h$1_hz%i;i@QPeJaF&Om{6E#Wk>c` z_zUdpZ2SWzSK0YdSz8!)FKV3P?aaQJd2jsKyPmM(aUF?xd3tR>D5FFHZ;gtTG>u## zOC>7Nu2EAX&_Jd>x?IJz(Oq>c)Qr(6jS#hrh$b1H!gKh8S8z7rYh9;5@ah(!+or)? z++MszEF}~I_*^bT9J{r{dPnrYb6a&vy7bJlS9k()iu9xdFF^*F%6DNJ zFY_Mcu)=TPYsNrBw4Xao50QtCA*k|0WFdlt8q}#j~h~v#RQnpj63vvQ=ZZAERV8DN&TI`#zpBHhn7QZ8g#jmb4z?SQknuI#1`Zh z-B-Mee%I+RkmFhIMDjILrbP)E39|9u;y@zUu9i=FWMI>(bnPYu7+A#y08U23I1CDW E19~Q3vH$=8 diff --git a/__pycache__/Player.cpython-39.pyc b/__pycache__/Player.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16a40ca31facad061c4301bf70cdecbeb4304cdc GIT binary patch literal 1251 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 AJOBUy diff --git a/__pycache__/World.cpython-39.pyc b/__pycache__/World.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25a12c30e66cc2aaca50528061eb38fa463693f4 GIT binary patch literal 187 zcmYe~<>g`kg62J+5)6U#V-N=!FakLaKwK;YBvKfnK$tO|A)PUbDTOhZL6hkvNWY&Z z^DVCO{Gyzc@XVBwj9c7bwnu7adPd1DRxoEJLlG-bC7Af7lWY|eTAW%`98+A9n3oe1 zP?VpQnp{#GQ&3rypI(}plbM|w6Am&@ub}c4hfQvNN@-529TUhQEI@*Vk%bWeG%+wb literal 0 HcmV?d00001 diff --git a/__pycache__/WorldGen.cpython-39.pyc b/__pycache__/WorldGen.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b631d09e14d83ac0a9ba7796507ae24f2bf7bb6e GIT binary patch literal 720 zcmZ8fJ#W-77`B~{OH%H{gnAvA7C7ex~t1n4yAIC|~1Oqd_ zAUCoh{sKEcz-y;l8JT$P9#YgddSB;x{P_K_oDYWy0_%SLd3Q+=y0oBgz@f+B@(u)w zDCQ`=T5*aUCMltWdS6iLQTz%`{0%74(bUHO7Q&CMa{w-XLr`djTU4L|w^$M7&HT^! z33~IhB?W3d#{`b~*7_>!25Zy?8fh{{+8;v~=R~~K!7S=x*bTL>T@P!2jWMcT_LM#- zzg|-Y)Y~fed&&@$KdvbUG`do1uZwkHvtR6M+$EZ5Z%qK*(st(fXoF!Y6EAblPd~Cs z9dGQ-Z3$UYw(%@ZKJdC0r>f-a>14-@PHMsFF`G9$S4^g(Wgp)+fyk?ZnZU`+j@y04 z%Hm9!#DSBNsxy-u=5zM^{fteOiJkUK+SW8-y->|U z8N4!{sFwzRGX4}!e@9{$I{tfa`XGA^r(`BoUh(XOsBImYH7ijU3&zWHmbsdTth(E* z%&=e;6EKb=1IQt7LqIr$Z-jmD2;aneTi?YufDwD3nD`=sMc9`jhBjE%wb2V>;7s&z SUeg6^@dLo|;lLqrfoo7s5=?p2#ix`2V3W+2qP(4=^Yl>TZlX-=vg8&Fg650J|o#nmU@6T1ii(v3K3 -- 2.20.1