コード例 #1
0
ファイル: game.py プロジェクト: BrettMcNeff/TBA
class Game(object):
    """this is the Game class"""
    def __init__(self):
        pygame.mixer.pre_init(48000,-16,2, 1024) #Sound Settings
        pygame.init()
        
        #sets the screen resolution for the game and sets a rect for the game screen
        self.screen = pygame.display.set_mode((1024,768))
        self.screen_rect = self.screen.get_rect()
        
        #initializes a clock for the game
        self.clock = pygame.time.Clock()
        
        #initializes a menu object and HUD object and Score object
        self.menu = Menu()
        self.hud = Hud()
        self.score = Score()
        #sets a boolean for whether you are still in the menu or not
        self.inMenu = True
        #sets a camera for the world
        self.camBorder = 32
        self.cam = Camera(pygame.Rect(100, 100, 1024, 768), pygame.Rect(self.camBorder, self.camBorder, 2048 - self.camBorder, 1536 - self.camBorder))
        self.camShakeFactor = 0 #Magnitude of shake
        self.camShakeDecayFactor = 0.08 #Lerp Amount
        
        #Timing
        self.timer = pygame.time.get_ticks()
        self.elapsed = 0
        
        #Sound Controller
        self.soundCon = SoundCon()
        
        #Game Values
        self.backgroundImg = pygame.image.load("Images/Arena/Arena2.png").convert_alpha()
        self.backgroundImgRect = self.backgroundImg.get_rect()
        self.player = Player( self.hud )
        
        #Effects
        self.effectInstances = []
        self.spawnSound = pygame.mixer.Sound("Sounds/ShipRev.wav")
        self.deathSound = pygame.mixer.Sound("Sounds/shipExplo.wav")
        self.enemyExplo = pygame.mixer.Sound("Sounds/enemyExplo.wav")
        self.clashSound = pygame.mixer.Sound("Sounds/clash.wav")
        self.boostSound = pygame.mixer.Sound("Sounds/boostLow.wav")
        
        #Game over fade out
        self.fadeImage = pygame.image.load("Images/HUD/CrackedGlass.png").convert_alpha()
        self.fadeRect = self.fadeImage.get_rect()
        self.fadeSurface = pygame.Surface((1024, 768), pygame.SRCALPHA)
        self.fadeSurfaceAlpha = 0
        self.fadeSurfaceRate = 1
        self.doFade = False
        self.restartGame = False
        
        #Enemies
        self.enemyList = []
        self.baseNumEnemies = 2
        self.spawnTime = 10
        self.currentSpawnTime = 30


    def process_events(self):
        """process all game events"""
        #sets a variable containing the position of the mouse
        self.mousePos = pygame.mouse.get_pos()

        for event in pygame.event.get():
            if self.inMenu:
                #passes the current event and mouse position to the menu's 'process_events' function
                self.inMenu = self.menu.process_events(event, self.mousePos)
            else:
                #Run everything else's 'process_events' functions
                #print("This is where the game would process events")
                self.readInputs( event )
                
            if event.type == pygame.KEYDOWN:
                #exits the program if the esc key is pressed
                if event.key == pygame.K_ESCAPE:
                    sys.exit(0)
    
    def readInputs(self, event):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                sys.exit(0)
            if event.key == pygame.K_w or event.key == pygame.K_UP:
                self.player.moving[0] = True
            if event.key == pygame.K_s or event.key == pygame.K_DOWN:
                self.player.moving[1] = True
            if event.key == pygame.K_a or event.key == pygame.K_LEFT:
                self.player.moving[2] = True
            if event.key == pygame.K_d or event.key == pygame.K_RIGHT:
                self.player.moving[3] = True
            if event.key == pygame.K_SPACE or event.key == pygame.K_z:
                self.player.moving[4] = True
                self.boostSound.play()
            if event.key == pygame.K_p:
                self.soundCon.currentTime = 30
                self.currentSpawnTime = 1
                self.player.currentInvincTime = 1
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_UP:
                self.player.moving[0] = False
            if event.key == pygame.K_s or event.key == pygame.K_DOWN:
                self.player.moving[1] = False
            if event.key == pygame.K_a or event.key == pygame.K_LEFT:
                self.player.moving[2] = False
            if event.key == pygame.K_d or event.key == pygame.K_RIGHT:
                self.player.moving[3] = False
            if event.key == pygame.K_SPACE or event.key == pygame.K_z:
                self.player.moving[4] = False
                self.boostSound.stop()

        
        
    def update(self):
        """updates the game"""
        if not self.inMenu:
            self.player.update(self.cam )
            self.cam.move_to(self.player.pos[0], self.player.pos[1])
            self.soundCon.update()
            
            #Enemy Spawning
            self.elapsed = (pygame.time.get_ticks() - self.timer) / 1000.0
            self.currentSpawnTime -= self.elapsed
            if ( self.currentSpawnTime <= 0 ):
                self.currentSpawnTime = self.spawnTime
                self.spawnEnemy()
            
            #Enemy update
            for tempEnemy in self.enemyList:
                tempEnemy.update(self.cam)
                self.player.checkColl(tempEnemy, self.cam, self)
            #Check enemy deaths
            for tempEnemy in self.enemyList:
                if tempEnemy.deathFlag:
                    self.score.total += 100
                    self.makeLineBurst( tempEnemy.rect.centerx, tempEnemy.rect.centery, tempEnemy.deathAngle, 60, 200, 50, (255,255,0), 0.1, True )
                    self.makeLineBurst( tempEnemy.rect.centerx, tempEnemy.rect.centery, tempEnemy.deathAngle, 60, 200, 50, (255,255,255), 0.1, True )
                    self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 100, 50, (255,255,255), 0.05, True )
                    self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 100, 40, (255,0,0), 0.05, True )
                    self.enemyExplo.play()
                    self.enemyList.remove( tempEnemy )
                    self.spawnEnemy()

            
            #Effect update
            for effect in self.effectInstances:
                if not effect.active:
                    self.effectInstances.remove( effect )
            
            #Shake and Decay
            self.camShakeFactor = self.camShakeFactor - ( self.camShakeFactor * self.camShakeDecayFactor )
            if ( self.camShakeFactor < 1 ):
                self.camShakeFactor = 0
            self.cam.shake(random.random() * self.camShakeFactor, random.random() * self.camShakeFactor)
            
            #Player boost effect
            if ( self.player.boosting ):
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, -self.player.ang  * 180 / math.pi + 180, 30, 3, 30, (255,255,155), 0.1, True )
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, -self.player.ang  * 180 / math.pi + 180, 30, 3, 30, (255,0,0), 0.1, True )
            if ( self.player.thrusting ):
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, -self.player.ang  * 180 / math.pi + 180, 20, 2, 20, (255,255,255), 0.1, True )
                
            #Update Score in HUD
            self.hud.updateScore(self.score.getTotal())
            
            #Death
            if self.player.dead and self.player.canMakeDeadEffect:
                self.player.canMakeDeadEffect = False
                self.shakeScreen( 64 )
                self.soundCon.playDeathSound()
                self.deathSound.play()
                #self.makeExplosion( 500, 500, "Images/Effects/Explosion2Spr.png", 200, 200, 8, 8, True)
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 200, 30, (255,255,0), 0.1, True )
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 200, 30, (255,0,0), 0.1, True )
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 100, 30, (255,155,0), 0.05, True )
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 100, 40, (255,0,0), 0.05, True )
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 100, 50, (255,255,255), 0.05, True )
                self.player.numLives -= 1
                if ( self.player.numLives <= 0 ):
                    self.doFade = True
                    self.player.currentDeadTime = 30
            if ( self.player.reformEffect ):
                self.player.reformEffect = False;
                self.spawnSound.play()
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 150, 15, (255,255,255), 0.1, False )
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 150, 30, (255,255,255), 0.1, False )
                self.makeLineBurst( self.player.rect.centerx, self.player.rect.centery, 0, 360, 150, 50, (255,255,255), 0.1, False )
            
            
            self.timer = pygame.time.get_ticks()
            
            
    def shakeScreen(self, magnitude):
        self.camShakeFactor = magnitude #Magnitude of shake
    
    def makeLineBurst(self, x, y, direction, spread, count, maxSpeed, color, lerpPercent, doRandom):
        newBurst = LineBurst( x, y, direction, spread, count, maxSpeed, color, lerpPercent, doRandom ) 
        self.effectInstances.append( newBurst )
        
    def makeExplosion(self, x, y, imagePath, imageWidth, imageHeight, numFrames, imageSpeed, doLoop):
        newAnim = EffectAnimation( x, y, imagePath, imageWidth, imageHeight, numFrames, imageSpeed, doLoop ) 
        self.effectInstances.append( newAnim )
    
    def spawnEnemy(self):
        if ( len(self.enemyList) == 0 ):
            for i in range( self.baseNumEnemies ):
                self.enemyList.append(AI(self.player, self.cam, self))
        else:
            self.enemyList.append(AI(self.player, self.cam, self))
        
    
    def draw(self):
        """draw the gameworld"""
        self.screen.fill((0,0,0))
        if self.inMenu:
            #calls the menu's draw function
            self.menu.draw(self.screen)
        else:
            #Draw the regular game
            backRect = self.backgroundImgRect.move(-self.cam.rect.x + self.camBorder / 2, -self.cam.rect.y + self.camBorder / 2)
            self.screen.blit(self.backgroundImg, backRect)
            self.player.draw( self.screen, self.cam )
            
            #Enemy draw
            for tempEnemy in self.enemyList:
                tempEnemy.draw(self.screen, self.cam)
            
            #Effect draw
            for effect in self.effectInstances:
                effect.draw(self.screen, self.cam)
                
            #HUD draw
            self.hud.draw(self.screen)
                
                
            #Game Over fade
            if self.doFade:
                self.fadeSurfaceAlpha += self.fadeSurfaceRate
                
                if ( self.fadeSurfaceAlpha >= 255 ):
                    self.inMenu = True
                    pygame.mixer.stop()
                    pygame.mixer.music.stop()
                    self.restartGame = True
                else:
                    self.fadeSurface.fill((0,0,0,self.fadeSurfaceAlpha))
                    self.fadeSurface.set_alpha( self.fadeSurfaceAlpha )
                    #tempRect = self.fadeRect.move(-self.cam.rect.x, -self.cam.rect.y)
                    self.fadeSurface.blit(self.fadeImage, (0,0))
                    self.screen.blit(self.fadeSurface,(-self.cam.rect.x + self.cam.rect.left,-self.cam.rect.y + self.cam.rect.top))