示例#1
0
    def runGame(self, objState):

        params = objState.getParams()
        self.HEALTH = params[0]

        self.MOVERATE = params[1]
        self.BOUNCERATE = params[2]
        self.BOUNCEHEIGHT = params[3]
        self.STARTSIZE = params[4]
        ###
        self.WINSIZE = params[5]
        self.MAXHEALTH = params[6]
        ###
        self.CAPMINSPEED = params[7]
        self.CAPMAXSPEED = params[8]

        first_shoot = 0
        cooldown = 0.2
        shoot_possible = True
        cooldown_time = time.time()
        laserBeamObj = None
        self.RESPAWN = False
        self.DOITONCE = True

        FPSCLOCK = pg.time.Clock()

        L_CAP_IMGEN = pg.image.load(path.join('Data', 'capybaraDead.png'))
        R_CAP_IMGEN = pg.transform.flip(L_CAP_IMGEN, True, False)

        # audio
        pg.mixer.music.load(path.join('Data', 'capybara_sound_mono.wav'))
        pg.mixer.music.play(-1)

        gameOverMode = False
        gameOverStartTime = 0
        winMode = False

        # licznik zabitych kapibar
        kills = 0

        playerObj = Player(self)
        ALL_SPRITES.add(playerObj)
        laserObj = Laser(self, playerObj)
        ALL_SPRITES.add(laserObj)

        obstacles_list = []

        for i in range(20):
            cucumber_params = Obstacle.find_position(self, obstacles_list)
            cucumber = Obstacle(self, cucumber_params[0], cucumber_params[1],
                                cucumber_params[2])
            obstacles_list.append(cucumber)
            ALL_SPRITES.add(cucumber)
            OBSTACLES.add(cucumber)

        for i in range(20):
            enemy = Enemy(
                self, random.randrange(-self.MARGIN, self.WIDTH + self.MARGIN),
                random.randrange(-self.MARGIN, self.HEIGHT + self.MARGIN),
                playerObj)
            ALL_SPRITES.add(enemy)
            ENEMIES.add(enemy)

        # główna pętla gry
        while True:
            self.displaySurface.fill(GROUNDCOLOR)

            # rysowanie wskaźnika poziomu zdrowia
            HealthMeter.drawHealthBar(self, playerObj.health)

            # rysowanie licznika zjedzonych kapibar
            Eaten.drawEatenCounter(self, kills)

            hits = pg.sprite.spritecollide(playerObj, ENEMIES, True,
                                           pygame.sprite.collide_circle)
            for hit in hits:
                injured = pygame.mixer.Sound(
                    path.join('Data', 'capybara_barks_mono.wav'))
                injured.play()
                playerObj.health -= 10
                if playerObj.health <= 0:
                    gameOverMode = True
                    gameOverStartTime = time.time()

            ALL_SPRITES.update()

            # obsługa zdarzeń
            for event in pg.event.get():
                if event.type == QUIT:
                    Game.terminate()

                elif event.type == KEYDOWN:
                    if event.key == K_p:
                        PAUSE = True
                        Game.paused(self)
                    elif winMode and event.key == K_m:
                        return

                elif event.type == KEYUP:
                    if event.key == K_UP or event.key == K_w:
                        playerObj.stop = False
                        playerObj.vel.y = 0
                    if event.key == K_DOWN or event.key == K_s:
                        playerObj.stop = False
                        playerObj.vel.y = 0
                    if event.key == K_LEFT or event.key == K_a:
                        playerObj.stop = False
                        playerObj.vel.x = 0
                    if event.key == K_RIGHT or event.key == K_d:
                        playerObj.stop = False
                        playerObj.vel.x = 0
                    if event.key == K_ESCAPE:
                        Game.terminate()

                elif event.type == pg.MOUSEBUTTONDOWN:
                    first_shoot += 1
                    shoot_time = time.time()

                    if shoot_time - cooldown_time >= cooldown:
                        cooldown_time = shoot_time
                        shoot_possible = True
                    else:
                        shoot_possible = False

                elif event.type == pg.MOUSEBUTTONUP and (not gameOverMode):
                    if first_shoot != 0 and shoot_possible:
                        laserBeamObj = LaserBeam(self, playerObj.rect.center,
                                                 laserObj.angle, playerObj)
                        ALL_SPRITES.add(laserBeamObj)

            if laserBeamObj is not None:
                hitsWithEnemies = pg.sprite.spritecollide(
                    laserBeamObj, ENEMIES, True, pg.sprite.collide_circle)
                for hit in hitsWithEnemies:
                    kills += 1

                hitsWithObstacles = pg.sprite.spritecollide(
                    laserBeamObj, OBSTACLES, False, pg.sprite.collide_circle)
                if hitsWithObstacles:
                    laserBeamObj.kill()

            if kills % NEEDTOFLOCK == 0 and kills != 0:
                self.RESPAWN = True
            if kills % NEEDTOFLOCK != 0:
                self.DOITONCE = True

            if self.RESPAWN and self.DOITONCE:
                Game.newEnemies(self, playerObj, NEEDTOFLOCK - 1)
                self.RESPAWN = False
                self.DOITONCE = False

            #for cucumber in OBSTACLES:
            #    pg.draw.circle(self.displaySurface, DARKGREEN, cucumber.rect.center, cucumber.radius)

            ALL_SPRITES.draw(self.displaySurface)

            if not gameOverMode:
                pass
            else:
                # koniec gry
                ### napis Game Over
                caption(self, 'Game Over', self.FONTSIZE70,
                        self.HALFWIDTH - int(
                            (150 * self.WIDTH) / 1900), self.HALFHEIGHT - int(
                                (65 * self.HEIGHT) / 1000),
                        int((300 * self.WIDTH) / 1900),
                        int((130 * self.HEIGHT) / 1000), self.HALFWIDTH,
                        self.HALFHEIGHT, False)

                gameOverMode = True

                pg.mixer.music.fadeout(1000)
                playerObj.kill()
                laserObj.kill()
                if time.time() - gameOverStartTime > GAMEOVERTIME:
                    Game.terminate()

            pg.display.flip()
            #pg.display.update()
            FPSCLOCK.tick(FPS)