From fcac23a878d8f66787694e6bd91c56881b232bc6 Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewski Date: Fri, 3 Apr 2020 22:08:12 +0200 Subject: [PATCH 01/10] Implemented timer functionality --- src/game/Timer.py | 68 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/src/game/Timer.py b/src/game/Timer.py index 4fbc44b..07496c9 100644 --- a/src/game/Timer.py +++ b/src/game/Timer.py @@ -1,4 +1,66 @@ +import pygame + +# Timer class for the game +# We count time every second, an the time elapsed in game is 60 times the actual time +# So, if we spend 60 seconds, we count that we spent 60 minutes. + +# Day/night cycle parameters +DAY_START = "7:00" +NIGHT_START = "22:00" + + class Timer: - def __init__(self): - self.time - self.cycle + def __init__(self, startTime="12:00"): + self.clock = pygame.time.Clock() + + # Time in milliseconds updated every frame, starts counting from what we specify as a parameter + self.timePassed = self.timeToMs(startTime) + # You have to start the clock manually by calling startClock() method + self.isStarted = False + + def startClock(self): + self.isStarted = True + + def stopClock(self): + self.isStarted = False + + # Returns a string with formatted time + def getPrettyTime(self): + # 60 times faster than real time + minutes = int(self.timePassed / 1000) % 60 + hours = int(self.timePassed / 60000) % 24 + + # Add 0's at the beginning if necessary + prefixHr = "" + prefixMin = "" + if len(str(hours)) < 2: + prefixHr = "0" + if len(str(minutes)) < 2: + prefixMin = "0" + + # Return a formatted time + return prefixHr + str(hours) + ":" + prefixMin + str(minutes) + + # Returns true, if it's daytime + def isItDay(self): + if self.timeToMs(DAY_START) < self.timePassed < self.timeToMs(NIGHT_START): + return True + else: + return False + + # Called every frame to update the timer + def updateTime(self, elapsed): + # Only happens if the time is set to be running + if self.isStarted: + # Modulo, since we use the 24-hour cycle + # In our case, the time loops every 24 minutes + self.timePassed =(self.timePassed + elapsed) % 1440000 + + # Converts time as string to integer milliseconds + def timeToMs(self, timeString): + timeList = timeString.split(':') + hours = timeList[0] + minutes = timeList[1] + return int(hours) * 60000 + int(minutes) * 1000 + + From e78099deb1547d4067722dc10f6f0b27de510b10 Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewski Date: Fri, 3 Apr 2020 22:08:27 +0200 Subject: [PATCH 02/10] Moved sprite group initialization higher in order --- src/game/Game.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/game/Game.py b/src/game/Game.py index e1c1fea..6c208c7 100644 --- a/src/game/Game.py +++ b/src/game/Game.py @@ -5,6 +5,8 @@ from pathlib import Path from game.EventManager import EventManager from game.Screen import Screen +from src.game.Timer import Timer + class Game: def __init__(self): @@ -24,6 +26,7 @@ class Game: print("Initializing pygame...", end=" ") pygame.init() + self.spritesList = pygame.sprite.Group() print("OK") print("Initializing screen, params: " + str(self.config["window"]) + "...", end=" ") @@ -38,8 +41,6 @@ class Game: self.eventManager = EventManager(self) - self.spritesList = pygame.sprite.Group() - self.mainLoop() def mainLoop(self): From 9d9cd159a04aa7c563e289d78f5df5fdd4d41efc Mon Sep 17 00:00:00 2001 From: Wirus Date: Sun, 5 Apr 2020 14:53:54 +0200 Subject: [PATCH 03/10] addEntity method in Map --- src/game/Game.py | 3 +++ src/game/Map.py | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/game/Game.py b/src/game/Game.py index 6e6e8e4..8e5b7b5 100644 --- a/src/game/Game.py +++ b/src/game/Game.py @@ -6,6 +6,7 @@ from os import path from game.EventManager import EventManager from game.Screen import Screen from game.Map import Map +from src.entities.Player import Player class Game: @@ -43,6 +44,8 @@ class Game: # Start Map implement self.mapDataFolder = path.dirname("../data/mapdata/") self.map = Map(path.join(self.mapDataFolder, 'map.txt'), self.screen) + self.player = Player((0, 0), self.map.tileSize) + self.map.addEntity(self.player) # End Map implement self.mainLoop() diff --git a/src/game/Map.py b/src/game/Map.py index 7daa356..17f19d3 100644 --- a/src/game/Map.py +++ b/src/game/Map.py @@ -1,6 +1,7 @@ import pygame from game.TerrainTile import TerrainTile from game.Screen import Locations +from src.entities.Player import Player class Map: def __init__(self, filename, screen): @@ -19,7 +20,7 @@ class Map: self.height = self.tileHeight * self.tileSize self.terrainDraw() - + def terrainDraw(self): for row, tiles in enumerate(self.terrain): for col, tile in enumerate(tiles): @@ -29,5 +30,8 @@ class Map: self.screen.draw(TerrainTile('floor.png', self.tileSize), Locations.MAP, col*self.tileSize, row*self.tileSize) elif tile == '.': self.screen.draw(TerrainTile('grass.png', self.tileSize), Locations.MAP, col*self.tileSize, row*self.tileSize) - + + def addEntity(self, entity): + self.entities.append(entity) + self.screen.draw(entity, Locations.MAP, 0, 0) From 6a1fe72cabdbc3b85d9210c17298856cbd392eac Mon Sep 17 00:00:00 2001 From: Wirus Date: Sun, 5 Apr 2020 15:41:42 +0200 Subject: [PATCH 04/10] Game: correct declarative order Map: collidableTerrain list --- src/game/Game.py | 7 ++++--- src/game/Map.py | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/game/Game.py b/src/game/Game.py index 8e5b7b5..d586e17 100644 --- a/src/game/Game.py +++ b/src/game/Game.py @@ -39,14 +39,15 @@ class Game: self.screen = Screen(self, self.config["window"]) print("OK") - self.eventManager = EventManager(self) - # Start Map implement + self.mapDataFolder = path.dirname("../data/mapdata/") self.map = Map(path.join(self.mapDataFolder, 'map.txt'), self.screen) self.player = Player((0, 0), self.map.tileSize) self.map.addEntity(self.player) - # End Map implement + self.eventManager = EventManager(self, self.player) + + self.mainLoop() diff --git a/src/game/Map.py b/src/game/Map.py index 17f19d3..fecffd0 100644 --- a/src/game/Map.py +++ b/src/game/Map.py @@ -8,6 +8,8 @@ class Map: self.screen = screen self.terrain = [] self.entities = [] + self.collidableTerrain = [] + with open(filename, 'rt') as f: for line in f: self.terrain.append(line) @@ -26,6 +28,7 @@ class Map: for col, tile in enumerate(tiles): if tile == 'w': self.screen.draw(TerrainTile('wall.png', self.tileSize), Locations.MAP, col*self.tileSize, row*self.tileSize) + self.collidableTerrain.append(self.terrain) elif tile == ',': self.screen.draw(TerrainTile('floor.png', self.tileSize), Locations.MAP, col*self.tileSize, row*self.tileSize) elif tile == '.': From c98d8870a8e0f1c143960176d258b9a41547ed62 Mon Sep 17 00:00:00 2001 From: Wirus Date: Sun, 5 Apr 2020 15:44:03 +0200 Subject: [PATCH 05/10] add some images and venv to gitignore --- .gitignore | 1 + data/images/entities/bush.png | Bin 0 -> 3446 bytes data/images/entities/treasure.png | Bin 0 -> 7840 bytes 3 files changed, 1 insertion(+) create mode 100644 data/images/entities/bush.png create mode 100644 data/images/entities/treasure.png diff --git a/.gitignore b/.gitignore index 78b759b..215a7f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /.idea/ __pycache__ +/venv/ diff --git a/data/images/entities/bush.png b/data/images/entities/bush.png new file mode 100644 index 0000000000000000000000000000000000000000..a59627dd4b4326f04b095ce40cff836a37cc8da7 GIT binary patch literal 3446 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 Date: Sun, 5 Apr 2020 15:51:16 +0200 Subject: [PATCH 06/10] Map: delete import Player --- src/game/Map.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/game/Map.py b/src/game/Map.py index fecffd0..487db0f 100644 --- a/src/game/Map.py +++ b/src/game/Map.py @@ -1,7 +1,6 @@ import pygame from game.TerrainTile import TerrainTile from game.Screen import Locations -from src.entities.Player import Player class Map: def __init__(self, filename, screen): From 853a3b16013b669eeb3446a444bf9220fa464362 Mon Sep 17 00:00:00 2001 From: Wirus Date: Sun, 5 Apr 2020 19:08:08 +0200 Subject: [PATCH 07/10] Map: collidable group of sprites TerrainTile: position attributes EventManager: collision method --- src/entities/Collidable.py | 2 +- src/entities/Player.py | 3 +-- src/game/EventManager.py | 16 ++++++++++++---- src/game/Game.py | 5 +---- src/game/Map.py | 10 ++++++---- src/game/TerrainTile.py | 6 +++++- 6 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/entities/Collidable.py b/src/entities/Collidable.py index 72a7c36..9ecf2eb 100644 --- a/src/entities/Collidable.py +++ b/src/entities/Collidable.py @@ -14,7 +14,7 @@ class Collidable(Entity): return False -col = Collidable(1, 1, 1) +#col = Collidable(1, 1, 1) """ diff --git a/src/entities/Player.py b/src/entities/Player.py index ed6f38a..6472d46 100644 --- a/src/entities/Player.py +++ b/src/entities/Player.py @@ -18,7 +18,7 @@ class Player(Entity): self.rotate(rotation) # Otherwise, move one tile to a given direction else: - # TODO: Collision checks + # TODO: Collision checks "and not to events" if rotation.value == Rotations.NORTH.value: self.rect.y -= self.rect.w elif rotation.value == Rotations.EAST.value: @@ -32,7 +32,6 @@ class Player(Entity): self.image = pygame.transform.rotate(self.image, ((self.rotation.value - rotation.value) * 90)) self.rotation = rotation - class Rotations(Enum): NORTH = 0 EAST = 1 diff --git a/src/game/EventManager.py b/src/game/EventManager.py index d2a9a13..5143fee 100644 --- a/src/game/EventManager.py +++ b/src/game/EventManager.py @@ -7,6 +7,7 @@ TIMEOUT = 100 class EventManager: keyTimeout = 0 + #self.game.map def __init__(self, gameObject, player): self.game = gameObject self.player = player @@ -33,12 +34,19 @@ class EventManager: # Key names are temporary # TODO: Load key bindings from JSON - if keys[pygame.K_w]: + if keys[pygame.K_w] and not self.collision(self.player.rect.x, self.player.rect.y - self.player.rect.w): self.player.move(Rotations.NORTH) - if keys[pygame.K_s]: + if keys[pygame.K_s] and not self.collision(self.player.rect.x, self.player.rect.y + self.player.rect.w): self.player.move(Rotations.SOUTH) - if keys[pygame.K_d]: + if keys[pygame.K_d] and not self.collision(self.player.rect.x + self.player.rect.w, self.player.rect.y): self.player.move(Rotations.EAST) - if keys[pygame.K_a]: + if keys[pygame.K_a] and not self.collision(self.player.rect.x - self.player.rect.w, self.player.rect.y): self.player.move(Rotations.WEST) + # add object to map.collidables list to be collidable + def collision(self, x, y): + for b in self.game.map.collidables: + if b.rect.x == x and b.rect.y == y: + return True + return False + diff --git a/src/game/Game.py b/src/game/Game.py index d586e17..88f4647 100644 --- a/src/game/Game.py +++ b/src/game/Game.py @@ -28,6 +28,7 @@ class Game: print("Initializing pygame...", end=" ") pygame.init() self.spritesList = pygame.sprite.Group() + print("OK") print("Initializing screen, params: " + str(self.config["window"]) + "...", end=" ") @@ -39,16 +40,12 @@ class Game: self.screen = Screen(self, self.config["window"]) print("OK") - - self.mapDataFolder = path.dirname("../data/mapdata/") self.map = Map(path.join(self.mapDataFolder, 'map.txt'), self.screen) self.player = Player((0, 0), self.map.tileSize) self.map.addEntity(self.player) self.eventManager = EventManager(self, self.player) - - self.mainLoop() def mainLoop(self): diff --git a/src/game/Map.py b/src/game/Map.py index 487db0f..c072880 100644 --- a/src/game/Map.py +++ b/src/game/Map.py @@ -8,6 +8,7 @@ class Map: self.terrain = [] self.entities = [] self.collidableTerrain = [] + self.collidables = pygame.sprite.Group() with open(filename, 'rt') as f: for line in f: @@ -26,12 +27,13 @@ class Map: for row, tiles in enumerate(self.terrain): for col, tile in enumerate(tiles): if tile == 'w': - self.screen.draw(TerrainTile('wall.png', self.tileSize), Locations.MAP, col*self.tileSize, row*self.tileSize) - self.collidableTerrain.append(self.terrain) + object = TerrainTile(col, row, 'wall.png', self.tileSize) + self.screen.draw(object, Locations.MAP, 0, 0) + self.collidables.add(object) elif tile == ',': - self.screen.draw(TerrainTile('floor.png', self.tileSize), Locations.MAP, col*self.tileSize, row*self.tileSize) + self.screen.draw(TerrainTile(col, row, 'floor.png', self.tileSize), Locations.MAP, 0, 0) elif tile == '.': - self.screen.draw(TerrainTile('grass.png', self.tileSize), Locations.MAP, col*self.tileSize, row*self.tileSize) + self.screen.draw(TerrainTile(col, row, 'grass.png', self.tileSize), Locations.MAP, 0, 0) def addEntity(self, entity): self.entities.append(entity) diff --git a/src/game/TerrainTile.py b/src/game/TerrainTile.py index 636838b..064c303 100644 --- a/src/game/TerrainTile.py +++ b/src/game/TerrainTile.py @@ -4,10 +4,14 @@ from os import path class TerrainTile(pygame.sprite.Sprite): - def __init__(self, texture, tileSize): + def __init__(self, x, y, texture, tileSize): super().__init__() self.imagesFolder = path.dirname("../data/images/") self.terrainFolder = path.join(self.imagesFolder, 'terrain') self.image = pygame.image.load(os.path.join(self.terrainFolder, texture)).convert() self.image = pygame.transform.scale(self.image, (tileSize, tileSize)) self.rect = self.image.get_rect() + self.x = x + self.y = y + self.rect.x = x * tileSize + self.rect.y = y * tileSize From c1215196055b1b7366697db9d50ea3ae532d1766 Mon Sep 17 00:00:00 2001 From: Wirus Date: Sun, 5 Apr 2020 20:20:37 +0200 Subject: [PATCH 08/10] move collision to Map class --- src/game/EventManager.py | 15 +++++---------- src/game/Map.py | 6 ++++++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/game/EventManager.py b/src/game/EventManager.py index 5143fee..f093015 100644 --- a/src/game/EventManager.py +++ b/src/game/EventManager.py @@ -34,19 +34,14 @@ class EventManager: # Key names are temporary # TODO: Load key bindings from JSON - if keys[pygame.K_w] and not self.collision(self.player.rect.x, self.player.rect.y - self.player.rect.w): + if keys[pygame.K_w] and not self.game.map.collision(self.player.rect.x, self.player.rect.y - self.player.rect.w): self.player.move(Rotations.NORTH) - if keys[pygame.K_s] and not self.collision(self.player.rect.x, self.player.rect.y + self.player.rect.w): + if keys[pygame.K_s] and not self.game.map.collision(self.player.rect.x, self.player.rect.y + self.player.rect.w): self.player.move(Rotations.SOUTH) - if keys[pygame.K_d] and not self.collision(self.player.rect.x + self.player.rect.w, self.player.rect.y): + if keys[pygame.K_d] and not self.game.map.collision(self.player.rect.x + self.player.rect.w, self.player.rect.y): self.player.move(Rotations.EAST) - if keys[pygame.K_a] and not self.collision(self.player.rect.x - self.player.rect.w, self.player.rect.y): + if keys[pygame.K_a] and not self.game.map.collision(self.player.rect.x - self.player.rect.w, self.player.rect.y): self.player.move(Rotations.WEST) - # add object to map.collidables list to be collidable - def collision(self, x, y): - for b in self.game.map.collidables: - if b.rect.x == x and b.rect.y == y: - return True - return False + diff --git a/src/game/Map.py b/src/game/Map.py index c072880..e5a1d27 100644 --- a/src/game/Map.py +++ b/src/game/Map.py @@ -39,3 +39,9 @@ class Map: self.entities.append(entity) self.screen.draw(entity, Locations.MAP, 0, 0) + # add object to map.collidables list to be collidable + def collision(self, x, y): + for b in self.collidables: + if b.rect.x == x and b.rect.y == y: + return True + return False From f399ba0d53afae6221aa0b5b111cae0cc2863ac4 Mon Sep 17 00:00:00 2001 From: Wirus Date: Sun, 5 Apr 2020 20:24:28 +0200 Subject: [PATCH 09/10] add entity to collidables in Map method --- src/game/Map.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/game/Map.py b/src/game/Map.py index e5a1d27..82a498f 100644 --- a/src/game/Map.py +++ b/src/game/Map.py @@ -6,7 +6,6 @@ class Map: def __init__(self, filename, screen): self.screen = screen self.terrain = [] - self.entities = [] self.collidableTerrain = [] self.collidables = pygame.sprite.Group() @@ -36,8 +35,8 @@ class Map: self.screen.draw(TerrainTile(col, row, 'grass.png', self.tileSize), Locations.MAP, 0, 0) def addEntity(self, entity): - self.entities.append(entity) self.screen.draw(entity, Locations.MAP, 0, 0) + self.collidables.add(entity) # add object to map.collidables list to be collidable def collision(self, x, y): From c91c82d80aae8d932947745337dcbfe463633b71 Mon Sep 17 00:00:00 2001 From: Marcin Kostrzewski Date: Sun, 5 Apr 2020 20:47:24 +0200 Subject: [PATCH 10/10] Fixed bug: not being able to rotate with specific collisions --- src/entities/Player.py | 28 ++++++++++++---------------- src/game/EventManager.py | 24 ++++++++++++++++-------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/entities/Player.py b/src/entities/Player.py index 6472d46..439f38b 100644 --- a/src/entities/Player.py +++ b/src/entities/Player.py @@ -13,24 +13,20 @@ class Player(Entity): # Move in a desired direction def move(self, rotation): - # If the player is not facing given direction, it will not move the first time, it will only get rotated - if self.rotation.value != rotation.value: - self.rotate(rotation) - # Otherwise, move one tile to a given direction - else: - # TODO: Collision checks "and not to events" - if rotation.value == Rotations.NORTH.value: - self.rect.y -= self.rect.w - elif rotation.value == Rotations.EAST.value: - self.rect.x += self.rect.w - elif rotation.value == Rotations.SOUTH.value: - self.rect.y += self.rect.w - elif rotation.value == Rotations.WEST.value: - self.rect.x -= self.rect.w + if rotation.value == Rotations.NORTH.value: + self.rect.y -= self.rect.w + elif rotation.value == Rotations.EAST.value: + self.rect.x += self.rect.w + elif rotation.value == Rotations.SOUTH.value: + self.rect.y += self.rect.w + elif rotation.value == Rotations.WEST.value: + self.rect.x -= self.rect.w def rotate(self, rotation): - self.image = pygame.transform.rotate(self.image, ((self.rotation.value - rotation.value) * 90)) - self.rotation = rotation + # If the player is not facing given direction, it will not move the first time, it will only get rotated + if self.rotation.value != rotation.value: + self.image = pygame.transform.rotate(self.image, ((self.rotation.value - rotation.value) * 90)) + self.rotation = rotation class Rotations(Enum): NORTH = 0 diff --git a/src/game/EventManager.py b/src/game/EventManager.py index f093015..540b60d 100644 --- a/src/game/EventManager.py +++ b/src/game/EventManager.py @@ -34,14 +34,22 @@ class EventManager: # Key names are temporary # TODO: Load key bindings from JSON - if keys[pygame.K_w] and not self.game.map.collision(self.player.rect.x, self.player.rect.y - self.player.rect.w): - self.player.move(Rotations.NORTH) - if keys[pygame.K_s] and not self.game.map.collision(self.player.rect.x, self.player.rect.y + self.player.rect.w): - self.player.move(Rotations.SOUTH) - if keys[pygame.K_d] and not self.game.map.collision(self.player.rect.x + self.player.rect.w, self.player.rect.y): - self.player.move(Rotations.EAST) - if keys[pygame.K_a] and not self.game.map.collision(self.player.rect.x - self.player.rect.w, self.player.rect.y): - self.player.move(Rotations.WEST) + if keys[pygame.K_w]: + self.player.rotate(Rotations.NORTH) + if not self.game.map.collision(self.player.rect.x, self.player.rect.y - self.player.rect.w): + self.player.move(Rotations.NORTH) + if keys[pygame.K_s]: + self.player.rotate(Rotations.SOUTH) + if not self.game.map.collision(self.player.rect.x, self.player.rect.y + self.player.rect.w): + self.player.move(Rotations.SOUTH) + if keys[pygame.K_d]: + self.player.rotate(Rotations.EAST) + if not self.game.map.collision(self.player.rect.x + self.player.rect.w, self.player.rect.y): + self.player.move(Rotations.EAST) + if keys[pygame.K_a]: + self.player.rotate(Rotations.WEST) + if not self.game.map.collision(self.player.rect.x - self.player.rect.w, self.player.rect.y): + self.player.move(Rotations.WEST)