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))