#####Initialize and Import import os, pygame from pygame.locals import * from sys import exit pygame.init() screen = pygame.display.set_mode((640, 480), 0, 32) #####Classes##### class Game(object): def __init___(self): self.clock = pygame.time.Clock() self.camera = pygame.Rect (0, 0, self.display.get_width(), self.display.get_height()) self.background = pygame.image.load(os.path.join("images", "background.png")).convert() # Lists for various game entities self.enemies = [] self.platforms = [] self.items = [] self.entities = [self.enemies, self.platforms, self.items] class Platform(object): #Base class for a platform def __init__(self, pos): #Takes a list with starting x, y values for platform #Image is loaded in specific platform classes self.pos = pos #The position for the platform in the level self.draw_pos = [0, 0] #The position for drawing the platform on the screen self.rect = pygame.Rect(self.pos[0], self.pos[1] + 80, 101, 91) #Creates a collision rect for platform self.onscreen = False game.platforms.append(self) #Adding the platform to list of entities def update(self): #Changes platform location based on its offset self.draw_pos[0] = self.pos[0] - game.camera.x self.draw_pos[1] = self.pos[1] - game.camera.y class Dirt(Platform): #Dirt platform def __init__(self, pos): self.image = pygame.image.load(os.path.join("images", "Dirt Block.png")).convert_alpha() Platform.__init__(self, pos) class Grass(Platform): #Grass platform def __init__(self, pos): self.image = pygame.image.load(os.path.join("images", "Grass Block.png")).convert_alpha() Platform.__init__(self, pos) class Stone(Platform): #Stone platform def __init__(self, pos): self.image = pygame.image.load(os.path.join("images", "Stone Block.png")).convert_alpha() Platform.__init__(self, pos) class Gem(object): # A class for gems def __init__(self, pos): self.image = pygame.image.load(os.path.join("images", "Gem Blue.png")).convert_alpha() self.image = pygame.transform.smoothscale(self.image, (50, 85)) self.pos = pos self.draw_pos = [0, 0] self.offset = [0, 0] self.rect = pygame.Rect(self.pos[0], self.pos[1]+29, 50, 53) self.onscreen = False game.items.append(self) def update(self): self.draw_pos[0] = self.pos[0] - game.camera.x self.draw_pos[1] = self.pos[1] - game.camera.y self.on_collision() def on_collision(self): if player.rect.colliderect(self.rect): player.score += 25 game.items.remove(self) class Player: #Class for the player def __init__(self): self.draw_pos = [50, 100] #A list with the position the player should be drawn on the screen self.offset = [34, 71] # A list containing the x and y offset for positioning the image self.jumping = False # Bool value for checking if the player is jumping self.vel_y = 0 # Holds the player's y velocity while jumping self.accel = .55 # The constant value for the player's jump acceleration self.image = pygame.image.load(os.path.join("images", "Character Horn Girl.png")).convert_alpha() #Loads the player image self.rect = pygame.Rect(self.draw_pos[0] + self.offset[0], self.draw_pos[1] + self.offset[1], 33, 78) #Creates a collision rect for the player sprite self.score = 0 # Holds the player's score def update(self): # Update position based on key input pressed_keys = pygame.key.get_pressed() if pressed_keys[K_a]: self.move(-4, 0) elif pressed_keys[K_d]: self.move(4, 0) if pressed_keys[K_SPACE] and self.jumping == False: self.jumping = True self.vel_y = -12 # Move up and adjust y velocity if jumping, otherwise apply gravity constant if self.jumping: self.vel_y += self.accel self.move(0, self.vel_y) else: self.move(0, 10) def move_single_axis(self, dx, dy): # Move the rect self.rect.x += dx self.rect.y += dy #Change draw position based on new rect position self.draw_pos[0] = self.rect.x - self.offset[0] - game.camera.x self.draw_pos[1] = self.rect.y - self.offset[1] - game.camera.y # If collide with an object, move out along the same axis you hit with # Notice the bottom collision also stops jumping for platform in level_list: if self.rect.colliderect(platform.rect): if dx > 0: self.rect.right = platform.rect.left if dx < 0: self.rect.left = platform.rect.right if dy > 0: self.rect.bottom = platform.rect.top self.jumping = False if dy < 0: self.rect.top = platform.rect.bottom def move(self, dx, dy): # Move and check collision for each axis separately if dx != 0: self.move_single_axis(dx, 0) if dy != 0: self.move_single_axis(0, dy) #####Drawing Level##### game = Game() print game.entities level = [ " ", " ", " ", " ", " ", " M S ", "GGG GG GGS DDD ", " ", ] x = 0 y = 20 for row in level: for col in row: if col == "G": Grass([x, y]) if col == "S": Stone([x, y]) if col == "D": Dirt([x, y]) if col == "M": Gem([x + 25, y + 41]) x += 101 y += 43 x = 0 entity_list.reverse() #####Game Loop##### player = Player() while True: game.clock.tick(60) for event in pygame.event.get(): #Exit event if event.type == QUIT: exit() screen.blit(game.background, (0, 0)) for entity in entity_list: entity.update() screen.blit(entity.image, entity.draw_pos) #pygame.draw.rect(screen, (255, 0, 0), entity.rect, 1) player.update() game.camera.centerx = player.rect.centerx if game.camera.left < 0: game.camera.left = 0 default_font = pygame.font.SysFont("arial", 12) hud_score = default_font.render(str(player.score), True, (0, 0, 0)) #pygame.draw.rect(screen, (0, 255, 0), camera, 1) screen.blit(player.image, player.draw_pos) #pygame.draw.rect(screen, (0, 0, 255), player.rect, 1) screen.blit(hud_score, (0, 0)) pygame.display.update()