From ede6112af4ece937de8a0daee801216c771dba2b Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 16:59:37 +0100 Subject: [PATCH 01/12] use texture atlas instead of separate sprites --- survival/game_map.py | 8 +++----- survival/textureatlas.py | 4 ++-- survival/tile.py | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/survival/game_map.py b/survival/game_map.py index a0c68c0..d63f7d6 100644 --- a/survival/game_map.py +++ b/survival/game_map.py @@ -6,6 +6,7 @@ from pygame.rect import Rect from survival.player import Player from survival.quad_tree import QuadTree from survival.stone import Stone +from survival.textureatlas import TextureAtlas from survival.tile import Tile @@ -18,17 +19,14 @@ class GameMap: self.player = Player() self.game_objects.append(self.player) self.tiles = [[Tile() for x in range(width)] for y in range(height)] - self.textures = [pygame.image.load(os.path.join('..', 'assets', 'map1.png')), - pygame.image.load(os.path.join('..', 'assets', 'map2.png')), - pygame.image.load(os.path.join('..', 'assets', 'map3.png')), - pygame.image.load(os.path.join('..', 'assets', 'map4.png'))] + self.atlas = TextureAtlas(os.path.join('..', 'assets', 'atlas.png')) self.game_objects.append(Stone([100, 200])) self.quad_tree = QuadTree(0, Rect(0, 0, width * 32, height * 32)) def draw(self, window): for y in range(self.height): for x in range(self.width): - window.blit(self.textures[self.tiles[y][x].background_id], (x * 32, y * 32)) + window.blit(self.atlas.image_at(self.tiles[y][x].origin, (32, 32)), (x*32, y*32)) for game_object in self.game_objects: game_object.draw(window) diff --git a/survival/textureatlas.py b/survival/textureatlas.py index 4628c60..dea9461 100644 --- a/survival/textureatlas.py +++ b/survival/textureatlas.py @@ -5,8 +5,8 @@ class TextureAtlas(object): def __init__(self, filename): self.atlas = pygame.image.load(filename).convert() - def image_at(self, rectangle, color_key=None): - rect = pygame.Rect(rectangle) + def image_at(self, origin, target, color_key=None): + rect = pygame.Rect(origin, target) image = pygame.Surface(rect.size).convert() image.blit(self.atlas, (0, 0), rect) if color_key is not None: diff --git a/survival/tile.py b/survival/tile.py index bff4aab..ac813d3 100644 --- a/survival/tile.py +++ b/survival/tile.py @@ -4,4 +4,4 @@ from random import randrange class Tile: def __init__(self): - self.background_id = randrange(4) + self.origin = (0, 0) -- 2.20.1 From ffec6dd74a154de62ca3b1c43d05e95e6d4824ab Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 16:59:50 +0100 Subject: [PATCH 02/12] add atlas.png --- assets/atlas.png | Bin 0 -> 10633 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/atlas.png diff --git a/assets/atlas.png b/assets/atlas.png new file mode 100644 index 0000000000000000000000000000000000000000..25b0add0b39400f3b38d3c78bb6543b4225419be GIT binary patch literal 10633 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 Bv339e literal 0 HcmV?d00001 -- 2.20.1 From 04efd8876ab87b57422f61d1f02f61aab2b94e5d Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 17:12:11 +0100 Subject: [PATCH 03/12] introduce tiles layer --- survival/game_map.py | 13 +++---------- survival/tile.py | 4 ---- survival/tile_layer.py | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 survival/tile_layer.py diff --git a/survival/game_map.py b/survival/game_map.py index d63f7d6..a5fdcb4 100644 --- a/survival/game_map.py +++ b/survival/game_map.py @@ -1,13 +1,9 @@ -import os - -import pygame from pygame.rect import Rect from survival.player import Player from survival.quad_tree import QuadTree from survival.stone import Stone -from survival.textureatlas import TextureAtlas -from survival.tile import Tile +from survival.tile_layer import TileLayer class GameMap: @@ -18,15 +14,12 @@ class GameMap: self.game_objects = [] self.player = Player() self.game_objects.append(self.player) - self.tiles = [[Tile() for x in range(width)] for y in range(height)] - self.atlas = TextureAtlas(os.path.join('..', 'assets', 'atlas.png')) + self.tiles_layer = TileLayer(width, height) self.game_objects.append(Stone([100, 200])) self.quad_tree = QuadTree(0, Rect(0, 0, width * 32, height * 32)) def draw(self, window): - for y in range(self.height): - for x in range(self.width): - window.blit(self.atlas.image_at(self.tiles[y][x].origin, (32, 32)), (x*32, y*32)) + self.tiles_layer.draw(window) for game_object in self.game_objects: game_object.draw(window) diff --git a/survival/tile.py b/survival/tile.py index ac813d3..b75276e 100644 --- a/survival/tile.py +++ b/survival/tile.py @@ -1,7 +1,3 @@ -import pygame -from random import randrange - - class Tile: def __init__(self): self.origin = (0, 0) diff --git a/survival/tile_layer.py b/survival/tile_layer.py new file mode 100644 index 0000000..154d9d1 --- /dev/null +++ b/survival/tile_layer.py @@ -0,0 +1,17 @@ +import os + +from survival.textureatlas import TextureAtlas +from survival.tile import Tile + + +class TileLayer: + def __init__(self, width, height): + self.width = width + self.height = height + self.tiles = [[Tile() for x in range(self.width)] for y in range(self.height)] + self.atlas = TextureAtlas(os.path.join('..', 'assets', 'atlas.png')) + + def draw(self, window): + for y in range(self.height): + for x in range(self.width): + window.blit(self.atlas.image_at(self.tiles[y][x].origin, (32, 32)), (x * 32, y * 32)) -- 2.20.1 From e0ca3c5f87b253f8f9293b1ee5d9deefb8b8db9e Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 18:42:40 +0100 Subject: [PATCH 04/12] optimize tiles drawing --- survival/textureatlas.py | 6 +++++- survival/tile.py | 1 + survival/tile_layer.py | 9 ++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/survival/textureatlas.py b/survival/textureatlas.py index dea9461..c723c27 100644 --- a/survival/textureatlas.py +++ b/survival/textureatlas.py @@ -4,15 +4,19 @@ import pygame class TextureAtlas(object): def __init__(self, filename): self.atlas = pygame.image.load(filename).convert() + self.images = {} def image_at(self, origin, target, color_key=None): + if origin in self.images: + return self.images[origin] rect = pygame.Rect(origin, target) image = pygame.Surface(rect.size).convert() image.blit(self.atlas, (0, 0), rect) if color_key is not None: - if color_key is -1: + if color_key == -1: color_key = image.get_at((0, 0)) image.set_colorkey(color_key, pygame.RLEACCEL) + self.images[origin] = image return image def images_at(self, rects, color_key=None): diff --git a/survival/tile.py b/survival/tile.py index b75276e..3be5a8c 100644 --- a/survival/tile.py +++ b/survival/tile.py @@ -1,3 +1,4 @@ class Tile: def __init__(self): self.origin = (0, 0) + self.image = None diff --git a/survival/tile_layer.py b/survival/tile_layer.py index 154d9d1..9dfaf75 100644 --- a/survival/tile_layer.py +++ b/survival/tile_layer.py @@ -10,8 +10,15 @@ class TileLayer: self.height = height self.tiles = [[Tile() for x in range(self.width)] for y in range(self.height)] self.atlas = TextureAtlas(os.path.join('..', 'assets', 'atlas.png')) + self.loadTiles() + + def loadTiles(self): + for y in range(self.height): + for x in range(self.width): + self.tiles[y][x].image = self.atlas.image_at(self.tiles[y][x].origin, (32, 32)) def draw(self, window): for y in range(self.height): for x in range(self.width): - window.blit(self.atlas.image_at(self.tiles[y][x].origin, (32, 32)), (x * 32, y * 32)) + if self.tiles[y][x] is not None: + window.blit(self.tiles[y][x].image, (x * 32, y * 32)) -- 2.20.1 From 51d3ce520b3cfaa30505588755f832cb087efe19 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 20:23:04 +0100 Subject: [PATCH 05/12] move default tile origin value to constructor --- survival/tile.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/survival/tile.py b/survival/tile.py index 3be5a8c..0c5aa1c 100644 --- a/survival/tile.py +++ b/survival/tile.py @@ -1,4 +1,4 @@ class Tile: - def __init__(self): - self.origin = (0, 0) + def __init__(self, origin=(0, 0)): + self.origin = origin self.image = None -- 2.20.1 From 0f92cbce7d26f9b3ab410a59b18f55e13436bb4f Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 20:23:38 +0100 Subject: [PATCH 06/12] change free roam movement to grid movement --- survival/__init__.py | 14 +++++++------- survival/game_map.py | 32 ++++---------------------------- survival/player.py | 44 ++++++++++++++++++++++++++++---------------- 3 files changed, 39 insertions(+), 51 deletions(-) diff --git a/survival/__init__.py b/survival/__init__.py index ad64f01..4bb29f1 100644 --- a/survival/__init__.py +++ b/survival/__init__.py @@ -6,13 +6,13 @@ window_width = 1280 window_height = 720 -def draw_game(): - game_map.draw(win) +def draw_game(delta): + game_map.draw(delta, win) pygame.display.update() -def update_game(pressed_keys): - game_map.update(pressed_keys) +def update_game(delta, pressed_keys): + game_map.update(delta, pressed_keys) pass @@ -30,7 +30,7 @@ if __name__ == '__main__': while run: # Set the framerate - clock.tick(60) + ms = clock.tick(60) events = pygame.event.get() @@ -40,5 +40,5 @@ if __name__ == '__main__': keys = pygame.key.get_pressed() - draw_game() - update_game(keys) + draw_game(ms) + update_game(ms, keys) diff --git a/survival/game_map.py b/survival/game_map.py index a5fdcb4..4d72583 100644 --- a/survival/game_map.py +++ b/survival/game_map.py @@ -1,41 +1,17 @@ -from pygame.rect import Rect - from survival.player import Player -from survival.quad_tree import QuadTree -from survival.stone import Stone from survival.tile_layer import TileLayer class GameMap: - def __init__(self, width, height): self.width = width self.height = height - self.game_objects = [] self.player = Player() - self.game_objects.append(self.player) self.tiles_layer = TileLayer(width, height) - self.game_objects.append(Stone([100, 200])) - self.quad_tree = QuadTree(0, Rect(0, 0, width * 32, height * 32)) - def draw(self, window): + def draw(self, delta, window): self.tiles_layer.draw(window) + self.player.draw(window) - for game_object in self.game_objects: - game_object.draw(window) - - def update(self, pressed_keys): - self.quad_tree.clear() - - for game_object in self.game_objects: - self.quad_tree.insert(game_object) - - self.player.update(pressed_keys) - - for game_object in self.game_objects: - possible_colliders = [] - self.quad_tree.retrieve(possible_colliders, game_object) - for collider in possible_colliders: - if game_object.get_rect().colliderect(collider.get_rect()) and game_object != collider: - game_object.velocity = [0, 0] - game_object.pos = game_object.last_pos + def update(self, delta, pressed_keys): + self.player.update(delta, pressed_keys) diff --git a/survival/player.py b/survival/player.py index bd4cf58..f0e9c33 100644 --- a/survival/player.py +++ b/survival/player.py @@ -8,27 +8,39 @@ from survival.game_object import GameObject class Player(GameObject): def __init__(self): super().__init__([0, 0], os.path.join('..', 'assets', 'player.png')) + self.speed = 3 + self.movement_target = [self.pos[0], self.pos[1]] def draw(self, window): super().draw(window) - def update(self, pressed_keys): + def is_moving(self): + return self.pos != self.movement_target + + def update(self, delta, pressed_keys): + if self.is_moving(): + if self.velocity[0] != 0: + self.pos[0] += self.velocity[0] * self.speed * delta / 100 + if abs(self.movement_target[0] - self.pos[0]) < 0.1 * self.speed: + self.velocity = [0, 0] + self.pos = self.movement_target + else: + self.pos[1] += self.velocity[1] * self.speed * delta / 100 + if abs(self.pos[1] - self.movement_target[1]) < 0.1 * self.speed: + self.velocity = [0, 0] + self.pos = self.movement_target + return + if pressed_keys[pygame.K_LEFT]: - self.velocity[0] = -1 + self.velocity = [-1, 0] + self.movement_target = [self.pos[0] - 32, self.pos[1]] elif pressed_keys[pygame.K_RIGHT]: - self.velocity[0] = 1 - else: - self.velocity[0] = 0 - - if pressed_keys[pygame.K_DOWN]: - self.velocity[1] = 1 + self.velocity = [1, 0] + self.movement_target = [self.pos[0] + 32, self.pos[1]] + elif pressed_keys[pygame.K_DOWN]: + self.velocity = [0, 1] + self.movement_target = [self.pos[0], self.pos[1] + 32] elif pressed_keys[pygame.K_UP]: - self.velocity[1] = -1 - else: - self.velocity[1] = 0 - - self.last_pos = [self.pos[0], self.pos[1]] - - self.pos[0] += self.velocity[0] - self.pos[1] += self.velocity[1] + self.velocity = [0, -1] + self.movement_target = [self.pos[0], self.pos[1] - 32] -- 2.20.1 From ebced9200d59de31197e054911c8f393aeec67ac Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 22:43:26 +0100 Subject: [PATCH 07/12] Replace texture atlas by using origin coordinates --- assets/stevenson.png | Bin 0 -> 2014 bytes survival/image.py | 22 ++++++++++++++++++++++ survival/player.py | 22 ++++++++++++++++++---- survival/textureatlas.py | 28 ---------------------------- survival/tile_layer.py | 17 +++++------------ 5 files changed, 45 insertions(+), 44 deletions(-) create mode 100644 assets/stevenson.png create mode 100644 survival/image.py delete mode 100644 survival/textureatlas.py diff --git a/assets/stevenson.png b/assets/stevenson.png new file mode 100644 index 0000000000000000000000000000000000000000..00e57c8621bc8fe1d986a16d295a4762ae004a47 GIT binary patch literal 2014 zcmV<42O;>0P)Pa_-7IWAq|0q7%Cf+hNd#MwHhr%DI06jIL>`IaT~{R?E5#;7tX%vtPjg*Ax%uZe z{s5QKQ29)(!rO6S@tggSmDzQiuJiNd0Ib$WkA4B7+z)Eo7`^9nFfRR^r-z~)98n~^ z2ZqJJ<5N$gqR*jt@ki}d5(Jmu%h0YnKnaQ~N4xcnTbY2uEP zGbl0#@I0V&Cvg|68T#bcgCBmFk_S)mYy82p$p86CelLm4u;AI!4#wnzXCcLgTQ+r^ zpPz^B`^wuOgg~476R23{_w93ppv8DQr6?hJ-xi;hSHJo~Xw3hnX5;TxCtf7@d1&L+ z3bffjKoVmR}ivD;-CLDO{Ie2H}%N3ej_pddUX@) z<#n)?*vRk!D2fbqp0`{*A`GNF5F z=pRZlen*w>OVqVB%|NxR zF)%p5_`y2>U?&m@RN{SDSj!gk}TS7R-8$?@k$p1|`<}*>Ti-*7)qo_$5O{b)$@XkDoxTZsF>cOQ=*vI6r8) zt_w{qz^vTF!NbQ8kIA_B+66eZZ6l9oLpq88)mk0e@)DA%4EkaU1fj7WX5%pHf%@_i zQmHf#OTAXq{C16|CK11R1J|xE!Lm$@Bqwp(zyRk5twgdh!P~fP5ZCj0$g+abu?+f0 z_VM&`WfMaKeV(oG>;TJ}2D7%woy*W!FN?P}M4CO2N!L}#O1$UQ5HitX zKb|Lm=)?iC*)$((HC076o8e2XW_j5xob^IYT}CF8h9vfW85T94+b}sLX{u^XOe8^w zgm>nz!?A26GHewv$oWAlljXB~RMv;Fu&@YGmM}E2AE`_h?2N)zn_6DY=pX_V33Dvg zyL4k^o42!Zn7S?`MS)?g5F+^6Vcyexrq$I|i}6c0ZlG+;Lx9M8-kQ>f(d+@v4_d3M ztDI0OyaU(Vgdoar;Xvu@=jr3)W1bry9Yuh2vUPt#{VoqO(}$1p|7Wkf$-h;2j(i50 z)I=avup57y0_H#d(^rvAr&@e>%Ek2IdqAjz*?+zPLSEtgp!KNm3@6YW#q`~GgAx<7 zSN;xxyw1~K!s(7I@O32Yv9mL~jxkm1Ve;E=KN5H)e31E%ot?q|7~@;*`O9zo#8ZC0 zVzq=*eBN(%wj*qRfvlp|)uY5ZI8*{6r4Q!S-LfHY^i~Odd;I}hr z7l#pjJAlOY;^PvJMnXW7uD#B0Dhhr(Q|e;hqpKqv+=hUbT(<)M{h;n#H~h%AxAT1|L)Y?F-}S%34hy6h?w70Sa$T9(^UlE zCvrkOjJc~K;_ns5LzlMrjsV$fbI4D92!bT?`@)@vJUrEV2|Ir(6N2_q<2S`@$}L>& z_&Hw=z#5!sa`COk7BL~Mw6N8_3G(cd=K`mH?XwTi+}8cl?FS<%^G>xjJnb|lcKuV1 wFunudsrNWr2Pa^9DOT}OJAt2G-x7fT0I_Cc1&kt(egFUf07*qoM6N<$f-^|tr2qf` literal 0 HcmV?d00001 diff --git a/survival/image.py b/survival/image.py new file mode 100644 index 0000000..bca5908 --- /dev/null +++ b/survival/image.py @@ -0,0 +1,22 @@ +import os + +import pygame + + +class Image: + def __init__(self, filename): + self.texture = pygame.image.load(os.path.join('..', 'assets', filename)).convert_alpha() + self.image = self.texture + self.origin = (0, 0) + self.pos = (0, 0) + self.scale = 1 + + def set_scale(self, scale): + self.image = pygame.transform.scale(self.texture, + (self.texture.get_width() * scale, self.texture.get_height() * scale)) + self.scale = scale + + def draw(self, window): + window.blit(self.image, self.pos, + pygame.Rect(self.origin[0] * self.scale, self.origin[1] * self.scale, 32 * self.scale, + 32 * self.scale)) diff --git a/survival/player.py b/survival/player.py index f0e9c33..a3a728e 100644 --- a/survival/player.py +++ b/survival/player.py @@ -2,17 +2,31 @@ import os import pygame -from survival.game_object import GameObject +from survival.image import Image -class Player(GameObject): +class Player: def __init__(self): - super().__init__([0, 0], os.path.join('..', 'assets', 'player.png')) + self.pos = [0, 0] + self.velocity = [0, 0] + self.image = Image('stevenson.png') + self.image.set_scale(2) + self.origin = (0, 0) self.speed = 3 self.movement_target = [self.pos[0], self.pos[1]] def draw(self, window): - super().draw(window) + if self.is_moving(): + if self.velocity[0] == 1: + self.image.origin = (96, 0) + elif self.velocity[0] == -1: + self.image.origin = (64, 0) + elif self.velocity[1] == 1: + self.image.origin = (0, 0) + else: + self.image.origin = (32, 0) + self.image.pos = self.pos + self.image.draw(window) def is_moving(self): return self.pos != self.movement_target diff --git a/survival/textureatlas.py b/survival/textureatlas.py deleted file mode 100644 index c723c27..0000000 --- a/survival/textureatlas.py +++ /dev/null @@ -1,28 +0,0 @@ -import pygame - - -class TextureAtlas(object): - def __init__(self, filename): - self.atlas = pygame.image.load(filename).convert() - self.images = {} - - def image_at(self, origin, target, color_key=None): - if origin in self.images: - return self.images[origin] - rect = pygame.Rect(origin, target) - image = pygame.Surface(rect.size).convert() - image.blit(self.atlas, (0, 0), rect) - if color_key is not None: - if color_key == -1: - color_key = image.get_at((0, 0)) - image.set_colorkey(color_key, pygame.RLEACCEL) - self.images[origin] = image - return image - - def images_at(self, rects, color_key=None): - return [self.image_at(rect, color_key) for rect in rects] - - def load_row(self, rect, image_count, color_key=None): - images = [(rect[0] + rect[2] * x, rect[1], rect[2], rect[3]) - for x in range(image_count)] - return self.images_at(images, color_key) diff --git a/survival/tile_layer.py b/survival/tile_layer.py index 9dfaf75..ce4aaf3 100644 --- a/survival/tile_layer.py +++ b/survival/tile_layer.py @@ -1,6 +1,4 @@ -import os - -from survival.textureatlas import TextureAtlas +from survival.image import Image from survival.tile import Tile @@ -9,16 +7,11 @@ class TileLayer: self.width = width self.height = height self.tiles = [[Tile() for x in range(self.width)] for y in range(self.height)] - self.atlas = TextureAtlas(os.path.join('..', 'assets', 'atlas.png')) - self.loadTiles() - - def loadTiles(self): - for y in range(self.height): - for x in range(self.width): - self.tiles[y][x].image = self.atlas.image_at(self.tiles[y][x].origin, (32, 32)) + self.image = Image('atlas.png') def draw(self, window): for y in range(self.height): for x in range(self.width): - if self.tiles[y][x] is not None: - window.blit(self.tiles[y][x].image, (x * 32, y * 32)) + self.image.pos = (x*32, y*32) + self.image.origin = self.tiles[y][x].origin + self.image.draw(window) -- 2.20.1 From 1ded0c4c5e49551aeb3a7a8e059450f53774f77a Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 22:43:34 +0100 Subject: [PATCH 08/12] Remove stone.py --- survival/stone.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 survival/stone.py diff --git a/survival/stone.py b/survival/stone.py deleted file mode 100644 index f72dab2..0000000 --- a/survival/stone.py +++ /dev/null @@ -1,9 +0,0 @@ -import os - -from survival.game_object import GameObject - - -class Stone(GameObject): - - def __init__(self, pos): - super().__init__(pos, os.path.join('..', 'assets', 'stone.png')) -- 2.20.1 From 5417c5e3fb0376a33732f3ac2eeaab86071f74f8 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 22:57:18 +0100 Subject: [PATCH 09/12] Make tiles background random --- survival/tile.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/survival/tile.py b/survival/tile.py index 0c5aa1c..590eb26 100644 --- a/survival/tile.py +++ b/survival/tile.py @@ -1,4 +1,9 @@ +import random + + class Tile: + origins = [(0, 0), (32, 0), (64, 0), (96, 0)] + def __init__(self, origin=(0, 0)): - self.origin = origin + self.origin = random.choice(Tile.origins) self.image = None -- 2.20.1 From 050deeae96d9987028709b3e0dfcf89aae88ca2a Mon Sep 17 00:00:00 2001 From: = Date: Sun, 14 Mar 2021 22:57:33 +0100 Subject: [PATCH 10/12] Add auto random movement to player --- survival/player.py | 54 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/survival/player.py b/survival/player.py index a3a728e..083745d 100644 --- a/survival/player.py +++ b/survival/player.py @@ -1,4 +1,4 @@ -import os +from random import randint import pygame @@ -14,6 +14,7 @@ class Player: self.origin = (0, 0) self.speed = 3 self.movement_target = [self.pos[0], self.pos[1]] + self.timer = 0 def draw(self, window): if self.is_moving(): @@ -31,6 +32,16 @@ class Player: def is_moving(self): return self.pos != self.movement_target + def get_random_direction(self): + value = randint(0, 3) + random_movement = { + 0: self.move_up, + 1: self.move_down, + 2: self.move_left, + 3: self.move_right + } + random_movement[value]() + def update(self, delta, pressed_keys): if self.is_moving(): if self.velocity[0] != 0: @@ -45,16 +56,33 @@ class Player: self.pos = self.movement_target return - if pressed_keys[pygame.K_LEFT]: - self.velocity = [-1, 0] - self.movement_target = [self.pos[0] - 32, self.pos[1]] - elif pressed_keys[pygame.K_RIGHT]: - self.velocity = [1, 0] - self.movement_target = [self.pos[0] + 32, self.pos[1]] - elif pressed_keys[pygame.K_DOWN]: - self.velocity = [0, 1] - self.movement_target = [self.pos[0], self.pos[1] + 32] - elif pressed_keys[pygame.K_UP]: - self.velocity = [0, -1] - self.movement_target = [self.pos[0], self.pos[1] - 32] + self.timer += delta + if self.timer > 1000: + self.get_random_direction() + self.timer = 0 + + if pressed_keys[pygame.K_LEFT]: + self.move_left() + elif pressed_keys[pygame.K_RIGHT]: + self.move_right() + elif pressed_keys[pygame.K_DOWN]: + self.move_down() + elif pressed_keys[pygame.K_UP]: + self.move_up() + + def move_left(self): + self.velocity = [-1, 0] + self.movement_target = [self.pos[0] - 32, self.pos[1]] + + def move_right(self): + self.velocity = [1, 0] + self.movement_target = [self.pos[0] + 32, self.pos[1]] + + def move_up(self): + self.velocity = [0, -1] + self.movement_target = [self.pos[0], self.pos[1] - 32] + + def move_down(self): + self.velocity = [0, 1] + self.movement_target = [self.pos[0], self.pos[1] + 32] -- 2.20.1 From a1ede76b6b15c9fe032364b4d66dc78903b5e839 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 15 Mar 2021 13:31:25 +0100 Subject: [PATCH 11/12] extract static variables to separate file | introduce camera --- survival/__init__.py | 16 ++++++++-------- survival/camera.py | 26 ++++++++++++++++++++------ survival/game_map.py | 13 ++++++++----- survival/image.py | 4 ++-- survival/player.py | 10 +++++----- survival/settings.py | 2 ++ survival/tile_layer.py | 4 ++-- 7 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 survival/settings.py diff --git a/survival/__init__.py b/survival/__init__.py index 4bb29f1..c457f84 100644 --- a/survival/__init__.py +++ b/survival/__init__.py @@ -1,31 +1,31 @@ import pygame +from settings import SCREEN_WIDTH, SCREEN_HEIGHT +from survival.camera import Camera from survival.game_map import GameMap -window_width = 1280 -window_height = 720 - def draw_game(delta): - game_map.draw(delta, win) + win.fill((0, 0, 0)) + game_map.draw(camera) pygame.display.update() def update_game(delta, pressed_keys): - game_map.update(delta, pressed_keys) + game_map.update(camera, delta, pressed_keys) pass if __name__ == '__main__': pygame.init() - win = pygame.display.set_mode((window_width, window_height)) + win = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("AI Project") clock = pygame.time.Clock() - game_map = GameMap(int(window_width/32), int(window_height/32) + 1) - + game_map = GameMap(int(SCREEN_WIDTH / 32) * 2, 2 * int(SCREEN_HEIGHT / 32) + 1) + camera = Camera(game_map.width * 32, game_map.height * 32, win) run = True while run: diff --git a/survival/camera.py b/survival/camera.py index 91f4129..a43fe73 100644 --- a/survival/camera.py +++ b/survival/camera.py @@ -1,16 +1,30 @@ from pygame.rect import Rect +from survival import SCREEN_WIDTH, SCREEN_HEIGHT + class Camera: - def __init__(self, width, height): + def __init__(self, width, height, window): self.camera = Rect(0, 0, width, height) self.width = width self.height = height + self.window = window - def apply(self, game_object): - return game_object.get_rect().move(self.camera.topleft) + def draw(self, image): + image.draw(self.window, self) - def update(self, target_object): - x = -target_object.get_rect().x + int(self.width / 2) - y = -target_object.get_rect().y + int(self.height / 2) + def apply(self, pos): + return pos[0] + self.camera.left, pos[1] + self.camera.top + + def get_visible_area(self): + pass + + def update(self, target): + x = -target.pos[0] + int(SCREEN_WIDTH / 2) + y = -target.pos[1] + int(SCREEN_HEIGHT / 2) + + x = min(0, x) + y = min(0, y) + x = max(-(self.width - SCREEN_WIDTH), x) + y = max(-(self.height - SCREEN_HEIGHT), y) self.camera = Rect(x, y, self.width, self.height) diff --git a/survival/game_map.py b/survival/game_map.py index 4d72583..505767a 100644 --- a/survival/game_map.py +++ b/survival/game_map.py @@ -7,11 +7,14 @@ class GameMap: self.width = width self.height = height self.player = Player() - self.tiles_layer = TileLayer(width, height) + self.layers = [] + self.layers.append(TileLayer(width, height)) - def draw(self, delta, window): - self.tiles_layer.draw(window) - self.player.draw(window) + def draw(self, camera): + for layer in self.layers: + layer.draw(camera) + self.player.draw(camera) - def update(self, delta, pressed_keys): + def update(self, camera, delta, pressed_keys): self.player.update(delta, pressed_keys) + camera.update(self.player) diff --git a/survival/image.py b/survival/image.py index bca5908..3c93b9c 100644 --- a/survival/image.py +++ b/survival/image.py @@ -16,7 +16,7 @@ class Image: (self.texture.get_width() * scale, self.texture.get_height() * scale)) self.scale = scale - def draw(self, window): - window.blit(self.image, self.pos, + def draw(self, window, camera): + window.blit(self.image, camera.apply(self.pos), pygame.Rect(self.origin[0] * self.scale, self.origin[1] * self.scale, 32 * self.scale, 32 * self.scale)) diff --git a/survival/player.py b/survival/player.py index 083745d..57d1a97 100644 --- a/survival/player.py +++ b/survival/player.py @@ -12,11 +12,11 @@ class Player: self.image = Image('stevenson.png') self.image.set_scale(2) self.origin = (0, 0) - self.speed = 3 + self.speed = 30 self.movement_target = [self.pos[0], self.pos[1]] self.timer = 0 - def draw(self, window): + def draw(self, camera): if self.is_moving(): if self.velocity[0] == 1: self.image.origin = (96, 0) @@ -27,12 +27,12 @@ class Player: else: self.image.origin = (32, 0) self.image.pos = self.pos - self.image.draw(window) + camera.draw(self.image) def is_moving(self): return self.pos != self.movement_target - def get_random_direction(self): + def move_in_random_direction(self): value = randint(0, 3) random_movement = { 0: self.move_up, @@ -59,7 +59,7 @@ class Player: self.timer += delta if self.timer > 1000: - self.get_random_direction() + #self.move_in_random_direction() self.timer = 0 if pressed_keys[pygame.K_LEFT]: diff --git a/survival/settings.py b/survival/settings.py new file mode 100644 index 0000000..30e3c68 --- /dev/null +++ b/survival/settings.py @@ -0,0 +1,2 @@ +SCREEN_WIDTH = 1920 +SCREEN_HEIGHT = 1080 diff --git a/survival/tile_layer.py b/survival/tile_layer.py index ce4aaf3..5c66e33 100644 --- a/survival/tile_layer.py +++ b/survival/tile_layer.py @@ -9,9 +9,9 @@ class TileLayer: self.tiles = [[Tile() for x in range(self.width)] for y in range(self.height)] self.image = Image('atlas.png') - def draw(self, window): + def draw(self, camera): for y in range(self.height): for x in range(self.width): self.image.pos = (x*32, y*32) self.image.origin = self.tiles[y][x].origin - self.image.draw(window) + camera.draw(self.image) -- 2.20.1 From 205d415e39eb3b70a4015025508a9dd563aa341c Mon Sep 17 00:00:00 2001 From: = Date: Mon, 15 Mar 2021 14:10:19 +0100 Subject: [PATCH 12/12] draw only the visible area of the map --- survival/camera.py | 3 ++- survival/game_map.py | 3 ++- survival/tile_layer.py | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/survival/camera.py b/survival/camera.py index a43fe73..bc6348b 100644 --- a/survival/camera.py +++ b/survival/camera.py @@ -17,7 +17,8 @@ class Camera: return pos[0] + self.camera.left, pos[1] + self.camera.top def get_visible_area(self): - pass + return Rect(-self.camera.left, -self.camera.top, + SCREEN_WIDTH - self.camera.left, SCREEN_HEIGHT - self.camera.top) def update(self, target): x = -target.pos[0] + int(SCREEN_WIDTH / 2) diff --git a/survival/game_map.py b/survival/game_map.py index 505767a..3fc9937 100644 --- a/survival/game_map.py +++ b/survival/game_map.py @@ -11,8 +11,9 @@ class GameMap: self.layers.append(TileLayer(width, height)) def draw(self, camera): + visible_area = camera.get_visible_area() for layer in self.layers: - layer.draw(camera) + layer.draw(camera, visible_area) self.player.draw(camera) def update(self, camera, delta, pressed_keys): diff --git a/survival/tile_layer.py b/survival/tile_layer.py index 5c66e33..b07465a 100644 --- a/survival/tile_layer.py +++ b/survival/tile_layer.py @@ -9,9 +9,9 @@ class TileLayer: self.tiles = [[Tile() for x in range(self.width)] for y in range(self.height)] self.image = Image('atlas.png') - def draw(self, camera): - for y in range(self.height): - for x in range(self.width): - self.image.pos = (x*32, y*32) + def draw(self, camera, visible_area): + for y in range(int(visible_area.top/32), int(visible_area.height/32) + 1): + for x in range(int(visible_area.left/32), int(visible_area.width/32) + 1): + self.image.pos = (x * 32, y * 32) self.image.origin = self.tiles[y][x].origin camera.draw(self.image) -- 2.20.1