Esempio n. 1
0
class Engine:
    def __init__(self):
        self.window = Window()
        self.paddle = Paddle(self.window)
        self.bricks = Bricks(self.window)
        self.ball = Ball(self.window)
        self.running = True
        self.check = True

    def run(self):
        while self.running:
            # --- Inputs --- #
            self.window.getEvents()

            # --- Processing --- #
            self.ball.bounce()
            self.paddle.move(self.window.getKeyPressed())
            self.ball.getBallPaddleCollision(self.paddle)

            for brick in self.bricks.getBricks(
            ):  #Checks collision for all the brick
                if self.ball.getBallBrickCollision(brick):
                    self.check = False
                    self.bricks.getBricks().pop(self.check)
                    self.ball.updateScore()
                    print("Score:%s" % (self.ball.getScore()))

                    if len(self.bricks.getBricks()) == 0:
                        self.check = False
                        exit()

            # --- Outputs --- #
            self.window.clearScreen()

            self.window.blitSprite(self.ball)
            self.window.blitSprite(self.paddle)
            self.bricks.blitBricks()

            self.window.updateScreen()
Esempio n. 2
0
class Gameloop:
    """Class all the game loop functions and informations"""
    def __init__(self, gameName, screenSize, tileSize):

        self.width = screenSize.x
        self.height = screenSize.y
        self.screenSize = screenSize
        self.TILE_SIZE = tileSize
        self.gameState = GameStates.STARTMENU

        # Initialise screen
        pygame.font.init()

        self.font_renderer = pygame.font.Font(
            os.path.join("fonts", 'Millennium-Regular_0.ttf'), 24)
        self.window = Window(screenSize, gameName, self.TILE_SIZE,
                             self.font_renderer)

        # pygame.mixer.init()

        # Fill background
        self.window.clearScreen()

        # Dictionary to hold all the states and their corresponding Game states
        self.stateFunctionDict = {}
        self.addStateFunction(GameStates.STARTMENU, self.StartMenuState)
        self.addStateFunction(GameStates.GAME, self.GameState)
        self.addStateFunction(GameStates.MENU, self.MenuState)
        self.addStateFunction(GameStates.WINSCREEN, self.winState)

        self.player = Player(2, 1, self.window.tileLoader, self.TILE_SIZE,
                             Vector(0, 10))

        # Init the maps
        self.mapHolder = MapHolder(["map1", "map2", "map3"], self.TILE_SIZE,
                                   self.window.tileLoader)

        # Init the different screens and add them to the renderer
        self.startMenu = StartUpMenu(self.window.tileLoader,
                                     self.font_renderer)
        self.window.addScreenToRender(self.startMenu, "StartMenu")

        self.inGameMenu = InGameMenu(screenSize, self.window.tileLoader,
                                     self.font_renderer)
        self.window.addScreenToRender(self.inGameMenu, "inGameMenu")

        self.mainGameScreen = MainGameScreen(self.mapHolder,
                                             self.window.tileLoader,
                                             self.player, screenSize,
                                             self.font_renderer)
        self.window.addScreenToRender(self.mainGameScreen, "MainGame")

        self.winScreen = WinScreen(screenSize, self.window.tileLoader,
                                   self.font_renderer)
        self.window.addScreenToRender(self.winScreen, "WinScreen")

        self.clock = pygame.time.Clock()
        self.deltaTime = 0

    def addStateFunction(self, state, function):
        """Add a function called by each state"""
        self.stateFunctionDict.update({state: function})

    def getStateFunctionCallback(self, state):
        """Return the state functions callback"""
        return self.stateFunctionDict.get(state)

    def setMusic(self, filename):
        """Set the music playing"""
        pygame.mixer.music.fadeout(100)  # Avoid music change being too sudden!
        pygame.mixer.music.load(filename)
        pygame.mixer.music.play(-1)

    def changeGameLoopStateToGAME(self):
        self.gameState = GameStates.GAME

    def changeGameLoopStateToMenu(self):
        self.gameState = GameStates.MENU  # Ingame menu

    def changeGameLoopStateToStartMenu(self):
        self.gameState = GameStates.STARTMENU

    def changeGameLoopStateToWin(self):
        self.player = Player(2, 1, self.window.tileLoader, self.TILE_SIZE,
                             Vector(0, 10))
        self.mapHolder = MapHolder(["map1", "map2", "map3"], self.TILE_SIZE,
                                   self.window.tileLoader)
        self.window.updateScreenFromRender("MainGame", self.mainGameScreen)
        self.mainGameScreen = MainGameScreen(self.mapHolder,
                                             self.window.tileLoader,
                                             self.player, self.screenSize,
                                             self.font_renderer)
        self.window.addScreenToRender(self.mainGameScreen, "MainGame")
        self.gameState = GameStates.WINSCREEN

    def quitGame(self):
        pygame.quit()
        exit(0)

    """State functions for each State"""

    def StartMenuState(self):
        self.startMenu.handleInput(self.getInputs())
        self.window.updateScreen("StartMenu", self.deltaTime)
        self.window.drawScreen("StartMenu")
        return True

    def MenuState(self):
        self.inGameMenu.handleInput(self.getInputs())
        self.window.updateScreen("inGameMenu", self.deltaTime)
        self.window.drawScreen("inGameMenu")
        return True

    def GameState(self):
        self.window.clearScreen()
        self.window.getScreen("MainGame").movePlayer(self.getInputs())
        self.window.updateScreen("MainGame", self.deltaTime)
        self.window.drawScreen("MainGame")
        return True

    def winState(self):
        self.winScreen.handleInput(self.getInputs())
        self.window.clearScreen()
        self.window.updateScreen("WinScreen", self.deltaTime)
        self.window.drawScreen("WinScreen")

    def getInputs(self):
        """Return the events corresponding to each button press"""
        events = pygame.event.get([pygame.KEYDOWN, pygame.KEYUP])
        return events

    def handleEvents(self):
        """Handle the events thrown by the game"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
            elif event.type == UserEvents.STARTGAME:
                self.changeGameLoopStateToGAME()
            elif event.type == UserEvents.RESUMEGAME:
                if self.gameState == GameStates.GAME:
                    self.changeGameLoopStateToMenu()
                else:
                    self.changeGameLoopStateToGAME()
            elif event.type == UserEvents.WINSTATE:
                self.changeGameLoopStateToWin()
            elif event.type == UserEvents.GOTOSTARTMENU:
                self.changeGameLoopStateToStartMenu()
            elif event.type == pygame.KEYDOWN or event.type == pygame.KEYUP:
                pygame.event.post(event)

    def startLoop(self):
        """The main function that runs the whole game."""
        # Game loop
        while pygame.display.get_init():
            self.deltaTime = self.clock.get_time()
            # print(self.clock.get_fps())
            for stateOfGame in self.stateFunctionDict.keys():
                if self.gameState == stateOfGame:
                    self.getStateFunctionCallback(self.gameState)()
            self.handleEvents()
            pygame.event.pump()

            try:
                pygame.display.update()
            except:
                print("Error")

            self.clock.tick(60)