diff --git a/Fonts/Square.ttf b/Fonts/Square.ttf old mode 100755 new mode 100644 diff --git a/README.md b/README.md index 2ea0c1c..f5c9e5d 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ | Participant | Role | ETC | -|===============|============|=====| -| Jeongkyu Shin | Instructor | | +|---------------|------------|-----| | Jeongkyu Shin | Instructor | | | Lee jaehee | student | | | Minseok Kang | Student | | @@ -13,7 +12,7 @@ | Jaewoo Yang | Student | | | Cho young il | Student | | | Jinsung An | Student | | -| Minwoo Son | Student | | +| Minwoo Son | Student | | | Kim Dain | Student | | | Jeongin Lee | Student | | | Minwoo Son | Student | | @@ -39,10 +38,10 @@ | Hoesung Jung | Student^^7 | Nerd| | Hyunjun Lee | Student | | | Minseok Kang | Student | | -| Jaehun Kim. | student. | | +| Jaehun Kim | student | | | Hansae Ju | Student | | | ChaeHyun Baek | Student | | -| Kim Tae Yoon | Student | | +| Kim Tae Yoon | Student | | | KeonWoong Noh | Student | | | Onyu Park | Student | | | TaeWoong Kong | Student | | @@ -63,15 +62,15 @@ | Yejun Kim | Student | | | Yunjea Nam | Student | | | Cho young il | Student | | -| Yerim Hwang | Student | | +| Yerim Hwang | Student | | | Kim yong jun | Student   | | -| Yerim Hwang | Student | | +| Yerim Hwang | Student | | | Minjun Kim | Student | | | JaeHun Lee | Student | | | Taewan Park | Student | | | HoJin Seo | Student | | | Sungho Yun | Student | | -| Keunmo Koo. | Genius | | +| Keunmo Koo | Genius | | diff --git a/alien.py b/alien.py index c6d484f..aa590f4 100644 --- a/alien.py +++ b/alien.py @@ -1,15 +1,15 @@ import pygame as pg from pygame.sprite import Sprite -from animations import AnimatedSprite import sounds +from animations import AnimatedSprite from eBullet import EBullet class Alien(Sprite): """A class to represent a single alien in the fleet""" - def __init__(self, setting, screen, hitPoint=3, isboss = False): + def __init__(self, setting, screen, hitPoint=3, isboss=False): """Initialize the alien and set its starting point""" super(Alien, self).__init__() self.screen = screen @@ -23,7 +23,7 @@ def __init__(self, setting, screen, hitPoint=3, isboss = False): self.image = self.sprite.getFrame(0) self.image = pg.transform.rotate(self.image, 180) if self.isboss == True: - self.image = pg.transform.scale(self.image,(setting.screenWidth // 8, setting.screenWidth // 8)) + self.image = pg.transform.scale(self.image, (setting.screenWidth // 8, setting.screenWidth // 8)) self.rect = self.image.get_rect() # start each new alien near the top left of the screen @@ -60,7 +60,6 @@ def checkBottom(self): def update(self, setting, screen, ship, aliens, eBullets): """Move the alien right or left""" - import random self.ship = ship self.aliens = aliens self.eBullets = eBullets @@ -77,7 +76,7 @@ def update(self, setting, screen, ship, aliens, eBullets): def shoot(self, setting, screen, ship, aliens, eBullets): if setting.gameLevel == 'hard': - setting.shootTimer = 10 # default = 50 + setting.shootTimer = 10 # default = 50 if self.isboss == False: setting.shootTimer = 50 @@ -112,5 +111,3 @@ def shoot(self, setting, screen, ship, aliens, eBullets): def blitme(self): """draw hte alien""" self.screen.blit(self.image, self.rect) - - diff --git a/background.py b/background.py index 27492b9..8c9cb63 100644 --- a/background.py +++ b/background.py @@ -74,4 +74,4 @@ def draw(self): while (drawY < self.screenRect.height): self.screen.blit(self.image, (drawX, drawY)) drawY += self.imageRect.height - drawX += self.imageRect.width \ No newline at end of file + drawX += self.imageRect.width diff --git a/bullet.py b/bullet.py index 23fc68b..2c1accf 100644 --- a/bullet.py +++ b/bullet.py @@ -18,8 +18,11 @@ def __init__(self, setting, screen, ship, traj, damage, charge=0): self.isUltimate = False # load the bullet image and set its rect attribute - self.image = pg.image.load('gfx/bullet2.png') - self.image = pg.transform.rotate(self.image, 180) + self.image = pg.image.load('gfx/pBullet.png') + if (self.traj == 1): + self.image = pg.transform.rotate(self.image, 315) + elif (self.traj == 2): + self.image = pg.transform.rotate(self.image, 45) self.rect = self.image.get_rect() if (charge != 0): bulletSize = (self.rect.width * (charge + 1), self.rect.height * (charge + 1)) @@ -34,7 +37,6 @@ def __init__(self, setting, screen, ship, traj, damage, charge=0): # store the bullets position as a decimal value self.x = float(self.rect.centerx) self.y = float(self.rect.y) - self.color = setting.bulletColor self.setting = setting # damage of basic bullet (default : 1) @@ -78,7 +80,7 @@ def __init__(self, setting, screen, pos, damage): self.isUltimate = True # load the bullet image and set its rect attribute - self.image = pg.image.load('gfx/bullet.png') + self.image = pg.image.load('gfx/sBullet.png') self.rect = self.image.get_rect() # Create a bullet rect at (0,0) diff --git a/buttonMenu.py b/buttonMenu.py index 7fcb46d..252708e 100644 --- a/buttonMenu.py +++ b/buttonMenu.py @@ -24,7 +24,6 @@ def __init__(self, screen): def addButton(self, name, msg): self.buttons[name] = Button(self.screen, msg, self.btnWidth, self.btnHeight) - def removeButton(self, name): if name in self.buttons: del self.buttons[name] @@ -121,11 +120,11 @@ def updateButtonsPos(self): for name in self.menuButtons: self.setButtonPos(name, self.x, btnY) btnY += offsetY - + def drawButton(self, name): if name in self.buttons: self.buttons[name].drawBtn() - + def drawMenuButtons(self): for name in self.menuButtons: self.drawButton(name) @@ -205,13 +204,13 @@ def setPosByButton(self, btn): def draw(self): self.screen.blit(self.image, self.rect) + class CurrentState(): - def __init__(self,screen,current): + def __init__(self, screen, current): self.screen = screen self.image = pg.image.load('gfx/ebullet.bmp') - self.image = pg.transform.scale(self.image,(10,10)) + self.image = pg.transform.scale(self.image, (10, 10)) self.current = current def draw(self): self.screen.blit(self.image, self.current) - diff --git a/data-files/highscore.json b/data-files/highscore.json deleted file mode 100644 index 34ef447..0000000 --- a/data-files/highscore.json +++ /dev/null @@ -1 +0,0 @@ -54280 \ No newline at end of file diff --git a/eBullet.py b/eBullet.py index bf6406b..4a8b290 100644 --- a/eBullet.py +++ b/eBullet.py @@ -5,13 +5,13 @@ class EBullet(Sprite): """A class to manage bullets fired from the alien""" - def __init__(self, setting, screen, alien, boss_bullet = 0): + def __init__(self, setting, screen, alien, boss_bullet=0): """Create a bullet object at the ships current position""" super(EBullet, self).__init__() self.screen = screen # load the bullet image and set its rect attribute - self.image = pg.image.load('gfx/ebullet.bmp') + self.image = pg.image.load('gfx/eBullet.png') self.rect = self.image.get_rect() self.boss_bullet = boss_bullet # Create a collision mask @@ -37,7 +37,6 @@ def __init__(self, setting, screen, alien, boss_bullet = 0): # store the bullets position as a decimal value self.y = float(self.rect.y) self.x = float(self.rect.x) - self.color = setting.bulletColor self.setting = setting def update(self, alien): diff --git a/gameFunctions.py b/gameFunctions.py index 3cec690..32779ad 100644 --- a/gameFunctions.py +++ b/gameFunctions.py @@ -1,9 +1,9 @@ import random import sys -import time + import pygame as pg + import sounds -from time import sleep from alien import Alien import random import random @@ -23,6 +23,7 @@ gameOverButtons = ["retry", "menu", "quit"] pauseButtons = ["play", "menu", "quit"] +exitButtons = ["yes", "no"] def checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBullets, charged_bullets): @@ -47,8 +48,7 @@ def checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBulle sounds.select_menu.play() selectedName, selectedBtn = bMenu.getSelectedButton() if selectedBtn: - ####################### - buttonAction(stats, selectedName, setting, screen, ship, aliens, bullets, eBullets) + buttonAction(stats, selectedName, setting, screen, ship, aliens, bullets, eBullets, charged_bullets) elif event.type == pg.KEYUP: checkKeyupEvents(event, setting, screen, stats, ship, bullets, charged_bullets) @@ -72,12 +72,13 @@ def checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBulle buttonAction(stats, mouseBtnName, setting, screen, ship, aliens, bullets, eBullets) -def buttonAction(stats, selectedName, setting, screen, ship, aliens, bullets, eBullets): +def buttonAction(stats, selectedName, setting, screen, ship, aliens, bullets, eBullets, charged_bullets): global boss if selectedName == 'play': - checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets) + checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets, charged_bullets) elif selectedName == 'retry': - checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets) + checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets, charged_bullets) + charged_bullets.empty() boss = None elif selectedName == 'menu': stats.setGameLoop('mainMenu') @@ -86,6 +87,13 @@ def buttonAction(stats, selectedName, setting, screen, ship, aliens, bullets, eB elif selectedName == 'quit': pg.time.delay(300) sys.exit() + elif selectedName == 'yes': + sounds.button_click_sound.play() + pg.time.delay(300) + sys.exit() + elif selectedName == 'no': + stats.exiton = 0 + checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets, charged_bullets) def checkKeydownEvents(event, setting, screen, stats, sb, ship, aliens, bullets, eBullets): @@ -123,10 +131,12 @@ def checkKeydownEvents(event, setting, screen, stats, sb, ship, aliens, bullets, useUltimate(setting, screen, stats, bullets, stats.ultimatePattern, ship) # Check for pause key elif event.key == pg.K_p or event.key == 181: + sounds.paused.play() + pause(stats) if not stats.paused and stats.gameActive: sounds.paused.play() pause(stats) - # Add speed control key + # Add speed control key elif event.key == pg.K_q or event.key == 172: setting.halfspeed() elif event.key == pg.K_w or event.key == 173: @@ -144,9 +154,17 @@ def checkKeydownEvents(event, setting, screen, stats, sb, ship, aliens, bullets, resetGame() elif event.key == pg.K_ESCAPE: # Quit game + sounds.paused.play() + stats.exiton += 1 + exitm(stats) sounds.button_click_sound.play() pg.time.delay(300) sys.exit() + # BGM pause and unpause + elif event.key == pg.K_r: + pg.mixer.music.pause() + elif event.key == pg.K_t: + pg.mixer.music.unpause() def checkKeyupEvents(event, setting, screen, stats, ship, bullets, charged_bullets): @@ -165,8 +183,7 @@ def checkKeyupEvents(event, setting, screen, stats, ship, bullets, charged_bulle if (ship.chargeGauge == 100): sounds.charge_shot.play() newBullet = Bullet(setting, screen, ship, ship.trajectory, 3, ship.damage * 5) - bullets.add(newBullet) - #charged_bullets.add(newBullet) + charged_bullets.add(newBullet) ship.chargeGauge = 0 elif (50 <= ship.chargeGauge): sounds.charge_shot.play() @@ -181,6 +198,11 @@ def pause(stats): stats.paused = True +def exitm(stats): + """Pause the game when the pause button is pressed""" + stats.gameActive = False + + def resetGame(): global reset reset = 1 @@ -188,7 +210,7 @@ def resetGame(): stats.saveHighScore() -def checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets): +def checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets, charged_bullets): """Start new game if playbutton is pressed""" if not stats.gameActive and not stats.paused: setting.initDynamicSettings() @@ -199,6 +221,7 @@ def checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets): aliens.empty() bullets.empty() eBullets.empty() + charged_bullets.empty() # Create a new fleet and center the ship createFleet(setting, stats, screen, ship, aliens) @@ -209,6 +232,7 @@ def checkPlayBtn(setting, screen, stats, ship, aliens, bullets, eBullets): stats.gameActive = True stats.paused = False + def getNumberAliens(setting, alienWidth): """Determine the number of aliens that fit in a row""" availableSpaceX = setting.screenWidth - 2 * alienWidth @@ -234,14 +258,15 @@ def createAlien(setting, stats, screen, aliens, alienNumber, rowNumber): """ random position of enemy will be created in game window""" alien.rect.x = random.randrange(0, setting.screenWidth - alien.x / 2) alien.rect.y = (alien.rect.height + random.randrange(0, setting.screenHeight - alien.rect.height * 2)) / 1.5 - if(stats.level % 5 == 0): + if (stats.level % 5 == 0): alien.hitPoint += stats.level / 5 aliens.add(alien) + def createBoss(setting, stats, screen, aliens, alienNumber, rowNumber): global boss sounds.stage_clear.play() - alien = Alien(setting, screen, stats.level*30, True) + alien = Alien(setting, screen, stats.level * 30, True) alienWidth = alien.rect.width screenRect = alien.screen.get_rect() alien.x = alienWidth + 2 * alienWidth * alienNumber @@ -251,6 +276,7 @@ def createBoss(setting, stats, screen, aliens, alienNumber, rowNumber): aliens.add(alien) boss = alien + def createItem(setting, screen, stats, posx, posy, type, items): """add item func""" # item number is 1 per type @@ -264,7 +290,7 @@ def createItem(setting, screen, stats, posx, posy, type, items): def createFleet(setting, stats, screen, ship, aliens): """Create a fleet of aliens""" - alien = Alien(setting, screen, stats.level*3) + alien = Alien(setting, screen, stats.level * 3) numberAliensX = getNumberAliens(setting, alien.rect.width) numberRows = getNumberRows(setting, ship.rect.height, alien.rect.height) @@ -276,13 +302,14 @@ def createFleet(setting, stats, screen, ship, aliens): def createFleetBoss(setting, stats, screen, ship, aliens): """Create a fleet of aliens""" - alien = Alien(setting, screen, stats.level*20) + alien = Alien(setting, screen, stats.level * 20) numberAliensX = 1 numberRows = 1 # create the first row of aliens createBoss(setting, stats, screen, aliens, numberAliensX, numberRows) + def checkFleetEdges(setting, aliens): """Respond if any aliens have reached an edge""" for alien in aliens.sprites(): @@ -310,6 +337,11 @@ def changeFleetDir(setting, aliens): alien.rect.y += setting.fleetDropSpeed elif setting.gameLevel == 'hard': alien.rect.y += (setting.fleetDropSpeed + 3) + else: + if alien.rect.y < int(setting.screenHeight * 0.8): + alien.rect.y += 50 + else: + alien.rect.y -= 50 setting.fleetDir *= -1 @@ -337,8 +369,12 @@ def shipHit(setting, stats, sb, screen, ship, aliens, bullets, eBullets): stats.gameActive = False checkHighScore(stats, sb) + def updateInvincibility(setting, screen, ship): if pg.time.get_ticks() - setting.newStartTime < setting.invincibileTime: + if pg.time.get_ticks() % 2 == 1: + isurf = pg.Surface( + (ship.images[ship.imgCenter].get_rect().width, ship.images[ship.imgCenter].get_rect().height)) if pg.time.get_ticks()%2 == 1: isurf = pg.Surface((ship.images[ship.imgCenter].get_rect().width,ship.images[ship.imgCenter].get_rect().height)) shieldimg = pg.image.load('gfx/spr_shield.png') @@ -346,12 +382,20 @@ def updateInvincibility(setting, screen, ship): screen.blit(isurf, (ship.rect.x, ship.rect.y)) screen.blit(shieldimg, (ship.rect.x-13, ship.rect.y)) else: + isurf = pg.Surface( + (ship.images[ship.imgCenter].get_rect().width, ship.images[ship.imgCenter].get_rect().height)) isurf = pg.Surface((ship.images[ship.imgCenter].get_rect().width,ship.images[ship.imgCenter].get_rect().height)) shieldimg = pg.image.load('gfx/spr_shield.png') isurf.set_alpha(200) screen.blit(isurf, (ship.rect.x, ship.rect.y)) screen.blit(shieldimg, (ship.rect.x-13, ship.rect.y)) + +def updateShieldEffect(setting, screen, ship): + if pg.time.get_ticks() - setting.newStartTime < setting.invincibileTime: + image = pg.image.load('gfx/image_shield.png') + screen.blit(image, (ship.rect.x - 7, ship.rect.y)) + def updateInvineffect(setting,screen,ship): if pg.time.get_ticks() - setting.newStartTime < setting.invincibileTime: image = pg.image.load('gfx/image_shield.png') @@ -363,16 +407,16 @@ def updateAliens(setting, stats, sb, screen, ship, aliens, bullets, eBullets): checkFleetBottom(setting, stats, sb, screen, ship, aliens, bullets, eBullets) aliens.update(setting, screen, ship, aliens, eBullets) - #look for alien-ship collision + # look for alien-ship collision if pg.sprite.spritecollideany(ship, aliens): - #74 + # 74 shipHit(setting, stats, sb, screen, ship, aliens, bullets, eBullets) - #sb.prepShips() + # sb.prepShips() def updateBullets(setting, screen, stats, sb, ship, aliens, bullets, eBullets, charged_bullets, items): """update the position of the bullets""" - #check if we are colliding + # check if we are colliding bullets.update() for eBullet in eBullets: for alien in aliens: @@ -382,7 +426,7 @@ def updateBullets(setting, screen, stats, sb, ship, aliens, bullets, eBullets, c checkBulletAlienCol(setting, screen, stats, sb, ship, aliens, bullets, eBullets, charged_bullets, items) checkEBulletShipCol(setting, stats, sb, screen, ship, aliens, bullets, eBullets) - #if bullet goes off screen delete it + # if bullet goes off screen delete it for bullet in eBullets.copy(): screenRect = screen.get_rect() if bullet.rect.top >= screenRect.bottom: @@ -401,9 +445,9 @@ def updateBullets(setting, screen, stats, sb, ship, aliens, bullets, eBullets, c def updateItems(setting, screen, stats, sb, ship, aliens, bullets, eBullets, items): """give a effect when ship col item""" - #check if we are colliding + # check if we are colliding items.update() - #if bullet goes off screen delete it + # if bullet goes off screen delete it for item in items.sprites(): screenRect = screen.get_rect() if item.rect.top >= screenRect.bottom: @@ -412,87 +456,137 @@ def updateItems(setting, screen, stats, sb, ship, aliens, bullets, eBullets, ite if item.rect.bottom <= 0: items.remove(item) for item in items.sprites(): - disX = int((ship.rect.centerx - ship.rect.x) + (item.rect.centerx - item.rect.x)*0.67) - disY = int((ship.rect.centery - ship.rect.y) + (item.rect.centery - item.rect.y)*0.67) - if abs(item.rect.centerx - ship.rect.centerx) < disX and abs(item.rect.centery-ship.rect.centery) < disY: - if item.type == 1: + disX = int((ship.rect.centerx - ship.rect.x) + (item.rect.centerx - item.rect.x) * 0.67) + disY = int((ship.rect.centery - ship.rect.y) + (item.rect.centery - item.rect.y) * 0.67) + if abs(item.rect.centerx - ship.rect.centerx) < disX and abs(item.rect.centery - ship.rect.centery) < disY: + if 1 < item.type < 2: sounds.heal_sound.play() if stats.shipsLeft < setting.shipLimit: - stats.shipsLeft += 1 + if item.type == 1.1: + stats.shipsLeft += 1 + elif item.type == 1.2: + stats.shipsLeft += 2 + elif item.type == 1.3: + stats.shipsLeft += 3 + else: + stats.score += int(setting.alienPoints * 3 * (item.type - 1) * 10) + elif 2 < item.type < 3: + sounds.slow_sound.play() + if setting.newItemSlowTime != 0: + if item.type == 2.1: + setting.newItemSlowTime += setting.slowTime * 0.5 + elif item.type == 2.2: + setting.newItemSlowTime += setting.slowTime + elif item.type == 2.3: + setting.newItemSlowTime += setting.slowTime * 1.5 else: - stats.score += setting.alienPoints * 3 - elif item.type == 2: - if (setting.newItemSlowTime != 0): - setting.newItemSlowTime += setting.slowTime - else : setting.newItemSlowTime = pg.time.get_ticks() + if item.type == 2.1: + setting.newItemSlowTime -= setting.slowTime * 0.5 + elif item.type == 2.3: + setting.newItemSlowTime += setting.slowTime * 0.5 setting.alienSpeed *= 0.5 setting.alienbulletSpeed *= 0.5 setting.fleetDropSpeed *= 0.5 - sounds.slow_sound.play(-1) - elif item.type == 3: + elif 3 < item.type < 4: setting.newStartTime = pg.time.get_ticks() + if item.type == 3.1: + setting.newStartTime -= setting.invincibileTime * 0.5 + elif item.type == 3.3: + setting.newStartTime += setting.invincibileTime * 0.5 sounds.shield_sound.play() - elif item.type == 4: - setting.newItemSpeedTime = pg.time.get_ticks() - setting.shipSpeed *= 2 + elif 4 < item.type: + if setting.newItemSpeedTime != 0: + if setting.speedTimeOverLap < 4: + setting.shipSpeed *= 1.3 + setting.speedTimeOverLap += 1 + if item.type == 4.1: + setting.newItemSpeedTime += setting.speedTime * 0.5 + elif item.type == 4.2: + setting.newItemSpeedTime += setting.speedTime + elif item.type == 4.3: + setting.newItemSpeedTime += setting.speedTime * 1.5 + else: + setting.newItemSpeedTime = pg.time.get_ticks() + if item.type == 4.1: + setting.newItemSpeedTime -= setting.speedTime * 0.5 + elif item.type == 4.3: + setting.newItemSpeedTime += setting.speedTime * 0.5 + setting.speedStore = setting.shipSpeed + setting.shipSpeed *= 1.3 + setting.speedTimeOverLap += 1 items.remove(item) + def updateSlowtime(setting): - if setting.newItemSlowTime !=0: + if setting.newItemSlowTime != 0: if pg.time.get_ticks() - setting.newItemSlowTime > setting.slowTime: - setting.alienSpeed *= 2 - setting.alienbulletSpeed *= 2 - setting.fleetDropSpeed *= 2 - setting.newItemSlowTime = 0 - sounds.slow_sound.stop() + setting.DynamicSettings() + def updateSpeedtime(setting): - if setting.newItemSpeedTime !=0: + if setting.newItemSpeedTime != 0: if pg.time.get_ticks() - setting.newItemSpeedTime > setting.speedTime: - setting.shipSpeed *= 0.5 + setting.shipSpeed = setting.speedStore + setting.speedTimeOverLap = 0 setting.newItemSpeedTime = 0 - def checkBulletAlienCol(setting, screen, stats, sb, ship, aliens, bullets, eBullets, charged_bullets, items): """Detect collisions between alien and bullets""" global boss collisions = pg.sprite.groupcollide(aliens, bullets, False, False) collisions.update(pg.sprite.groupcollide(aliens, charged_bullets, False, False)) if collisions: + sounds.enemy_explosion_sound.play() sounds.enemy_damaged_sound.play() - for alien in collisions : - #charged_bullet bgManager - if alien.animationState == 0 : + for alien in collisions: + # charged_bullet bgManager + if alien.animationState == 0: alien.animationState = 1 for charged_bullet in charged_bullets: alien.hitPoint -= charged_bullet.damage - for bullet in collisions[alien] : + for bullet in collisions[alien]: alien.hitPoint -= bullet.damage bullets.remove(bullet) - if alien.hitPoint <= 0 : + if alien.hitPoint <= 0: setting.explosions.add(alien.rect.x, alien.rect.y) sounds.enemy_explosion_sound.play() - #if an enemy dies, it falls down an item randomly. - #use cumulative probability - i = random.randrange(100) - if i<=setting.probabilityHeal: - createItem(setting, screen, stats, alien.rect.x, alien.rect.y, 1, items) - if setting.probabilityHeal 100: @@ -501,15 +595,14 @@ def checkBulletAlienCol(setting, screen, stats, sb, ship, aliens, bullets, eBull stats.score += setting.alienPoints * len(aliens) checkHighScore(stats, sb) - sb.prepScore() - #Check if there are no more aliens + # Check if there are no more aliens if len(aliens) == 0: # Destroy exsiting bullets and create new fleet sounds.stage_clear.play() bullets.empty() eBullets.empty() - setting.increaseSpeed() #Speed up game + setting.increaseSpeed() # Speed up game stats.level += 1 setting.setIncreaseScoreSpeed(stats.level) sb.prepLevel() @@ -528,7 +621,7 @@ def checkEBulletShipCol(setting, stats, sb, screen, ship, aliens, bullets, eBull if pg.sprite.collide_mask(ship, ebullet): shipHit(setting, stats, sb, screen, ship, aliens, bullets, eBullets) setting.shipSpeed = 2.5 - #sb.prepShips() + # sb.prepShips() eBullets.remove(ebullet) @@ -556,6 +649,10 @@ def updateUltimateGauge(setting, screen, stats, sb): else: pg.draw.rect(screen, (255, 255, 255), (x, y, 100, 12), 0) pg.draw.rect(screen, (0, 255, 255), (x, y, gauge, 12), 0) + ultimatefont = pg.font.Font('Fonts/Square.ttf', 20) + ultimateStr = ultimatefont.render("Ultimate", True, (255, 255, 255), setting.bgColor) + ultimateStrpos = (x, y + 12) + screen.blit(ultimateStr, ultimateStrpos) def UltimateDiamondShape(setting, screen, stats, sbullets, damage): @@ -586,7 +683,7 @@ def useUltimate(setting, screen, stats, sbullets, pattern, ship): sounds.ult_attack.play() UltimateDiamondShape(setting, screen, stats, sbullets, ship.damage) # elif pattern == 2: - # make other pattern + # make other pattern stats.ultimateGauge = 0 @@ -611,6 +708,10 @@ def drawChargeGauge(setting, screen, ship, sb): pg.draw.rect(screen, (255, 255, 255), (x, y, 100, 10), 0) pg.draw.rect(screen, color, (x, y, ship.chargeGauge, 10), 0) + chargefont = pg.font.Font('Fonts/Square.ttf', 20) + chargeStr = chargefont.render("Charge", True, (255, 255, 255), setting.bgColor) + chargeStrpos = (x, y + 10) + screen.blit(chargeStr, chargeStrpos) def drawBossHP(setting, screen): @@ -632,18 +733,17 @@ def drawBossHP(setting, screen): pg.draw.rect(screen, (255, 255, 255), (x, y, w, h), 0) pg.draw.rect(screen, color, (x, y, hpBar, h), 0) + def updateScreen(setting, screen, stats, sb, ship, aliens, bullets, eBullets, charged_bullets, bMenu, bgManager, items): """Update images on the screen and flip to the new screen""" # Redraw the screen during each pass through the loop # Fill the screen with background color # Readjust the quit menu btn position - global clock, FPS, gameOverButtons, pauseButtons, boss + global clock, FPS, gameOverButtons, exitButtons, pauseButtons, boss bMenu.drawMenu() bgManager.update() bgManager.draw() - - # draw all the bullets for bullet in bullets.sprites(): bullet.drawBullet() @@ -662,11 +762,11 @@ def updateScreen(setting, screen, stats, sb, ship, aliens, bullets, eBullets, ch i.update() i.drawitem() - #Shield if ship is invincibile + # Blink if ship is invincibile updateInvincibility(setting, screen, ship) - #shield effect of the ship - updateInvineffect(setting,screen,ship) + # Shield effect of the ship + updateShieldEffect(setting, screen, ship) # Update Item_time updateSlowtime(setting) @@ -698,6 +798,13 @@ def updateScreen(setting, screen, stats, sb, ship, aliens, bullets, eBullets, ch screen.blit(scoreImg, ((setting.screenWidth - scoreImg.get_width()) / 2, 120)) screen.blit(setting.gameOverImage, (20, 30)) else: + if (stats.exiton > 0): + exitImg = pg.font.Font('Fonts/Square.ttf', 35).render("ARE YOU SURE YOU EXIT GAME?", True, (0, 0, 0), + (255, 255, 255)) + screen.blit(exitImg, ((setting.screenWidth - exitImg.get_width()) / 2, 120)) + bMenu.setMenuButtons(exitButtons) + else: + bMenu.setMenuButtons(pauseButtons) bMenu.setMenuButtons(pauseButtons) bMenu.drawMenu() setting.explosions.draw(screen) diff --git a/gameStats.py b/gameStats.py index 5e0774c..8a27b54 100644 --- a/gameStats.py +++ b/gameStats.py @@ -1,6 +1,8 @@ import json import os +import settings + class GameStats(): """Track stats for alien shooter""" @@ -16,15 +18,16 @@ def __init__(self, setting): self.playMenu = False self.twoPlayer = False self.settingsMenu = False - ############# self.levelMenu = False self.speedMenu = False self.paused = False self.score = 0 self.level = 1 + self.highScore = 0 self.highScoreSaveFileName = 'data-files/highscore.json' self.resetStats() + self.exiton = 0 ######### # self.gameLevel = 0 @@ -56,9 +59,10 @@ def setGameLoop(self, loop): elif loop == 'levelMenu': self.levelMenu = True elif loop == 'speedMenu': - self.speedMenu = True + self.speedMenu = True def resetStats(self): + settingS = settings.Settings() """initialize statistics that can change during the game""" self.shipsLeft = self.setting.shipLimit self.level = 1 @@ -66,7 +70,7 @@ def resetStats(self): self.counter = 3 self.ultimateGauge = 0 self.ultimatePattern = 1 - + settingS.initDynamicSettings() self.tempScore = self.loadHighScore() if self.highScore >= self.tempScore: self.saveHighScore() diff --git a/gfx/eBullet.png b/gfx/eBullet.png new file mode 100644 index 0000000..c3d8a94 Binary files /dev/null and b/gfx/eBullet.png differ diff --git a/gfx/explosion-sheet_reverse.png b/gfx/explosion-sheet_reverse.png new file mode 100644 index 0000000..2aba7f0 Binary files /dev/null and b/gfx/explosion-sheet_reverse.png differ diff --git a/gfx/item_heal2_B.png b/gfx/item_heal2_B.png new file mode 100644 index 0000000..51a7431 Binary files /dev/null and b/gfx/item_heal2_B.png differ diff --git a/gfx/item_heal2_I.png b/gfx/item_heal2_I.png new file mode 100644 index 0000000..73c2488 Binary files /dev/null and b/gfx/item_heal2_I.png differ diff --git a/gfx/item_heal2.png b/gfx/item_heal2_S.png similarity index 100% rename from gfx/item_heal2.png rename to gfx/item_heal2_S.png diff --git a/gfx/item_shield_B.png b/gfx/item_shield_B.png new file mode 100644 index 0000000..a5bb8c8 Binary files /dev/null and b/gfx/item_shield_B.png differ diff --git a/gfx/item_shield.png b/gfx/item_shield_I.png similarity index 100% rename from gfx/item_shield.png rename to gfx/item_shield_I.png diff --git a/gfx/item_shield_S.png b/gfx/item_shield_S.png new file mode 100644 index 0000000..8ebbf52 Binary files /dev/null and b/gfx/item_shield_S.png differ diff --git a/gfx/item_speed_B.png b/gfx/item_speed_B.png new file mode 100644 index 0000000..8071b33 Binary files /dev/null and b/gfx/item_speed_B.png differ diff --git a/gfx/item_speed.png b/gfx/item_speed_I.png similarity index 100% rename from gfx/item_speed.png rename to gfx/item_speed_I.png diff --git a/gfx/item_speed_S.png b/gfx/item_speed_S.png new file mode 100644 index 0000000..eb1e5f1 Binary files /dev/null and b/gfx/item_speed_S.png differ diff --git a/gfx/item_time_B.png b/gfx/item_time_B.png new file mode 100644 index 0000000..7983f48 Binary files /dev/null and b/gfx/item_time_B.png differ diff --git a/gfx/item_time_I.png b/gfx/item_time_I.png new file mode 100644 index 0000000..e9c3e5f Binary files /dev/null and b/gfx/item_time_I.png differ diff --git a/gfx/item_time.png b/gfx/item_time_S.png similarity index 100% rename from gfx/item_time.png rename to gfx/item_time_S.png diff --git a/gfx/About_about.png b/gfx/old_gfx/About_about.png similarity index 100% rename from gfx/About_about.png rename to gfx/old_gfx/About_about.png diff --git a/gfx/About_modify.PNG b/gfx/old_gfx/About_modify.PNG similarity index 100% rename from gfx/About_modify.PNG rename to gfx/old_gfx/About_modify.PNG diff --git a/gfx/About_modify_old.PNG b/gfx/old_gfx/About_modify_old.PNG similarity index 100% rename from gfx/About_modify_old.PNG rename to gfx/old_gfx/About_modify_old.PNG diff --git a/gfx/Alien_Scout.bmp b/gfx/old_gfx/Alien_Scout.bmp similarity index 100% rename from gfx/Alien_Scout.bmp rename to gfx/old_gfx/Alien_Scout.bmp diff --git a/gfx/abouttxt.png b/gfx/old_gfx/abouttxt.png similarity index 100% rename from gfx/abouttxt.png rename to gfx/old_gfx/abouttxt.png diff --git a/gfx/alien.bmp b/gfx/old_gfx/alien.bmp similarity index 100% rename from gfx/alien.bmp rename to gfx/old_gfx/alien.bmp diff --git a/gfx/alien1.bmp b/gfx/old_gfx/alien1.bmp similarity index 100% rename from gfx/alien1.bmp rename to gfx/old_gfx/alien1.bmp diff --git a/gfx/alien3.png b/gfx/old_gfx/alien3.png similarity index 100% rename from gfx/alien3.png rename to gfx/old_gfx/alien3.png diff --git a/gfx/alienchange.png b/gfx/old_gfx/alienchange.png similarity index 100% rename from gfx/alienchange.png rename to gfx/old_gfx/alienchange.png diff --git a/gfx/bullet.bmp b/gfx/old_gfx/bullet.bmp similarity index 100% rename from gfx/bullet.bmp rename to gfx/old_gfx/bullet.bmp diff --git a/gfx/bullet.png b/gfx/old_gfx/bullet.png similarity index 100% rename from gfx/bullet.png rename to gfx/old_gfx/bullet.png diff --git a/gfx/bullet2.png b/gfx/old_gfx/bullet2.png similarity index 100% rename from gfx/bullet2.png rename to gfx/old_gfx/bullet2.png diff --git a/gfx/bullet_colorchange.bmp b/gfx/old_gfx/bullet_colorchange.bmp similarity index 100% rename from gfx/bullet_colorchange.bmp rename to gfx/old_gfx/bullet_colorchange.bmp diff --git a/gfx/bullet_colorchange.png b/gfx/old_gfx/bullet_colorchange.png similarity index 100% rename from gfx/bullet_colorchange.png rename to gfx/old_gfx/bullet_colorchange.png diff --git a/gfx/cHair.png b/gfx/old_gfx/cHair.png similarity index 100% rename from gfx/cHair.png rename to gfx/old_gfx/cHair.png diff --git a/gfx/ebullet.bmp b/gfx/old_gfx/ebullet.bmp similarity index 100% rename from gfx/ebullet.bmp rename to gfx/old_gfx/ebullet.bmp diff --git a/gfx/ebullet_colorchange.bmp b/gfx/old_gfx/ebullet_colorchange.bmp similarity index 100% rename from gfx/ebullet_colorchange.bmp rename to gfx/old_gfx/ebullet_colorchange.bmp diff --git a/gfx/ebullet_colorchange.png b/gfx/old_gfx/ebullet_colorchange.png similarity index 100% rename from gfx/ebullet_colorchange.png rename to gfx/old_gfx/ebullet_colorchange.png diff --git a/gfx/enemy.bmp b/gfx/old_gfx/enemy.bmp similarity index 100% rename from gfx/enemy.bmp rename to gfx/old_gfx/enemy.bmp diff --git a/gfx/enemy.png b/gfx/old_gfx/enemy.png similarity index 100% rename from gfx/enemy.png rename to gfx/old_gfx/enemy.png diff --git a/gfx/fixsettings.png b/gfx/old_gfx/fixsettings.png similarity index 100% rename from gfx/fixsettings.png rename to gfx/old_gfx/fixsettings.png diff --git a/gfx/playe1r.bmp b/gfx/old_gfx/playe1r.bmp similarity index 100% rename from gfx/playe1r.bmp rename to gfx/old_gfx/playe1r.bmp diff --git a/gfx/player.bmp b/gfx/old_gfx/player.bmp similarity index 100% rename from gfx/player.bmp rename to gfx/old_gfx/player.bmp diff --git a/gfx/player.png b/gfx/old_gfx/player.png similarity index 100% rename from gfx/player.png rename to gfx/old_gfx/player.png diff --git a/gfx/player1.bmp b/gfx/old_gfx/player1.bmp similarity index 100% rename from gfx/player1.bmp rename to gfx/old_gfx/player1.bmp diff --git a/gfx/player_blue.bmp b/gfx/old_gfx/player_blue.bmp similarity index 100% rename from gfx/player_blue.bmp rename to gfx/old_gfx/player_blue.bmp diff --git a/gfx/player_grey.bmp b/gfx/old_gfx/player_grey.bmp similarity index 100% rename from gfx/player_grey.bmp rename to gfx/old_gfx/player_grey.bmp diff --git a/gfx/player_red.bmp b/gfx/old_gfx/player_red.bmp similarity index 100% rename from gfx/player_red.bmp rename to gfx/old_gfx/player_red.bmp diff --git a/gfx/ship.bmp b/gfx/old_gfx/ship.bmp similarity index 100% rename from gfx/ship.bmp rename to gfx/old_gfx/ship.bmp diff --git a/gfx/title(2).png b/gfx/old_gfx/title(2).png similarity index 100% rename from gfx/title(2).png rename to gfx/old_gfx/title(2).png diff --git a/gfx/title.png b/gfx/old_gfx/title.png similarity index 100% rename from gfx/title.png rename to gfx/old_gfx/title.png diff --git a/gfx/title_modify.PNG b/gfx/old_gfx/title_modify.PNG similarity index 100% rename from gfx/title_modify.PNG rename to gfx/old_gfx/title_modify.PNG diff --git a/gfx/untitled.png b/gfx/old_gfx/untitled.png similarity index 100% rename from gfx/untitled.png rename to gfx/old_gfx/untitled.png diff --git "a/gfx/\354\240\234\353\252\251 \354\227\206\354\235\214-1 - \353\263\265\354\202\254\353\263\270.png" "b/gfx/old_gfx/\354\240\234\353\252\251 \354\227\206\354\235\214-1 - \353\263\265\354\202\254\353\263\270.png" similarity index 100% rename from "gfx/\354\240\234\353\252\251 \354\227\206\354\235\214-1 - \353\263\265\354\202\254\353\263\270.png" rename to "gfx/old_gfx/\354\240\234\353\252\251 \354\227\206\354\235\214-1 - \353\263\265\354\202\254\353\263\270.png" diff --git a/gfx/pBullet.png b/gfx/pBullet.png new file mode 100644 index 0000000..944c307 Binary files /dev/null and b/gfx/pBullet.png differ diff --git a/gfx/player_ship/red/player_ship.png b/gfx/player_ship/red/player_ship.png index cfb9ce1..e745d4a 100644 Binary files a/gfx/player_ship/red/player_ship.png and b/gfx/player_ship/red/player_ship.png differ diff --git a/gfx/sBullet.png b/gfx/sBullet.png new file mode 100644 index 0000000..a9c5c48 Binary files /dev/null and b/gfx/sBullet.png differ diff --git a/gfx/title_c_reverse.png b/gfx/title_c_reverse.png new file mode 100644 index 0000000..88e3d17 Binary files /dev/null and b/gfx/title_c_reverse.png differ diff --git a/item.py b/item.py index 53f1ed5..75587bc 100644 --- a/item.py +++ b/item.py @@ -1,53 +1,68 @@ import pygame as pg -import random from pygame.sprite import * + class Item(Sprite): """A class to manage speed item droped from the alien""" + def __init__(self, setting, screen, stats, type, posx, posy): """Create a item object at the aliens current position""" super(Item, self).__init__() self.screen = screen self.stats = stats - #add item types if you want - if(type==1): - self.image = pg.image.load('gfx/item_heal2.png') - elif(type==2): - self.image = pg.image.load('gfx/item_time.png') - elif(type==3): - self.image = pg.image.load('gfx/item_shield.png') - elif(type==4): - self.image = pg.image.load('gfx/item_speed.png') + # add item types if you want + if type == 1.1: + self.image = pg.image.load('gfx/item_heal2_B.png') + elif type == 1.2: + self.image = pg.image.load('gfx/item_heal2_I.png') + elif type == 1.3: + self.image = pg.image.load('gfx/item_heal2_S.png') + elif type == 2.1: + self.image = pg.image.load('gfx/item_time_B.png') + elif type == 2.2: + self.image = pg.image.load('gfx/item_time_I.png') + elif type == 2.3: + self.image = pg.image.load('gfx/item_time_S.png') + elif type == 3.1: + self.image = pg.image.load('gfx/item_shield_B.png') + elif type == 3.2: + self.image = pg.image.load('gfx/item_shield_I.png') + elif type == 3.3: + self.image = pg.image.load('gfx/item_shield_S.png') + elif type == 4.1: + self.image = pg.image.load('gfx/item_speed_B.png') + elif type == 4.2: + self.image = pg.image.load('gfx/item_speed_I.png') + elif type == 4.3: + self.image = pg.image.load('gfx/item_speed_S.png') self.type = type self.rect = self.image.get_rect() - #Create a collision mask + # Create a collision mask self.mask = pg.mask.from_surface(self.image) - #Create a items rect at (0,0)+-5 + # Create a items rect at (0,0)+-5 ##self.rect = pg.Rect(0, 0, setting.bulletWidth, setting.bulletHeight) self.rect.x = posx self.rect.y = posy - #store the item position as a decimal value + # store the item position as a decimal value self.y = float(self.rect.y) self.itemSpeed = setting.bulletSpeed * 0.3 - def update(self): """Move the item -y up the screen""" - #update the decimal position of the item + # update the decimal position of the item if not self.stats.paused: self.y += self.itemSpeed - #Update the rect position + # Update the rect position self.rect.y = self.y - def drawitem(self): """Draw the item to the screen""" - #pg.draw.rect(self.screen, self.color, self.rect) + # pg.draw.rect(self.screen, self.color, self.rect) self.screen.blit(self.image, self.rect) diff --git a/levelMenu.py b/levelMenu.py index 77427d8..a4fba8c 100644 --- a/levelMenu.py +++ b/levelMenu.py @@ -47,7 +47,7 @@ def checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBulle def buttonAction(stats, selectedName, setting): - if selectedName == 'hard': + if selectedName == 'hard': setting.gameLevel = 'hard' stats.setGameLoop('playMenu') elif selectedName == 'normal': diff --git a/main.py b/main.py index 0599f27..a00fb89 100644 --- a/main.py +++ b/main.py @@ -5,22 +5,23 @@ import about as About import gameFunctions as gf # Event checker and update screen import intro # intro video making -import mainMenu as mm # Main menu import levelMenu as lm # select game level(hard/easy) +import mainMenu as mm # Main menu import playMenu as pm # choosing ship color import settingsMenu as sm +import sounds import speedMenu as spm import twoPlayer as tp # two player mode -import sounds from animations import Explosions -from buttonMenu import ButtonMenu from background import BackgroundManager +from buttonMenu import ButtonMenu from gameStats import GameStats # Game stats that are changed during the duration of the game from scoreboard import Scoreboard # Score board for points, high score, lives, level ect. # import self made classes from settings import Settings from ship import Ship + def runGame(): # Initialize game and create a window pg.init() @@ -50,20 +51,29 @@ def runGame(): bMenu.addButton("hard", "HARD") bMenu.addButton("normal", "NORMAL") bMenu.addButton("back", "MENU") - bMenu.addButton("speed setting","SPEED") - bMenu.addButton("fast","FAST") - bMenu.addButton("middle","MIDDLE") - bMenu.addButton("slow","SLOW") - bMenu.addButton("sound","SOUND") - bMenu.addButton("loud","LOUD") - bMenu.addButton("low","LOW") - - mainMenuButtons = ["play", "about", "settings", "quit"] # delete "twoPlay" + bMenu.addButton("speed setting", "SPEED") + bMenu.addButton("fast", "FAST") + bMenu.addButton("middle", "MIDDLE") + bMenu.addButton("slow", "SLOW") + bMenu.addButton("yes", "YES") + bMenu.addButton("no", "NO") + bMenu.addButton("interception", "INTERCEPT") + + bMenu.addButton("sound", "SOUND") + bMenu.addButton("loud", "LOUD") + bMenu.addButton("low", "LOW") + + mainMenuButtons = ["play", "about", "settings", "quit"] # delete "twoPlay" playMenuButtons = ["grey", "red", "blue", "menu", "quit"] levelMenuButtons = ["hard", "normal", "back", "quit"] mainGameButtons = ["play", "menu", "quit"] aboutButtons = ["menu", "quit"] + + soundButtons = ["loud", "low", "menu"] + + settingsMenuButtons = ["menu", "invert", "speed setting", "interception", "quit"] + speedButtons = ["menu", "fast", "middle", "slow"] settingsMenuButtons = ["menu", "invert","speed setting","sound","quit"] speedButtons = ["fast","middle","slow","menu"] @@ -93,7 +103,7 @@ def runGame(): ship1 = Ship(setting, screen) ship2 = Ship(setting, screen) - #make a group of items to store + # make a group of items to store items = Group() # make a group of bullets to store @@ -159,18 +169,21 @@ def runGame(): while stats.mainGame: # Game functions - gf.checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBullets, charged_bullets) # Check for events + gf.checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBullets, + charged_bullets) # Check for events # Reset Game if gf.reset == 1: gf.reset = 0 pg.register_quit(runGame()) if stats.gameActive: gf.updateAliens(setting, stats, sb, screen, ship, aliens, bullets, eBullets) # Update aliens - gf.updateBullets(setting, screen, stats, sb, ship, aliens, bullets, eBullets, charged_bullets, items) # Update collisions + gf.updateBullets(setting, screen, stats, sb, ship, aliens, bullets, eBullets, charged_bullets, + items) # Update collisions gf.updateItems(setting, screen, stats, sb, ship, aliens, bullets, eBullets, items) ship.update(bullets, aliens) # update the ship # Update the screen - gf.updateScreen(setting, screen, stats, sb, ship, aliens, bullets, eBullets, charged_bullets, bMenu, bgManager, items) + gf.updateScreen(setting, screen, stats, sb, ship, aliens, bullets, eBullets, charged_bullets, bMenu, + bgManager, items) bMenu.setMenuButtons(aboutButtons) bMenu.setPos(None, 500) diff --git a/playMenu.py b/playMenu.py index c071215..3c97ff3 100644 --- a/playMenu.py +++ b/playMenu.py @@ -49,11 +49,11 @@ def checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBulle def buttonAction(stats, selectedName, ship): if selectedName in ('grey', 'red', 'blue'): color = selectedName - if color == 'grey' : + if color == 'grey': stats.setting.playerShipColor = 'gray' - elif color == 'red' : + elif color == 'red': stats.setting.playerShipColor = 'red' - elif color == 'blue' : + elif color == 'blue': stats.setting.playerShipColor = 'blue' stats.setGameLoop('mainGame') elif selectedName == 'menu': diff --git a/scoreboard.py b/scoreboard.py index 0898de5..9c273a5 100644 --- a/scoreboard.py +++ b/scoreboard.py @@ -1,9 +1,7 @@ import pygame as pg import pygame.font -from pygame.sprite import Group import utilityFunctions -from ship import Ship getInvertedRGB = utilityFunctions.getInvertedRGB @@ -23,7 +21,7 @@ def __init__(self, setting, screen, stats): self.font = pygame.font.Font('Fonts/Square.ttf', 20) self.lifeImage = pg.image.load('gfx/player_ship/red/player_ship.png') - self.lifeImage = pg.transform.scale(self.lifeImage,(30,30)) + self.lifeImage = pg.transform.scale(self.lifeImage, (30, 30)) self.lifeImageRect = self.lifeImage.get_rect() # Prepare the initial score image @@ -42,7 +40,6 @@ def prepScore(self): self.scoreImg = self.font.render(scoreStr, True, self.textColor, self.setting.bgColor) - # Display the score at the top left corner self.scoreRect = self.scoreImg.get_rect() self.scoreRect.right = self.screenRect.right - 20 @@ -72,14 +69,18 @@ def prepLevel(self): def drawLife(self): """Show how many lives are left/ships""" - self.lifeImage = pg.image.load('gfx/player_ship/'+self.setting.playerShipColor+'/player_ship.png') - self.lifeImage = pg.transform.scale(self.lifeImage,(30,30)) + self.lifeImage = pg.image.load('gfx/player_ship/' + self.setting.playerShipColor + '/player_ship.png') + self.lifeImage = pg.transform.scale(self.lifeImage, (30, 30)) self.lifeImageRect = self.lifeImage.get_rect() self.lifeImageRect.x = 10 self.lifeImageRect.y = self.scoreRect.bottom + 2 for i in range(self.stats.shipsLeft): self.screen.blit(self.lifeImage, self.lifeImageRect) self.lifeImageRect.x += self.lifeImageRect.width + 10 + lifefont = pg.font.Font('Fonts/Square.ttf', 20) + lifeStr = lifefont.render("Life", True, (255, 255, 255), self.setting.bgColor) + lifeStrpos = (self.lifeImageRect.x - 35, self.lifeImageRect.y + 40) + self.screen.blit(lifeStr, lifeStrpos) def prepCounter(self, active): self.counterImg = self.font.render(str(self.stats.counter), True, self.textColor, diff --git a/settings.py b/settings.py index 2c835a9..79148f8 100644 --- a/settings.py +++ b/settings.py @@ -6,7 +6,6 @@ class Settings(): - """A class to store all settings for game""" def __init__(self): @@ -35,7 +34,6 @@ def __init__(self): self.scoreSpeedUp = 5 # GameSpeedLimit - self.Limit = 0 self.globalGameSpeed = 1 # Game Speed @@ -53,24 +51,33 @@ def __init__(self): # Game Level self.gameLevel = 'normal' - # Alien shoot speed self.shootTimer = 50 - #item probability % - self.probabilityHeal = 10 - self.probabilityTime = 20 - self.probabilityShield = 25 - self.probabilitySpeed = 20 - - #invincibile time - self.invincibileTime = 2000 - - #item_time Slow time - self.slowTime = 3000 - self.speedTime = 7000 - - #Player ship + # item probability % + self.probabilityHealB = 50 + self.probabilityHealI = 75 + self.probabilityHealS = 85 + self.probabilityTimeB = 185 + self.probabilityTimeI = 235 + self.probabilityTimeS = 255 + self.probabilityShieldB = 405 + self.probabilityShieldI = 480 + self.probabilityShieldS = 505 + self.probabilitySpeedB = 605 + self.probabilitySpeedI = 655 + self.probabilitySpeedS = 675 + + # invincibile time + self.invincibileTime = 3000 + + # item_time Slow&Speed time + self.slowTime = 4500 + self.speedTime = 9000 + self.speedTimeOverLap = 0 + self.speedStore = 0 + + # Player ship self.playerShipColor = 'gray' def invertColor(self): @@ -87,12 +94,23 @@ def speedVariable(self): def initDynamicSettings(self): self.shipSpeed = 2.5 * self.speedVariable() - self.bulletSpeed = 4* self.speedVariable() - self.alienSpeed = 1* self.speedVariable() - self.alienbulletSpeed = 4* self.speedVariable() - self.fleetDropSpeed = 5* self.speedVariable() - self.fleetDir = 1* self.speedVariable() - self.alienPoints = 10* self.speedVariable() + self.bulletSpeed = 4 * self.speedVariable() + self.alienSpeed = 1 * self.speedVariable() + self.alienbulletSpeed = 4 * self.speedVariable() + self.fleetDropSpeed = 5 * self.speedVariable() + self.fleetDir = self.speedVariable() + self.alienPoints = 10 * self.speedVariable() + self.Limit = 0 + + def DynamicSettings(self): + if self.Limit > 0: + self.alienSpeed = 1 * 1.3 * (self.Limit + 1) + self.alienbulletSpeed = 4 * 1.3 * (self.Limit + 1) + self.fleetDropSpeed = 5 * 1.3 * (self.Limit + 1) + else: + self.alienSpeed = 1 * 0.8 * (self.Limit + 1) + self.alienbulletSpeed = 4 * 0.8 * (self.Limit + 1) + self.fleetDropSpeed = 5 * 0.8 * (self.Limit + 1) def increaseSpeed(self): """Increase the speed settings""" @@ -109,24 +127,24 @@ def setIncreaseScoreSpeed(self, level): self.alienPoints = int(self.alienPoints + self.scoreSpeedUp) - def halfspeed(self): if self.Limit >= -1 and self.shipSpeed > 0 and self.bulletSpeed > 0 and self.alienSpeed > 0 and self.fleetDropSpeed > 0: - self.shipSpeed *= 0.5 - self.bulletSpeed *= 0.5 - self.alienSpeed *= 0.5 - self.alienbulletSpeed *= 0.5 - self.fleetDropSpeed *= 0.5 - self.alienPoints *= 0.5 # nerf earning points in lower speed - self.globalGameSpeed *= 0.5 + self.shipSpeed *= 0.8 + self.bulletSpeed *= 0.8 + self.alienSpeed *= 0.8 + self.alienbulletSpeed *= 0.8 + self.fleetDropSpeed *= 0.8 + self.alienPoints *= 0.8 # nerf earning points in lower speed + self.globalGameSpeed *= 0.8 self.Limit -= 1 def doublespeed(self): - self.shipSpeed *= 1.3 - self.bulletSpeed *= 1.3 - self.alienSpeed *= 1.3 - self.alienbulletSpeed *= 1.3 - self.fleetDropSpeed *= 1.3 - self.alienPoints *= 1.3 - self.globalGameSpeed *= 1.3 - self.Limit += 1 + if self.Limit < 5: + self.shipSpeed *= 1.3 + self.bulletSpeed *= 1.3 + self.alienSpeed *= 1.3 + self.alienbulletSpeed *= 1.3 + self.fleetDropSpeed *= 1.3 + self.alienPoints *= 1.3 + self.globalGameSpeed *= 1.3 + self.Limit += 1 diff --git a/settingsMenu.py b/settingsMenu.py index 0e208cd..a8c1c6c 100644 --- a/settingsMenu.py +++ b/settingsMenu.py @@ -64,6 +64,12 @@ def buttonAction(stats, selectedName, bMenu, setting, sb): sys.exit() elif selectedName == 'speed setting': stats.setGameLoop('speedMenu') + elif selectedName == 'interception': + setting.checkBtnPressed += 1 + if setting.checkBtnPressed % 2 != 0: + setting.interception = True + stats.setGameLoop('mainMenu') + def drawMenu(setting, screen, sb, bMenu): """Draw the menu and all of its elements""" diff --git a/ship.py b/ship.py index 30ef753..ee54975 100644 --- a/ship.py +++ b/ship.py @@ -1,12 +1,12 @@ +import math + import pygame as pg from pygame.sprite import * -import math from bullet import Bullet from playMenu import * - class Ship(Sprite): """Class of a player ship""" @@ -48,7 +48,7 @@ def __init__(self, setting, screen): 'gfx/player_ship/gray/player_ship_right1.png', 'gfx/player_ship/gray/player_ship_right2.png', 'gfx/player_ship/gray/player_ship_right3.png', - 'gfx/player_ship/gray/player_ship_right4.png') + 'gfx/player_ship/gray/player_ship_right4.png') self.images_red = [] for path in self.imagesPath_red: @@ -151,11 +151,11 @@ def update(self, bullets, aliens, ): self.chargeGauge = 0 # update rect object from self.center - if self.setting.playerShipColor == 'gray' : + if self.setting.playerShipColor == 'gray': self.images = self.images_gray - elif self.setting.playerShipColor == 'red' : + elif self.setting.playerShipColor == 'red': self.images = self.images_red - elif self.setting.playerShipColor == 'blue' : + elif self.setting.playerShipColor == 'blue': self.images = self.images_blue self.rect.centerx = self.center diff --git a/soundMenu.py b/soundMenu.py index d0dbb50..9e4a4d6 100644 --- a/soundMenu.py +++ b/soundMenu.py @@ -7,6 +7,7 @@ image = pg.image.load('gfx/fixsetting4.png') rect = image.get_rect() + # Create a variable to change current button being selected def checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBullets): """Respond to keypresses and mouse events.""" @@ -55,9 +56,10 @@ def buttonAction(stats, selectedName, setting): elif selectedName == 'low': setting.gameSpeed = 'middle' stats.setGameLoop('settingsMenu') - + elif selectedName == 'back': - stats.setGameLoop('settingsMenu') + stats.setGameLoop('settingsMenu') + def drawMenu(setting, screen, sb, bMenu): """Draw the menu and all of its elements""" diff --git a/sounds.py b/sounds.py index e213eaa..701029c 100644 --- a/sounds.py +++ b/sounds.py @@ -3,7 +3,6 @@ # Init and load sound effects pg.mixer.init(44100, -16, 2, 4096) - control_menu = pg.mixer.Sound("sound_effects/control_menu.wav") control_menu.set_volume(0.22) diff --git a/speedMenu.py b/speedMenu.py index c69f425..052183a 100644 --- a/speedMenu.py +++ b/speedMenu.py @@ -7,6 +7,7 @@ image = pg.image.load('gfx/fixsetting4.png') rect = image.get_rect() + # Create a variable to change current button being selected def checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBullets): """Respond to keypresses and mouse events.""" @@ -49,7 +50,9 @@ def checkEvents(setting, screen, stats, sb, bMenu, ship, aliens, bullets, eBulle def buttonAction(stats, selectedName, setting): - if selectedName == 'fast': + if selectedName == 'menu': + stats.setGameLoop('settingsMenu') + elif selectedName == 'fast': setting.gameSpeed = 'fast' stats.setGameLoop('settingsMenu') elif selectedName == 'middle': @@ -67,6 +70,7 @@ def buttonAction(stats, selectedName, setting): pg.time.delay(300) sys.exit() + def drawMenu(setting, screen, sb, bMenu): """Draw the menu and all of its elements""" global image, rect