Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from random import randint
- from pygame import*
- # ⭐ (1) Add font - WIN, LOSE
- font.init()
- font = font.Font(None, 72) #font.SysFont("Helvetica", 80)
- win_width = 800
- win_height = 600
- # ⭐ (2) Add screen boundaries
- left_bound = win_width / 40
- right_bound = win_width - 8 * left_bound
- # ⭐ (3) Initial shift = 0
- shift = 0
- x_start, y_start = 20, 10
- # ⭐ (4) Add in your target character
- img_file_back = 'cave.png'
- img_file_hero = 'm1.png'
- img_file_enemy = 'enemy.png'
- img_file_princess = 'princess.png'
- # ⭐ (5) Update colour library
- C_GREEN = (32, 128, 32) # WALL COLOUR
- C_RED = (255, 0, 0) # TEXT COLOUR
- C_BLACK = (0, 0, 0) # BACKGROUND COLOUR
- class Hero(sprite.Sprite):
- def __init__(self, filename, x_speed=0, y_speed=0, x=x_start, y=y_start, width=120, height=120):
- sprite.Sprite.__init__(self)
- self.image = transform.scale(image.load(filename), (width, height)).convert_alpha()
- self.rect = self.image.get_rect()
- self.rect.x = x
- self.rect.y = y
- self.x_speed = x_speed
- self.y_speed = y_speed
- def gravitate(self):
- self.y_speed += 0.25
- def jump(self, y):
- if self.stands_on:
- self.y_speed = y
- def update(self):
- self.rect.x += self.x_speed
- # Touching check: Platforms
- # Just checking, they don't disappear!
- platforms_touched = sprite.spritecollide(self, barriers, False)
- # Processing movement: R
- if self.x_speed > 0:
- for p in platforms_touched:
- self.rect.right = min(self.rect.right, p.rect.left)
- # Processing movement: L
- elif self.x_speed < 0:
- for p in platforms_touched:
- self.rect.left = max(self.rect.left, p.rect.right)
- self.gravitate()
- self.rect.y += self.y_speed
- platforms_touched = sprite.spritecollide(self, barriers, False)
- if self.y_speed > 0:
- for p in platforms_touched:
- self.y_speed = 0
- if p.rect.top < self.rect.bottom:
- self.rect.bottom = p.rect.top
- self.stands_on = p
- elif self.y_speed < 0:
- self.stands_on = False
- for p in platforms_touched:
- self.y_speed = 0
- self.rect.top = max(self.rect.top, p.rect.bottom)
- class Wall(sprite.Sprite):
- def __init__(self, x=20, y=0, width=120, height=120, color=C_GREEN):
- sprite.Sprite.__init__(self)
- self.image = Surface([width, height])
- self.image.fill(color)
- self.rect = self.image.get_rect()
- self.rect.x = x
- self.rect.y = y
- class Enemy(sprite.Sprite):
- def __init__(self, x=20, y=0, filename=img_file_enemy, width=100, height=100):
- sprite.Sprite.__init__(self)
- self.image = transform.scale(image.load(filename), (width, height)).convert_alpha()
- self.rect = self.image.get_rect()
- self.rect.x = x
- self.rect.y = y
- # NEW
- def update(self):
- self.rect.x += randint(-5, 5)
- self.rect.y += randint(-5, 5)
- # ⭐ (6) New class: Final Sprite
- class FinalSprite(sprite.Sprite):
- def __init__(self, player_image, player_x, player_y, player_speed):
- sprite.Sprite.__init__(self)
- self.image = transform.scale(image.load(player_image), (60, 120))
- self.speed = player_speed
- self.rect = self.image.get_rect()
- self.rect.x = player_x
- self.rect.y = player_y
- display.set_caption("ARCADE")
- window = display.set_mode([win_width, win_height])
- back = transform.scale(image.load(img_file_back).convert(), (win_width, win_height))
- all_sprites = sprite.Group()
- barriers = sprite.Group()
- enemies = sprite.Group()
- player = Hero(img_file_hero)
- all_sprites.add(player)
- w1 = Wall(50, 150, 480, 20)
- barriers.add(w1)
- all_sprites.add(w1)
- #w2 = Wall(700, 50, 50, 360)
- #barriers.add(w2)
- #all_sprites.add(w2)
- w3 = Wall(350, 380, 640, 20)
- barriers.add(w3)
- all_sprites.add(w3)
- w4 = Wall(-200, 590, 1600, 20)
- barriers.add(w4)
- all_sprites.add(w4)
- e1 = Enemy(50, 480)
- all_sprites.add(e1)
- enemies.add(e1)
- e2 = Enemy(400, 480)
- all_sprites.add(e2)
- enemies.add(e2)
- # ⭐ (7) Create the Final Sprite
- pr = FinalSprite(img_file_princess, win_width + 500, win_height - 150, 0)
- all_sprites.add(pr)
- run = True
- finished = False
- while run:
- for e in event.get():
- if e.type == QUIT:
- run = False
- elif e.type == KEYDOWN:
- if e.key == K_LEFT:
- player.x_speed = -5
- elif e.key == K_RIGHT:
- player.x_speed = 5
- elif e.key == K_UP:
- player.jump(-7)
- elif e.type == KEYUP:
- if e.key == K_LEFT:
- player.x_speed = 0
- elif e.key == K_RIGHT:
- player.x_speed = 0
- if not finished:
- # window.blit(back, (0,0))
- # We're replacing this later to make the background shift
- all_sprites.update()
- # all_sprites.draw(window)
- # We're moving this down, so that it's always on top!
- # (8) Collision checks
- if sprite.spritecollide(player, enemies, False):
- player.kill()
- if (
- # The player hasn't gone beyond the boundaries and moving
- player.rect.x > right_bound and player.x_speed > 0
- or
- player.rect.x < left_bound and player.x_speed < 0
- ):
- # We will shift the screen by the player's movement
- shift -= player.x_speed
- # We'll also shift all the sprites!
- for s in all_sprites:
- s.rect.x -= player.x_speed
- # Background shift time!
- local_shift = shift % win_width
- window.blit(back, (local_shift, 0))
- if local_shift != 0:
- window.blit(back, (local_shift - win_width, 0))
- # Drawing sprites moved here!
- all_sprites.draw(window)
- # ⭐ (9) Winning check
- if sprite.collide_rect(player, pr):
- finished = True
- window.fill(C_BLACK)
- text = font.render("YOU WIN!", 1, C_RED)
- window.blit(text, (250, 250))
- # ⭐ (10) Losing check
- if player not in all_sprites or player.rect.top > win_height:
- finished = True
- window.fill(C_BLACK)
- text = font.render("GAME OVER", 1, C_RED)
- window.blit(text, (250, 250))
- display.update()
- time.delay(20)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement