diff --git a/__pycache__/settings.cpython-38.pyc b/__pycache__/settings.cpython-38.pyc index 83fdbed..847b03f 100644 Binary files a/__pycache__/settings.cpython-38.pyc and b/__pycache__/settings.cpython-38.pyc differ diff --git a/__pycache__/sprites.cpython-38.pyc b/__pycache__/sprites.cpython-38.pyc index f7d2081..8bf4787 100644 Binary files a/__pycache__/sprites.cpython-38.pyc and b/__pycache__/sprites.cpython-38.pyc differ diff --git a/img/tiles_spritesheet.png b/img/tiles_spritesheet.png new file mode 100644 index 0000000..57ee83b Binary files /dev/null and b/img/tiles_spritesheet.png differ diff --git a/img/tiles_spritesheet.xml b/img/tiles_spritesheet.xml new file mode 100644 index 0000000..0a406d7 --- /dev/null +++ b/img/tiles_spritesheet.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main.py b/main.py index fbe6017..5317d52 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,7 @@ from settings import * from sprites import * import os.path + class Game: def __init__(self): # initialize game window, etc @@ -26,8 +27,8 @@ class Game: def load_data(self): self.dir = os.path.dirname(__file__) img_dir = os.path.join(self.dir, 'img') - self.spritesheet = SpriteSheet(os.path.join(img_dir, player_spritesheet)) - + self.spritesheet1 = SpriteSheet(os.path.join(img_dir, spritesheet1)) + self.spritesheet2 = SpriteSheet(os.path.join(img_dir, spritesheet2)) def new(self): # starts a new game not a new program @@ -37,7 +38,7 @@ class Game: self.player = Player(self) self.all_sprites.add(self.player) for plat in platform_list: - p = Platform(*plat) + p = Platform(self, *plat) self.all_sprites.add(p) self.platforms.add(p) self.run() @@ -62,18 +63,18 @@ class Game: self.player.vel.y = 0 # if player reaches 3/4 of width of the screen - if self.player.rect.x >= (width * 0.75): + if self.player.rect.x >= (width * 0.6): self.player.pos.x -= abs(self.player.vel.x) for plat in self.platforms: plat.rect.x -= self.player.vel.x # if player reaches goes left screen moves left 1/10 - if self.player.rect.x <= (width * 0.1): + if self.player.rect.x <= (width * 0.2): self.player.pos.x += abs(self.player.vel.x) for plat in self.platforms: plat.rect.x -= self.player.vel.x # Die, by falling of the screen - if self.player.rect.bottom > height: + if self.player.rect.bottom > height + 20: for sprite in self.all_sprites: sprite.rect.y -= max(self.player.vel.y, 10) self.playing = False @@ -129,8 +130,6 @@ class Game: if event.type == pygame.KEYUP: waiting = False - - def draw_text(self, text, size, color, x, y): font = pygame.font.Font(self.font_name, size) text_surface = font.render(text, True, color) diff --git a/settings.py b/settings.py index 26b133f..546ff4f 100644 --- a/settings.py +++ b/settings.py @@ -6,7 +6,8 @@ height = 425 fps = 30 basic_font = 'courier new.ttf' textX, textY = 10, 10 -player_spritesheet = "p2_spritesheet.png" +spritesheet1 = "p2_spritesheet.png" +spritesheet2 = "tiles_spritesheet.png" title = "You should be in quarantine!" # setup game assets (images/sounds) @@ -24,9 +25,9 @@ player_jump = 15 # Starting platforms -# X Y WIDTH HEIGTH -platform_list = [(0, 220, 40, height), - (0, height - 40, width * 3, 40), - (width / 2, 250, 60, 20), - (90, height - 300, 115, 20)] +# X Y +platform_list = [(0, 220), + (0, 425), + (800 / 2, 250), + (90, 425 - 300)] diff --git a/sprites.py b/sprites.py index fdfc831..94c353b 100644 --- a/sprites.py +++ b/sprites.py @@ -1,6 +1,7 @@ # Sprite classes from settings import * import pygame +from random import choice vec = pygame.math.Vector2 @@ -8,12 +9,13 @@ vec = pygame.math.Vector2 class SpriteSheet: # utility class for loading and parsing spritesheets def __init__(self, filename): - self.spritesheet = pygame.image.load(filename).convert() + self.spritesheet1 = pygame.image.load(filename).convert() + self.spritesheet1 = pygame.image.load(filename).convert() def get_image(self, x, y, width, height): # grab single image out of a spritesheet image = pygame.Surface((width, height)) - image.blit(self.spritesheet, (0, 0), (x, y, width, height)) + image.blit(self.spritesheet1, (0, 0), (x, y, width, height)) image = pygame.transform.scale(image, (width // 2, height // 2)) return image @@ -22,7 +24,12 @@ class Player(pygame.sprite.Sprite): def __init__(self, game): pygame.sprite.Sprite.__init__(self) self.game = game - self.image = self.game.spritesheet.get_image(67, 190, 66, 92) + 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) @@ -30,6 +37,33 @@ class Player(pygame.sprite.Sprite): self.vel = vec(0, 0) # velocity in x and y axis self.acc = vec(0, 0) # acceleration in x and y axis + def load_images(self): + self.standing_frames = [self.game.spritesheet1.get_image(67, 190, 66, 92), + self.game.spritesheet1.get_image(0, 190, 66, 92)] + for frame in self.standing_frames: + frame.set_colorkey((0, 0, 0)) + self.walk_frames_r = [self.game.spritesheet1.get_image(0, 0, 70, 94), + self.game.spritesheet1.get_image(71, 0, 70, 94), + self.game.spritesheet1.get_image(142, 0, 70, 94), + self.game.spritesheet1.get_image(0, 95, 70, 94), + self.game.spritesheet1.get_image(71, 95, 70, 94), + self.game.spritesheet1.get_image(142, 95, 70, 94), + self.game.spritesheet1.get_image(213, 0, 70, 94), + self.game.spritesheet1.get_image(284, 0, 70, 94), + self.game.spritesheet1.get_image(213, 95, 70, 94), + self.game.spritesheet1.get_image(355, 0, 70, 94), + self.game.spritesheet1.get_image(284, 95, 70, 94)] + self.walk_frames_l = [] + for frame in self.walk_frames_r: + self.walk_frames_l.append(pygame.transform.flip(frame, True, False)) + frame.set_colorkey((0, 0, 0)) + for frame in self.walk_frames_l: + frame.set_colorkey((0, 0, 0)) + self.jump_frame_r = self.game.spritesheet1.get_image(423, 95, 66, 94) + self.jump_frame_r.set_colorkey((0, 0, 0)) + self.jump_frame_l = pygame.transform.flip(self.jump_frame_r, True, False) + self.jump_frame_l.set_colorkey((0, 0, 0)) + def jump(self): # jump only if standing on a platform self.rect.x += 1 @@ -39,6 +73,7 @@ class Player(pygame.sprite.Sprite): self.vel.y = -player_jump def update(self): + self.animate() self.acc = vec(0, player_gravity) keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: @@ -50,19 +85,47 @@ class Player(pygame.sprite.Sprite): self.acc.x += self.vel.x * player_friction # equations of motion self.vel += self.acc + if abs(self.vel.x) < 0.1: + self.vel.x = 0 self.pos += self.vel + 0.5 * self.acc - # wrap around the screen - if self.pos.x < 0: - self.pos.x = 0 self.rect.midbottom = self.pos + def animate(self): + now = pygame.time.get_ticks() + if self.vel.x != 0: + self.walking = True + else: + self.walking = False + if self.walking: + 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 + 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): - def __init__(self, x, y, w, h): + def __init__(self, game, x, y): pygame.sprite.Sprite.__init__(self) - self.image = pygame.Surface((w, h)) - self.image.fill((128, 128, 128)) + 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.rect = self.image.get_rect() self.rect.x = x self.rect.y = y