def __init__(self): super().__init__() self.time = 0 self.last_click = -1 self.last_start = -1 self.player = Player() self.enemy = Enemy() self.dialog_box = DialogBox() self.background = load_texture(MAIN_PIC) self.sprite_manager = SpriteManager() self.set_buttons() self.sprite_manager.setup() self.enemy.setup()
def __init__(self): # create main game window super(GameController, self).__init__(1280, 720, "Panda Runner") # setup various managers self.screenManager = ScreenManager(self) self.stateManager = StateManager(self) self.spriteManager = SpriteManager() # load spritesheet and probably sounds in the future self.loadResources() self.start()
class GameController(pyglet.window.Window): """docstring for GameController""" def __init__(self): # create main game window super(GameController, self).__init__(1280, 720, "Panda Runner") # setup various managers self.screenManager = ScreenManager(self) self.stateManager = StateManager(self) self.spriteManager = SpriteManager() # load spritesheet and probably sounds in the future self.loadResources() self.start() def start(self): # schedule update function to be called every frame # I need to add some sort of FPS setting here clock.schedule(self.update) # instantiate the main game instance # this will be changed to the menu instance when it's implemented gameState = Game(self) self.stateManager.addState('game', gameState) self.stateManager.setState('game') # prepare various resources such as sprite sheets and sounds def loadResources(self): self.spriteManager.newSheet('main', 'sprites.png') # Main update function def update(self, dt): self.screenManager.update(dt) self.draw() #main draw function def draw(self): self.screenManager.draw()
def __init__(self, imagePath="", width=640, height=480): #Sets image, if no image generates a blank surface try: self.surface = pygame.image.load(imagePath) except: self.surface = pygame.Surface([width, height]) #Sets up rect self.rect = self.surface.get_rect() self.moves = 0 self.grid = Grid() self.player = Player() #Squares self.tileManager = SpriteManager() #Star Squares self.diamondManager = SpriteManager() #Walls self.wallManager = SpriteManager() #Crates self.crateManager = SpriteManager() self.startLevel(0) self.surface.fill(Scene._Colours["red"])
if __name__ == '__main__': from SpriteManager import SpriteManager import pygame pygame.init() screen = pygame.display.set_mode((500, 500)) sprite_manager = SpriteManager('../img/') class Ball: sprite_manager.load_sprites('balls.png', (50, 50)) ball_types = [(0, 0), (1, 0), (2, 0)] rect = pygame.Rect((0, 0, 50, 50)) sprite = sprite_manager('balls', (0, 0)) sprite_shadow = sprite_manager('balls', (0, 1)) def __init__(self, rect, shadow=None): self.rect = rect if shadow: self.shadow = shadow @classmethod def change_sprite(cls, val): s, _ = Ball.ball_types[val.value] cls.sprite = sprite_manager('balls', (s, 0)) cls.sprite_shadow = sprite_manager('balls', (s, 1)) class Hole(Ball):
class Room(object): """Main game scene that will be drawn onto another scene that will contain UI elements""" def __init__(self, imagePath="", width=640, height=480): #Sets image, if no image generates a blank surface try: self.surface = pygame.image.load(imagePath) except: self.surface = pygame.Surface([width, height]) #Sets up rect self.rect = self.surface.get_rect() self.moves = 0 self.grid = Grid() self.player = Player() #Squares self.tileManager = SpriteManager() #Star Squares self.diamondManager = SpriteManager() #Walls self.wallManager = SpriteManager() #Crates self.crateManager = SpriteManager() self.startLevel(0) self.surface.fill(Scene._Colours["red"]) #Getters def getLevel(self): return self.level def getTotalMoves(self): return self.totalMoves def getMoves(self): return self.moves #Setters def setLevel(self, value): self.level = value def setTotalMoves(self, value): self.totalMoves = value def setMoves(self, value): self.moves = value #Moves def incrementMoves(self): self.totalMoves += 1 self.moves += 1 #Draw def draw(self, surface): self.tile #Setup def setup(self): self.grid.reset() self.player.setCoordinates((2, 4)) self.grid.addItem(self.player.getCoordinates(), self.player) self.tileManager.setup(GridSquare.generate(16), [(0, 2), (0, 3), (0, 4), (1, 2), (1, 5), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 2), (3, 4), (3, 5), (3, 6), (4, 3), (4, 4)]) self.diamondManager.setup(GridSquareStar.generate(2), [(0, 5), (4, 2)]) self.wallManager.setup(Wall.generate(3), [(1, 3), (1, 4), (3, 3)]) self.crateManager.setup(Crate.generate(2), [(1, 2), (3, 5)]) self.grid.addItemsBySpriteManager(self.tileManager) self.grid.addItemsBySpriteManager(self.diamondManager) self.grid.addItemsBySpriteManager(self.wallManager) self.grid.addItemsBySpriteManager(self.crateManager) #Event Handlers def eventManager(self, events): for event in events: if event.type == pygame.QUIT: self.quit() elif event.type == pygame.KEYDOWN: self.keyPress(event) def keyPress(self, event): if event.key == 119: #W key self.playerMove("up") if event.key == 115: #S key self.playerMove("down") if event.key == 97: #A key self.playerMove("left") if event.key == 100: #D key self.playerMove("right") def quit(self): pygame.quit() sys.exit() #Special def fillSpaceWithWalls(self): currentGridItems = self.grid.getGridItems() rows = len(currentGridItems) collums = len(currentGridItems[0]) for i in range(0, rows): for j in range(0, collums): if not currentGridItems[i][j]: wall = Wall() self.wallManager.add(wall, (i, j)) #Used to predict where a sprite will be if it were to move a certain direction def predictCoordinates(self, currentCoordinates, direction): if direction.lower() == "up": possibleCoordinates = (currentCoordinates[0] - 1, currentCoordinates[1]) elif direction.lower() == "down": possibleCoordinates = (currentCoordinates[0] + 1, currentCoordinates[1]) elif direction.lower() == "left": possibleCoordinates = (currentCoordinates[0], currentCoordinates[1] - 1) elif direction.lower() == "right": possibleCoordinates = (currentCoordinates[0], currentCoordinates[1] + 1) return possibleCoordinates #Checks if player can move and handles events def playerMove(self, direction): currentCoordinates = self.player.getCoordinates( ) #Gets current coordinates possibleCoordinates = self.predictCoordinates(currentCoordinates, direction) isLevelOver = False try: #Catches out of range exeption if player tries to move out of grid and there is no wall items = self.grid.getItems(possibleCoordinates[0], possibleCoordinates[1]) print items if items and possibleCoordinates[0] >= 0 and possibleCoordinates[ 1] >= 0: for i in range(0, len(items)): if items[i].__class__.__name__ == "Wall": return #Returns if player hits a wall elif items[i].__class__.__name__ == "Crate": crateMoved = self.crateMove(items[i], direction) isLevelOver = self.cratesCheck() if not crateMoved: return #returns if crate can't move elif isLevelOver: self.levelOver() elif items[i].__class__.__name__ == "GridSquare": pass #Player will only move if none of the above are met if not isLevelOver: self.incrementMoves() self.player.move( self.grid.getPosition(possibleCoordinates), possibleCoordinates) self.grid.addItem(self.player.getCoordinates(), self.player) return except: print "Exception" #Checks if crate can move and then returns true if player can push crate def crateMove(self, crate, direction): currentCoordinates = crate.getCoordinates() possibleCoordinates = self.predictCoordinates(currentCoordinates, direction) try: #Catches out of range exeption if player tries to move out of grid and there is no wall items = self.grid.getItems(possibleCoordinates[0], possibleCoordinates[1]) if items and possibleCoordinates[0] >= 0 and possibleCoordinates[ 1] >= 0: for i in range(0, len(items)): if items[i].__class__.__name__ == "Wall": return False elif items[i].__class__.__name__ == "Crate": return False else: crate.move(self.grid.getPosition(possibleCoordinates), possibleCoordinates) self.grid.addItem(crate.getCoordinates(), crate) for i in range(0, len(items)): if isinstance(items[i], GridSquareStar): print "Grid star" crate.image.fill((0, 255, 0)) return True else: crate.image.fill((128, 0, 0)) return True return True #return true if it moved return False except: print "Exception" #Checks if all crates are on star squares def isGameOver(self): crates = self.crateManager.getSprites() items = self.grid.getGridItems() counter = 0 # print items for i in range(0, len(crates)): crateCoord = crates[i].getCoordinates() tempRow = items[crateCoord[0]] tempCol = tempRow[crateCoord[1]] for j in tempCol: if isinstance(j, GridSquareStar): counter += 1 if counter == len(crates): return True else: return False
class MainView(View): def __init__(self): super().__init__() self.time = 0 self.last_click = -1 self.last_start = -1 self.player = Player() self.enemy = Enemy() self.dialog_box = DialogBox() self.background = load_texture(MAIN_PIC) self.sprite_manager = SpriteManager() self.set_buttons() self.sprite_manager.setup() self.enemy.setup() def set_buttons(self): for i in range(SHIPS_COUNT): button = Button(BUTTON_X, BUTTON_Y[i], BUTTON_WIDTH[i], BUTTON_HEIGHT, SHIPS_NAME[i] + '\n' + str(SHIPS_COST[i]) + '$', SHIPS_NAME[i], BUTTON_FONT_SIZE) self.button_list.append(button) self.button_list.append(self.dialog_box.supply_button) self.button_list.append(self.dialog_box.weapon_button) self.button_list.append(self.dialog_box.go_button) def on_draw(self): start_render() draw_lrwh_rectangle_textured(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, self.background) for button in self.button_list: button.draw() self.dialog_box.draw() self.sprite_manager.draw_sprites() self.player.draw() def on_update(self, delta_time): new_ship = self.enemy.on_update(delta_time, self.sprite_manager.game_state()) if new_ship is not None: self.sprite_manager.add_enemy_ship(new_ship) self.sprite_manager.update(delta_time) self.player.money_increase(self.sprite_manager.player_fight_benefit()) self.enemy.money_increase(self.sprite_manager.enemy_fight_benefit()) for i in range(SHIPS_COUNT): if self.button_list[i].pressed: self.dialog_box.curr = i self.dialog_box.update() self.update_buttons(delta_time) self.time += delta_time status = self.sprite_manager.check_end_game() if status != 0: final_view = DefeatView() if status == 1 else WinView() self.window.show_view(final_view) def clone(self, number: int): self.player.set_builder(number) fighter = self.player.clone() if self.dialog_box.weapon_button.checked: fighter = WeaponDecorator(fighter) if self.dialog_box.supply_button.checked: fighter = SupplyDecorator(fighter) if self.player.money < fighter.get_cost(): return fighter.center_x = PLAYER_LOCATION_X fighter.center_y = PLAYER_LOCATION_Y fighter.change_x = FIGHTERS_SPEED fighter.side = 'player' self.sprite_manager.add_ship(fighter) self.player.money_decrease(fighter.cost) def lock_buttons(self, button): button.locked = True self.last_click = self.time def update_buttons(self, delta_time): if self.dialog_box.supply_button.pressed and self.time > self.last_click + TIME_DELAY * delta_time: self.last_click = self.time self.dialog_box.supply_button.checked = not self.dialog_box.supply_button.checked if self.dialog_box.weapon_button.pressed and self.time > self.last_click + TIME_DELAY * delta_time: self.last_click = self.time self.dialog_box.weapon_button.checked = not self.dialog_box.weapon_button.checked if self.dialog_box.go_button.pressed and not self.dialog_box.go_button.checked: self.clone(self.dialog_box.curr) self.dialog_box.go_button.checked = True self.dialog_box.supply_button.checked = False self.dialog_box.weapon_button.checked = False self.last_start = self.time if self.time > self.last_start + BUTTON_DELAY: self.dialog_box.go_button.checked = False if SHIPS_COST[self.dialog_box.curr] > self.player.money: self.dialog_box.go_button.locked = True else: self.dialog_box.go_button.locked = False if SHIPS_COST[self.dialog_box.curr] + EXTRA_SUPPLY_COST > self.player.money or \ self.dialog_box.weapon_button.checked and \ SHIPS_COST[self.dialog_box.curr] + EXTRA_WEAPON_COST + EXTRA_SUPPLY_COST > self.player.money: self.dialog_box.supply_button.locked = True else: self.dialog_box.supply_button.locked = False if SHIPS_COST[self.dialog_box.curr] + EXTRA_WEAPON_COST > self.player.money or \ self.dialog_box.supply_button.checked and \ SHIPS_COST[self.dialog_box.curr] + EXTRA_WEAPON_COST + EXTRA_SUPPLY_COST > self.player.money: self.dialog_box.weapon_button.locked = True else: self.dialog_box.weapon_button.locked = False