From ab485d158d8962bd5d344843fc2f16eb35e6682f Mon Sep 17 00:00:00 2001 From: "Goncalo Lourenco (dacostag)" Date: Wed, 29 Apr 2020 22:30:14 +0100 Subject: [PATCH] Tilemap implementation All platforms are now created through a map (.txt file) Changed (again) how collision works making it consistent through all platforms. --- __pycache__/settings.cpython-38.pyc | Bin 1020 -> 967 bytes __pycache__/sprites.cpython-38.pyc | Bin 4341 -> 4374 bytes img/grassLeft.png | Bin 0 -> 1386 bytes img/grassMid.png | Bin 0 -> 1201 bytes img/grassRight.png | Bin 0 -> 1374 bytes main.py | 73 ++++++++++++++-------------- map.txt | 15 ++++++ settings.py | 20 +++----- sprites.py | 56 ++++++++++----------- tile_testing.py | 30 ++++++++++++ 10 files changed, 118 insertions(+), 76 deletions(-) create mode 100644 img/grassLeft.png create mode 100644 img/grassMid.png create mode 100644 img/grassRight.png create mode 100644 map.txt create mode 100644 tile_testing.py diff --git a/__pycache__/settings.cpython-38.pyc b/__pycache__/settings.cpython-38.pyc index c876cacaa6778e421f86a76c832041d4d5e272fd..c026af07323c5d3535d1e76d7730abe7e1fbb016 100644 GIT binary patch delta 382 zcmYk0Jxjw-6o&6jg86Pfnzm}AW^pLRs63S<^U!MeMi(CV1&_oAX=)x*` zu!cUYV;$PdOdvAhk{g0IN{#|-3bBdwoOD|AqUR}p6Ses#C1f6v+@%p!@_qVxka>I< z@5ae(njW*eac}exXKrPka4a3aa?W^sU#2=+`HmFo+L#Ym$}^T9Nk4mFl$UM>;uKg5 q9&*G119PF0Vt+=GP?So-d?a5OJ%Jk4B!%W5a@&>_T0YsL7X1T8gkd-U delta 434 zcmYk2y-UMD7{>1|X_KZ+zrR~+KstmjBI0a8+;mZw7qtZ5Yf0&sX;*RZFDMyY1Y5UG z{u%C$!A+M;;wpk(3QFGNp8Gw|dmOy?tb8l2GhNq+sQ0_o<)cK%TVTQ!6=q-T>C3#; zyg6qO1qBsQQH2=BK;xtzUnID`q>x;5iYHN9GD!csxNsRx``JYf6XISTbtqsGikN~D zrlE`(s9+YVn8Q34u!yBz1Zq73b-sZF%eU-+Tx>&wx9f{d-oQ$pa0x4A(q&6Z2@j{$ zzx3)J=?O7welX3kZHVFQ6`g+=RC3ew>BwXb6&?Roh{^mdaX7(O2tEw49bypdUk9=i zr13x!LQKQ`qIK6`pL?D@8CbLK*co;P_H+i?(6UFJ?qEE2yoh6sdfcP77quo6KEf4o jn!y`Qw=JEjy8>0JGWS8M6_`xdOI9iSk!6`BX_5W{sTyGD diff --git a/__pycache__/sprites.cpython-38.pyc b/__pycache__/sprites.cpython-38.pyc index 69b4e612658fb5eeed0cefd513a79d073cfe1a37..239de78c00a07ad45b9409795afb736a67698b67 100644 GIT binary patch literal 4374 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 literal 4341 zcmaJ^TW=gm6|U<0Ts`(Wj^l)7x$giQL6EqtRwS^&30gFQjTgblY-=*r9(TJvGpVjg z*49KqI4``QePzYN_z6YYKfnvWffpoHPe?rZ5Ad)Ogzr?%jK`jYZq@0kQ}=VebLkIi zwKBu=kKaH4(7DRkzo@bJcxc=~DLw=dOz@oT(AUX%o8#-|&Y|0OIZJrvWqv!j$Al;R zXH57fPCG;^5FuJ2`lGCL;ow8nXF>R&u+i__U;EoB8%Pq;qKj}I8cM(?obZ0q^oxO$&;A2*!{(* zBRhSS_LH|vd%E_`;gOEwIPIq@jw^HvQWfKC{CIug(l=*Ax;}MJp8($o#oYcbDvC|` z*d2R&&MANDk9|mjWv<|3K6VV>JB5xR5pROtu`8S{Hui{OhC?$T8MoDRB*$uooRNr| zfuwzP_+TXWI$cQWVV){kB3?=1Ud7%(9%{encJc&+35=S5r1_EdpQJ+V>tH`gd;3b# zk&W0ashJgeiHeN|R?sZyM$D=6O}@pCuPh2-K8|z;sgV}qSeN7Ya3DrG)vIy*Xw=DV zkE~-Qxk-dHwLoZJNs^{37?DR#LT z*}4vXo_CHCxrAXliqYbqP$9%-&cq$FQ_dN52NXkxEcOiz1hg85hDKvHDV;KmVp&-@ z*9h?y)GL#!aLsJ0*Ni39)r#=0Gu0rvN64tht7>hLdqOL}rq+Zb98+Iks9!O5FdH2XsZ#5Xq)hrM-jigEmAq4^ zcr+9pMGcsw1xKM*3f1WgOtB*igC>|M;L{!C19_0Zm7lTabj zOv+;}Rz%~}qIrJ*kNKlb8inzVMY(`~e=eC-?Bd!xPOV}pz3IxZ4ZAjWuVPkpCS8N{ zwbmIa>+G*YeoSN+#A5w()Z8XQ0rl)2kv|ZLiToWTy#XDkU67sa^w0P-YZhMQajZ}J zD%HLQqHAOmQ&7k9Vl&r4XE;py!dRAEqw(Heo(|hpG9WuEmKR$26wul?CUqIoU%?s_ zEQ{}gP^?*d5jbT)7`5g1-$5ndWw_%yXq|6h+&VvAn}U78KIyXahw6lRgZI}_A+5+Q zQ1~{%4^Ss>mhspz(so*B|9SD^MbnjE#9;Xrkt-lgZcX!|RqDvxy*pB7eTpg!X1QR5 zv;GT*q61MNGm}VjbSMvp5d3>MZOoOExf2*7_XoE{(%Qfwas@V}IaE$=UGXsPX%M(}pmYqDh6K$xtRmkq8~U7ys-h z+dH~EorAz3*J+XPz4-l~-n+kJl%ZFq-Fq_as&vptgn3xVZ_>hq0bM#w#lwM8gTuMr zu+@^@0viF}$CP3VgmDTt<>?!_o6uwfye;RrHr1k?aY2tRCQ>no|1T;w9X2|H1T!QS z2d;eGBolr=FevsRNnd_KiANS};z!`Xvn}JIL*ZX#Mx&(@z5!gsA;y)n%2P@y?24ZJ z2z7F)zywCr`lKDw`?QT(ZBjRBNg1gr<{JmSQhbKG4?5dBz}}{HY465M_HO+D^$jw@ zmT}-a+h+p8I3tv#AA>emt=2u2A_Xat+Ev;;D6AtQEz2(u`7)6&foKFFYoC;)hx+tSV9tNpTx0qAd08S{(^rwlcA z6aYm|W+4|QxP|0)rwG5_enQh2ofG|iianD~!N$1>lVE&UXI}5Yf305j7-K8Xz(o~A;o{8%K4L@F; z$$y@pwwm5ck#dgAb3ptW>;8^*fGhwAN$qA;M@YW$Q`@uG*8%)+yRXAv sA`KtNTgKm-KP*YH&kBjaWR`jv2zB(1{jd8W?KwjtuR4)iudg5c5B18UMF0Q* diff --git a/img/grassLeft.png b/img/grassLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..2f24f3907576513525ff5b73ef97030be86f2c70 GIT binary patch literal 1386 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 width: + self.player.pos.x = 0 + if self.player.pos.x < 0: + self.player.pos.x = width + + hits = pygame.sprite.spritecollide(self.player, self.tile, False) if hits: lowest = max(hits, key=lambda x: x.rect.bottom) highest = min(hits, key=lambda x: x.rect.bottom) - #print("Player pos top:", str(self.player.rect.left), "y", str(self.player.pos.x), "bottom", - #str(self.player.rect.right)) - if self.player.pos.y < lowest.rect.centery - 5: # if falling on block - player remains on top of it - self.player.pos.y = lowest.rect.top + if self.player.y < lowest.y: # if falling on block - player remains on top of it + self.player.y = lowest.y - 1.3 self.player.vel.y = 0 self.player.jumping = False - # if player hits block from the side - if self.player.rect.right > highest.rect.left or self.player.rect.left < highest.rect.right: - if self.player.pos.y > highest.rect.centery: - if self.player.rect.right > highest.rect.left: - self.player.pos.x = highest.rect.left - 18 # 18 is 1 pixel more then half the width of the player sprite - if self.player.rect.left < highest.rect.right: - self.player.pos.x = highest.rect.right + 18 - self.player.vel.x = 0 - self.player.vel.y = 2 - - if self.player.pos.y > lowest.rect.bottom: # if jumping from below - player hits his head on the platform - self.player.rect.top = lowest.rect.bottom + 5 + # collision when the player hits the block from below + if self.player.y > lowest.y - 0.5: + self.player.y = lowest.y + 1 self.player.vel.y = 0 - # if player reaches 3/5 of width of the screen - if self.player.rect.right >= (width * 0.6): - self.player.pos.x -= abs(self.player.vel.x) - for plat in self.platforms: - plat.rect.x -= abs(self.player.vel.x) - - # if player reaches 1/5 of the left side of the screen move screen - if self.player.rect.left <= (width * 0.2): - self.player.pos.x += abs(self.player.vel.x) - for plat in self.platforms: - plat.rect.x += abs(self.player.vel.x) # Die, by falling of the screen if self.player.rect.bottom > height + 60: @@ -120,9 +114,16 @@ class Game: if event.key == pygame.K_UP: self.player.jump_cut() + def draw_grid(self): + for x in range(0, width, tilesize): + pygame.draw.line(self.screen, (169, 169, 169), (x, 0), (x, height)) + for y in range(0, height, tilesize): + pygame.draw.line(self.screen, (169, 169, 169), (0, y), (width, y)) + def draw(self): # Game loop - draw/render self.screen.fill((146, 244, 255)) + self.draw_grid() self.all_sprites.draw(self.screen) self.screen.blit(self.player.image, self.player.rect) self.draw_text("Score: " + str(self.score), 26, (255, 255, 255), 40, 15) diff --git a/map.txt b/map.txt new file mode 100644 index 0000000..75e23bb --- /dev/null +++ b/map.txt @@ -0,0 +1,15 @@ +.............................. +....P.....1................... +.............................. +.............................. +...............11............. +.............................. +....111....................... +...................111........ +...........111................ +................111........... +.............................. +.....111............111....... +1..........11111.............. +1............................1 +111111111111111111111111111111 \ No newline at end of file diff --git a/settings.py b/settings.py index 80c0e04..e06ae5f 100644 --- a/settings.py +++ b/settings.py @@ -1,8 +1,9 @@ import os import pygame -width = 800 -height = 425 +width = 960 # 960/32 = 30 +height = 480 # 480/32 = 15 +tilesize = 32 # 30/15 TILE SCREEN fps = 30 basic_font = 'courier new.ttf' textX, textY = 10, 10 @@ -17,21 +18,16 @@ sound_folder = os.path.join(game_folder, "sound") background = pygame.image.load('img/background.jpg') BG_colour = (69, 219, 222) score_font = '8-BIT WONDER.ttf' + # Player properties player_acc = 0.9 player_friction = -0.12 player_gravity = 1.2 player_jump = 17 -# Starting platforms -# X Y -platform_list = [(0, 220), (35, 220), (70, 220), (105, 220), - (90, 125) - ] - -main_floor = [] +# Platform/tile images +grass_left = pygame.image.load('img/grassLeft.png') +grass_middle = pygame.image.load('img/grassMid.png') +grass_right = pygame.image.load('img/grassRight.png') -for i in range(0, 50): - main_floor.append((i * 35, height-35)) - main_floor.append((i * 35, height-70)) diff --git a/sprites.py b/sprites.py index 7820b75..cfcef1c 100644 --- a/sprites.py +++ b/sprites.py @@ -1,8 +1,6 @@ # Sprite classes from settings import * import pygame -from random import choice - vec = pygame.math.Vector2 @@ -21,21 +19,22 @@ class SpriteSheet: class Player(pygame.sprite.Sprite): - def __init__(self, game): + def __init__(self, game, x, y): pygame.sprite.Sprite.__init__(self) self.game = game + self.load_images() + self.image = self.standing_frames[0] + self.image.set_colorkey((0, 0, 0)) self.walking = False self.jumping = False self.current_frame = 0 self.last_update = 0 - self.load_images() - self.image = self.standing_frames[0] - self.image.set_colorkey((0, 0, 0)) self.rect = self.image.get_rect() - self.rect.center = (width / 2, height / 2) - self.pos = vec(width / 2, height / 2) # x and y position - self.vel = vec(0, 0) # velocity in x and y axis - self.acc = vec(0, 0) # acceleration in x and y axis + self.x = x + self.y = y + self.pos = vec(x * tilesize, y * tilesize) + self.vel = vec(0, 0) + self.acc = vec(0, 0) def load_images(self): self.standing_frames = [self.game.spritesheet1.get_image(67, 190, 66, 92), @@ -71,9 +70,9 @@ class Player(pygame.sprite.Sprite): def jump(self): # jump only if standing on a platform - self.rect.y += 2 - hits = pygame.sprite.spritecollide(self, self.game.platforms, False) - self.rect.y -= 2 + self.y += 1 + hits = pygame.sprite.spritecollide(self, self.game.tile, False) + self.y -= 1 if hits and not self.jumping: self.game.jump_sound.play() self.jumping = True @@ -94,9 +93,11 @@ class Player(pygame.sprite.Sprite): self.vel += self.acc if abs(self.vel.x) < 0.1: self.vel.x = 0 - self.pos += self.vel + 0.5 * self.acc + self.x += (self.vel.x + 0.5 * self.acc.x) / 32 + self.y += (self.vel.y + 0.5 * self.acc.y) / 32 - self.rect.midbottom = self.pos # why is it recognized as a typo?? + self.rect.x = self.x * tilesize + self.rect.y = self.y * tilesize def animate(self): now = pygame.time.get_ticks() @@ -109,33 +110,32 @@ class Player(pygame.sprite.Sprite): if (now - self.last_update) > 100: self.last_update = now self.current_frame = (self.current_frame + 1) % len(self.walk_frames_l) - bottom = self.rect.bottom if self.vel.x > 0: self.image = self.walk_frames_r[self.current_frame] else: self.image = self.walk_frames_l[self.current_frame] self.rect = self.image.get_rect() - self.rect.bottom = bottom # show idle animation if not self.jumping and not self.walking: if (now - self.last_update) > 400: self.last_update = now self.current_frame = (self.current_frame + 1) % len(self.standing_frames) - bottom = self.rect.bottom self.image = self.standing_frames[self.current_frame] self.rect = self.image.get_rect() - self.rect.bottom = bottom -class Platform(pygame.sprite.Sprite): +class Tile(pygame.sprite.Sprite): # tile based def __init__(self, game, x, y): - self.groups = game.all_sprites, game.platforms - pygame.sprite.Sprite.__init__(self) + self.groups = game.all_sprites, game.tile + pygame.sprite.Sprite.__init__(self, self.groups) self.game = game - images = [self.game.spritesheet2.get_image(576, 792, 70, 70), - self.game.spritesheet2.get_image(720, 792, 70, 70)] - self.image = choice(images) - self.image.set_colorkey((0, 0, 0)) + self.image = pygame.Surface((tilesize, tilesize)) + self.image.fill((0, 128, 0)) self.rect = self.image.get_rect() - self.rect.x = x - self.rect.y = y + self.x = x + self.y = y + self.rect.x = x * tilesize + self.rect.y = y * tilesize + +class Powerup(pygame.sprite.Sprite): + pass diff --git a/tile_testing.py b/tile_testing.py new file mode 100644 index 0000000..39a57be --- /dev/null +++ b/tile_testing.py @@ -0,0 +1,30 @@ +import pygame + + +class spritesheet(object): + def __init__(self, filename): + self.sheet = pygame.image.load(filename).convert() + + # Load a specific image from a specific rectangle + def image_at(self, rectangle, colorkey=None): + "Loads image from x,y,x+offset,y+offset" + rect = pygame.Rect(rectangle) + image = pygame.Surface(rect.size).convert() + image.blit(self.sheet, (0, 0), rect) + if colorkey is not None: + if colorkey is -1: + colorkey = image.get_at((0, 0)) + image.set_colorkey(colorkey, pygame.RLEACCEL) + return image + + # Load a whole bunch of images and return them as a list + def images_at(self, rects, colorkey=None): + "Loads multiple images, supply a list of coordinates" + return [self.image_at(rect, colorkey) for rect in rects] + + # Load a whole strip of images + def load_strip(self, rect, image_count, colorkey=None): + "Loads a strip of images and returns them as a list" + tups = [(rect[0] + rect[2] * x, rect[1], rect[2], rect[3]) + for x in range(image_count)] + return self.images_at(tups, colorkey)