From: Stan_Lewry Date: Sat, 17 Jul 2021 12:28:11 +0000 (+0100) Subject: restructure X-Git-Url: https://stanlewry.com/index.cgi?a=commitdiff_plain;h=37f45a6e97b94ec1bb383fda168c8fc060a8a688;p=pyroguelike.git restructure --- 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 0000000..08a709b Binary files /dev/null and b/Assets/doomSheet.png differ diff --git a/Debug.py b/Debug.py new file mode 100644 index 0000000..30f6e4a --- /dev/null +++ b/Debug.py @@ -0,0 +1 @@ +debugRects = [] \ No newline at end of file diff --git a/GameObject.py b/GameObject.py new file mode 100644 index 0000000..95d191e --- /dev/null +++ b/GameObject.py @@ -0,0 +1,34 @@ +import Texture + +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 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 0000000..0536861 Binary files /dev/null and b/__pycache__/Algorithm.cpython-39.pyc differ diff --git a/__pycache__/Debug.cpython-39.pyc b/__pycache__/Debug.cpython-39.pyc new file mode 100644 index 0000000..a8bac27 Binary files /dev/null and b/__pycache__/Debug.cpython-39.pyc differ diff --git a/__pycache__/GameObject.cpython-39.pyc b/__pycache__/GameObject.cpython-39.pyc new file mode 100644 index 0000000..269f615 Binary files /dev/null and b/__pycache__/GameObject.cpython-39.pyc differ diff --git a/__pycache__/InputHandler.cpython-39.pyc b/__pycache__/InputHandler.cpython-39.pyc index 8bdfa78..69a6c6c 100644 Binary files a/__pycache__/InputHandler.cpython-39.pyc and b/__pycache__/InputHandler.cpython-39.pyc differ diff --git a/__pycache__/Player.cpython-39.pyc b/__pycache__/Player.cpython-39.pyc new file mode 100644 index 0000000..16a40ca Binary files /dev/null and b/__pycache__/Player.cpython-39.pyc differ diff --git a/__pycache__/Renderer.cpython-39.pyc b/__pycache__/Renderer.cpython-39.pyc new file mode 100644 index 0000000..6478250 Binary files /dev/null and b/__pycache__/Renderer.cpython-39.pyc differ diff --git a/__pycache__/Texture.cpython-39.pyc b/__pycache__/Texture.cpython-39.pyc index d8c9f6c..1fa987f 100644 Binary files a/__pycache__/Texture.cpython-39.pyc and b/__pycache__/Texture.cpython-39.pyc differ diff --git a/__pycache__/World.cpython-39.pyc b/__pycache__/World.cpython-39.pyc new file mode 100644 index 0000000..25a12c3 Binary files /dev/null and b/__pycache__/World.cpython-39.pyc differ diff --git a/__pycache__/WorldGen.cpython-39.pyc b/__pycache__/WorldGen.cpython-39.pyc new file mode 100644 index 0000000..b631d09 Binary files /dev/null and b/__pycache__/WorldGen.cpython-39.pyc differ diff --git a/__pycache__/WorldTemplates.cpython-39.pyc b/__pycache__/WorldTemplates.cpython-39.pyc index 7d4ad93..4490018 100644 Binary files a/__pycache__/WorldTemplates.cpython-39.pyc and b/__pycache__/WorldTemplates.cpython-39.pyc differ