Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import sys
- import pygame
- import random
- from pygame import *
- import numpy as np
- import time
- pygame.init()
- scr_size = (width, height) = (600, 150)
- FPS = 60
- gravity = 0.7
- black = (0, 0, 0)
- white = (255, 255, 255)
- background_col = (235, 235, 235)
- high_score = 0
- screen = pygame.display.set_mode(scr_size)
- clock = pygame.time.Clock()
- pygame.display.set_caption("Dino Run")
- def load_image(
- name,
- sizex=-1,
- sizey=-1,
- colorkey=None,
- ):
- fullname = os.path.join('sprites', name)
- image = pygame.image.load(fullname)
- image = image.convert()
- if colorkey is not None:
- if colorkey is -1:
- colorkey = image.get_at((0, 0))
- image.set_colorkey(colorkey, RLEACCEL)
- if sizex != -1 or sizey != -1:
- image = pygame.transform.scale(image, (sizex, sizey))
- return image, image.get_rect()
- def load_sprite_sheet(
- sheetname,
- nx,
- ny,
- scalex=-1,
- scaley=-1,
- colorkey=None,
- ):
- fullname = os.path.join('sprites', sheetname)
- sheet = pygame.image.load(fullname)
- sheet = sheet.convert()
- sheet_rect = sheet.get_rect()
- sprites = []
- sizex = sheet_rect.width / nx
- sizey = sheet_rect.height / ny
- for i in range(0, ny):
- for j in range(0, nx):
- rect = pygame.Rect((j * sizex, i * sizey, sizex, sizey))
- image = pygame.Surface(rect.size)
- image = image.convert()
- image.blit(sheet, (0, 0), rect)
- if colorkey is not None:
- if colorkey is -1:
- colorkey = image.get_at((0, 0))
- image.set_colorkey(colorkey, RLEACCEL)
- if scalex != -1 or scaley != -1:
- image = pygame.transform.scale(image, (scalex, scaley))
- sprites.append(image)
- sprite_rect = sprites[0].get_rect()
- return sprites, sprite_rect
- def extractDigits(number):
- if number > -1:
- digits = []
- i = 0
- while (number / 10 != 0):
- digits.append(number % 10)
- number = int(number / 10)
- digits.append(number % 10)
- for i in range(len(digits), 5):
- digits.append(0)
- digits.reverse()
- return digits
- class Dino():
- def __init__(self, sizex=-1, sizey=-1):
- self.images, self.rect = load_sprite_sheet('dino.png', 5, 1, sizex, sizey, -1)
- self.images1, self.rect1 = load_sprite_sheet('dino_ducking.png', 2, 1, 59, sizey, -1)
- self.rect.bottom = int(0.98 * height)
- self.rect.left = width / 15
- self.image = self.images[0]
- self.index = 0
- self.counter = 0
- self.score = 0
- self.isJumping = False
- self.isDead = False
- self.isDucking = False
- self.isBlinking = False
- self.movement = [0, 0]
- self.jumpSpeed = 11.5
- self.stand_pos_width = self.rect.width
- self.duck_pos_width = self.rect1.width
- def draw(self):
- screen.blit(self.image, self.rect)
- def checkbounds(self):
- if self.rect.bottom > int(0.98 * height):
- self.rect.bottom = int(0.98 * height)
- self.isJumping = False
- def update(self):
- if self.isJumping:
- self.movement[1] = self.movement[1] + gravity
- if self.isJumping:
- self.index = 0
- elif self.isBlinking:
- if self.index == 0:
- if self.counter % 400 == 399:
- self.index = (self.index + 1) % 2
- else:
- if self.counter % 20 == 19:
- self.index = (self.index + 1) % 2
- elif self.isDucking:
- if self.counter % 5 == 0:
- self.index = (self.index + 1) % 2
- else:
- if self.counter % 5 == 0:
- self.index = (self.index + 1) % 2 + 2
- if self.isDead:
- self.index = 4
- if not self.isDucking:
- self.image = self.images[self.index]
- self.rect.width = self.stand_pos_width
- else:
- self.image = self.images1[(self.index) % 2]
- self.rect.width = self.duck_pos_width
- self.rect = self.rect.move(self.movement)
- self.checkbounds()
- if not self.isDead and self.counter % 7 == 6 and self.isBlinking == False:
- self.score += 1
- if self.score % 100 == 0 and self.score != 0:
- pass # checkpoint
- self.counter = (self.counter + 1)
- class Cactus(pygame.sprite.Sprite):
- def __init__(self, speed=5, sizex=-1, sizey=-1):
- pygame.sprite.Sprite.__init__(self, self.containers)
- self.images, self.rect = load_sprite_sheet('cacti-small.png', 3, 1, sizex, sizey, -1)
- self.rect.bottom = int(0.98 * height)
- self.rect.left = width + self.rect.width
- self.image = self.images[random.randrange(0, 3)]
- self.movement = [-1 * speed, 0]
- def draw(self):
- screen.blit(self.image, self.rect)
- def update(self):
- self.rect = self.rect.move(self.movement)
- if self.rect.right < 0:
- self.kill()
- class Ptera(pygame.sprite.Sprite):
- def __init__(self, speed=5, sizex=-1, sizey=-1):
- pygame.sprite.Sprite.__init__(self, self.containers)
- self.images, self.rect = load_sprite_sheet('ptera.png', 2, 1, sizex, sizey, -1)
- self.ptera_height = [height * 0.82, height * 0.75, height * 0.60]
- self.rect.centery = self.ptera_height[random.randrange(0, 3)]
- self.rect.left = width + self.rect.width
- self.image = self.images[0]
- self.movement = [-1 * speed, 0]
- self.index = 0
- self.counter = 0
- def draw(self):
- screen.blit(self.image, self.rect)
- def update(self):
- if self.counter % 10 == 0:
- self.index = (self.index + 1) % 2
- self.image = self.images[self.index]
- self.rect = self.rect.move(self.movement)
- self.counter = (self.counter + 1)
- if self.rect.right < 0:
- self.kill()
- class Ground():
- def __init__(self, speed=-5):
- self.image, self.rect = load_image('ground.png', -1, -1, -1)
- self.image1, self.rect1 = load_image('ground.png', -1, -1, -1)
- self.rect.bottom = height
- self.rect1.bottom = height
- self.rect1.left = self.rect.right
- self.speed = speed
- def draw(self):
- screen.blit(self.image, self.rect)
- screen.blit(self.image1, self.rect1)
- def update(self):
- self.rect.left += self.speed
- self.rect1.left += self.speed
- if self.rect.right < 0:
- self.rect.left = self.rect1.right
- if self.rect1.right < 0:
- self.rect1.left = self.rect.right
- # class Cloud(pygame.sprite.Sprite):
- # def __init__(self, x, y):
- # pygame.sprite.Sprite.__init__(self, self.containers)
- # self.image, self.rect = load_image('cloud.png', int(90 * 30 / 42), 30, -1)
- # self.speed = 1
- # self.rect.left = x
- # self.rect.top = y
- # self.movement = [-1 * self.speed, 0]
- #
- # def draw(self):
- # screen.blit(self.image, self.rect)
- #
- # def update(self):
- # self.rect = self.rect.move(self.movement)
- # if self.rect.right < 0:
- # self.kill()
- class Scoreboard():
- def __init__(self, x=-1, y=-1):
- self.score = 0
- self.tempimages, self.temprect = load_sprite_sheet('numbers.png', 12, 1, 11, int(11 * 6 / 5), -1)
- self.image = pygame.Surface((55, int(11 * 6 / 5)))
- self.rect = self.image.get_rect()
- if x == -1:
- self.rect.left = width * 0.89
- else:
- self.rect.left = x
- if y == -1:
- self.rect.top = height * 0.1
- else:
- self.rect.top = y
- def draw(self):
- screen.blit(self.image, self.rect)
- def update(self, score):
- score_digits = extractDigits(score)
- self.image.fill(background_col)
- for s in score_digits:
- self.image.blit(self.tempimages[s], self.temprect)
- self.temprect.left += self.temprect.width
- self.temprect.left = 0
- def gameplay(shouldEmulateKeyPress, onGameOver):
- while True:
- global high_score
- gamespeed = 6
- isGameOver = False
- gameQuit = False
- playerDino = Dino(44, 47)
- new_ground = Ground(-1 * gamespeed)
- scb = Scoreboard()
- highsc = Scoreboard(width * 0.78)
- counter = 0
- cacti = pygame.sprite.Group()
- pteras = pygame.sprite.Group()
- clouds = pygame.sprite.Group()
- last_obstacle = pygame.sprite.Group()
- Cactus.containers = cacti
- Ptera.containers = pteras
- # Cloud.containers = clouds
- temp_images, temp_rect = load_sprite_sheet('numbers.png', 12, 1, 11, int(11 * 6 / 5), -1)
- # HI_image = pygame.Surface((22, int(11 * 6 / 5)))
- # HI_rect = HI_image.get_rect()
- # HI_image.fill(background_col)
- # HI_image.blit(temp_images[10], temp_rect)
- # temp_rect.left += temp_rect.width
- # HI_image.blit(temp_images[11], temp_rect)
- # HI_rect.top = height * 0.1
- # HI_rect.left = width * 0.73
- while not gameQuit:
- while not isGameOver:
- cactus1X = -1
- cactus2X = -1
- cactus1Height = -1
- cactus2Height = -1
- pteraX = -1
- pteraY = -1
- # If only 1 cactus visible, leave the params of cactus 2 at -1,
- # if not adjust params of both cacti
- if len(cacti) == 1:
- for c in cacti:
- cactus1X = c.rect.left
- cactus1Height = c.rect.top
- else:
- count = 0
- for c in cacti:
- if count == 0:
- cactus1X = c.rect.left
- cactus1Height = c.rect.top
- count += 1
- else:
- cactus2X = c.rect.left
- cactus2Height = c.rect.top
- for p in pteras:
- pteraX = p.rect.left
- pteraY = p.rect.top
- playerY = playerDino.rect.top
- params = {
- "cactus1X": cactus1X,
- "cactus2X": cactus2X,
- "cactus1Height": cactus1Height,
- "cactus2Height": cactus2Height,
- "pteraX": pteraX,
- "pteraY": pteraY,
- "playerY": playerY,
- "gamespeed": gamespeed,
- }
- # 0 = Jump / 1 = Duck / 2 = Do Nothing
- if shouldEmulateKeyPress(params) == 0:
- if playerDino.rect.bottom == int(0.98 * height):
- playerDino.isDucking = False
- playerDino.isJumping = True
- playerDino.movement[1] = -1 * playerDino.jumpSpeed
- elif shouldEmulateKeyPress(params) == 1:
- if not (playerDino.isJumping and playerDino.isDead):
- playerDino.isDucking = True
- for event_ in pygame.event.get():
- if event_.type == pygame.QUIT:
- gameQuit = True
- isGameOver = True
- if event_.type == pygame.KEYDOWN:
- if event_.key == pygame.K_SPACE:
- if playerDino.rect.bottom == int(0.98 * height):
- playerDino.isDucking = False
- playerDino.isJumping = True
- playerDino.movement[1] = -1 * playerDino.jumpSpeed
- if event_.key == pygame.K_DOWN:
- if not (playerDino.isJumping and playerDino.isDead):
- playerDino.isDucking = True
- if event_.type == pygame.KEYUP:
- if event_.key == pygame.K_DOWN:
- playerDino.isDucking = False
- for c in cacti:
- c.movement[0] = -1 * gamespeed
- if pygame.sprite.collide_mask(playerDino, c):
- playerDino.isDead = True
- for p in pteras:
- p.movement[0] = -1 * gamespeed
- if pygame.sprite.collide_mask(playerDino, p):
- playerDino.isDead = True
- if len(cacti) < 2:
- if len(cacti) == 0:
- last_obstacle.empty()
- last_obstacle.add(Cactus(gamespeed, 40, np.random.choice([50, 35], p=[0.5, 0.5])))
- else:
- for l in last_obstacle:
- if l.rect.right < width * 0.7 and random.randrange(0, 50) == 10:
- last_obstacle.empty()
- last_obstacle.add(Cactus(gamespeed, 40, np.random.choice([50, 35], p=[0.5, 0.5])))
- if len(pteras) == 0 and random.randrange(0, 200) == 10 and counter > 500:
- for l in last_obstacle:
- if l.rect.right < width * 0.8:
- last_obstacle.empty()
- last_obstacle.add(Ptera(gamespeed, 46, 40))
- # if len(clouds) < 5 and random.randrange(0, 300) == 10:
- # Cloud(width, random.randrange(height / 5, height / 2))
- playerDino.update()
- cacti.update()
- pteras.update()
- clouds.update()
- new_ground.update()
- scb.update(playerDino.score)
- highsc.update(high_score)
- # if pygame.display.get_surface() != None:
- # screen.fill(background_col)
- # new_ground.draw()
- # clouds.draw(screen)
- # scb.draw()
- # if high_score != 0:
- # highsc.draw()
- # # screen.blit(HI_image, HI_rect)
- # cacti.draw(screen)
- # pteras.draw(screen)
- # playerDino.draw()
- #
- # pygame.display.update()
- # clock.tick(FPS)
- if playerDino.isDead:
- isGameOver = True
- if playerDino.score > high_score:
- high_score = playerDino.score
- if counter % 700 == 699:
- new_ground.speed -= 1
- gamespeed += 1
- counter = (counter + 1)
- if gameQuit:
- break
- while isGameOver:
- highsc.update(high_score)
- # if pygame.display.get_surface() != None:
- # if high_score != 0:
- # highsc.draw()
- # # screen.blit(HI_image, HI_rect)
- # pygame.display.update()
- onGameOver(playerDino.score)
- isGameOver = False
- # clock.tick(FPS)
- def main(shouldEmulateKeyPress, onGameOver):
- isGameQuit = False
- if not isGameQuit:
- gameplay(shouldEmulateKeyPress, onGameOver)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement