import random, os.path import pygame from pygame.locals import * import Behavior MAX_SHOTS = 5 if not pygame.image.get_extended(): raise SystemExit,"sorry, extended image module required" SCREENRECT = Rect(0,0,1024,768) def load_image(file): file = os.path.join('data',file) try: surface = pygame.image.load(file) except pygame.error: raise SystemExit, 'Could not load image "%s"%s'%(file,pygame.get_error) return surface.convert() def load_images(*files): imgs = [] for file in files: imgs.append(load_image(file)) return imgs class Player(pygame.sprite.Sprite): speed = 4 FRAME = 1 UP = 0 REGULAR = 1 DOWN = 2 FrameFrequence = 5 PreviousMove = 0 count = 0 imageCount = 0 imageMax = 15 imagefrequence = 5 maxShots = 1 experience = 0 def __init__(self): pygame.sprite.Sprite.__init__(self,self.containers) self.image = self.images[self.REGULAR] self.rect = self.image.get_rect() self.rect.centerx = SCREENRECT.right self.rect.bottom = SCREENRECT.bottom - 100 self.reloading = 0; self.timing = 0; def move(self, directionx,directiony, xy): if xy=='xy': self.rect.move_ip(directionx*self.speed,directiony*self.speed) elif xy=='x': self.rect.move_ip(directionx*self.speed,0) elif xy=='y': self.rect.move_ip(0,directiony*self.speed) self.rect = self.rect.clamp(SCREENRECT) def setImage(self, direction) : self.count=self.count+1 def update(self): self.count = self.count + 1 if self.count%self.imagefrequence == 0: if self.imageCount <self.imageMax : self.image = self.images[self.imageCount] self.imageCount= self.imageCount + 1 self.count=0 else : self.imageCount = 0 def gunpos(self) : return self.rect.right-130, self.rect.bottom-100 class Shots(pygame.sprite.Sprite) : speedx = -10 speedy = 0 def __init__(self, pos, kind, speedy=0) : pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[kind] self.rect = self.image.get_rect() self.rect.midbottom = pos self.speedy = speedy def update(self) : self.rect.move_ip(self.speedx, self.speedy) if self.rect.right <= SCREENRECT.left : self.kill() def pos(self) : self.kill() return self.rect.centerx, self.rect.centery class EnemyShot1(Shots): speedx = 7 speedy = 0 count = 0 imageCount = 0 imageMax = 4 imagefrequence = 5 playerPosY = 0 patientOfInducement = 50 speedIncreaseRateOfY = 0.1 def __init__(self, pos, playerPosY) : pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.images[0] self.rect = self.image.get_rect() self.rect.midbottom = pos self.playerPosY = playerPosY def update(self): if self.rect.centery<(self.playerPosY-self.patientOfInducement): self.speedy+=self.speedIncreaseRateOfY elif self.rect.centery>(self.playerPosY+self.patientOfInducement): self.speedy-=self.speedIncreaseRateOfY self.rect.move_ip(self.speedx,self.speedy) if self.rect.right >= SCREENRECT.right : self.kill() self.count = self.count + 1 if self.count%self.imagefrequence == 0: if self.imageCount <self.imageMax : self.image = self.images[self.imageCount] self.imageCount= self.imageCount + 1 self.count=0 else : self.imageCount = 0 class SuperClassOfEachClass(pygame.sprite.Sprite): def __init__(self): pass def setContainers(self,arg): self.containers = arg pygame.sprite.Sprite.__init__(self,self.containers) def setImage(self,arg): self.image = arg self.rect = self.image.get_rect() #self.setPos() def setImages(self,arg): self.images = arg def update(self): self.rect.move_ip(self.speed,0) class Item(pygame.sprite.Sprite, SuperClassOfEachClass): speed = 10 def setPos(self, posx, posy): self.rect.centery = posy+100 self.rect.centerx = posx+100 def update(self): self.rect.move_ip(self.speed,0) class Enemy(pygame.sprite.Sprite, SuperClassOfEachClass): #Default gauage of Enemys speedx = 10 speedy = 2 imageCount = 0 imageMax = 5 imagefrequence = 5 count = 0 ImageUpwardShape = 1 ImageDownwardShape = 0 life = 1 pattern = 0 playerPosY = 0 shotRate = 9 #If ShotRate is high the enemy shot least than low def __init__(self, life, imageMax, playerPosY): self.life = life self.imageMax = imageMax self.playerPosY = playerPosY def setSpritePattern(self, pattern): self.pattern = pattern def setPos(self, posx, posy): self.rect.centery = posy+100 self.rect.centerx = posx+100 def setImage(self,arg): self.image = arg self.rect = self.image.get_rect() self.sprite = pygame.Surface(self.rect.size) #self.sprite.blit(0,(0,0)) #self.image = self def update(self): self.count = self.count + 1 if self.count%self.imagefrequence == 0: if self.imageCount <self.imageMax and self.imageCount >= 0 : self.image = self.images[self.imageCount] if self.ImageUpwardShape==1: self.imageCount = self.imageCount + 1 else: self.imageCount = self.imageCount -1 elif self.imageCount==self.imageMax-1: self.ImageUpwardShape = 0 elif self.imageCount==0: self.ImageUpwardShape = 1 else: self.imageCount = 0 if self.count%(self.imagefrequence*self.shotRate) == 0: EnemyShot1(self.gunpos(), self.playerPosY) self.count = 0 Behavior.Behavior(self,self.pattern) if self.rect.right >= SCREENRECT.right : self.kill() def gunpos(self) : return self.rect.right, self.rect.bottom class Explosion(pygame.sprite.Sprite): defaultLife = 10; def __init__(self,pos): pygame.sprite.Sprite.__init__(self,self.containers) self.image = self.images[0] self.rect = self.image.get_rect() self.rect.centerx = pos[0] self.rect.centery = pos[1] self.lifes = self.defaultLife def update(self): self.lifes = self.lifes- 1 if self.lifes <0: self.kill() class Building(pygame.sprite.Sprite,SuperClassOfEachClass): rect = Rect(0,0,0,0) def __init__(self): self.speed = 15 def setImage(self,arg): self.image = arg self.rect = self.image.get_rect() self.setPos() def setPos(self): self.rect.centerx = SCREENRECT.left self.rect.centery = (SCREENRECT.bottom/10)*int(9) def update(self): self.rect.move_ip(self.speed,0) class Score: def __init__(self): self.score = 0 def plusScore(self,arg): if arg == 1: self.score += 10 elif arg == 2: self.score += 20 self.printScore() def printScore(self): # To do show in GUI print self.score def DynamicEnemyAssign(enemyList, countOfEnemy, Enemy, life, imageMax, enemy_containers, Enemy_img, pathAndKinds, line, playerPosY): enemyList[countOfEnemy] = Enemy(life,imageMax, playerPosY) enemyList[countOfEnemy].setContainers(enemy_containers) enemyList[countOfEnemy].setImage(Enemy_img[0]) enemyList[countOfEnemy].setImages(Enemy_img) enemyList[countOfEnemy].setSpritePattern(pathAndKinds[line][4]) enemyList[countOfEnemy].setPos(SCREENRECT.left,(SCREENRECT.bottom/10)*int(pathAndKinds[line][0])) def DynamicItemAssign(itemList, countOfItem, Item, imageMax, item_containers, Item_img ,pos): itemList[countOfItem] = Item() itemList[countOfItem].setContainers(item_containers) itemList[countOfItem].setImage(Item_img[0]) itemList[countOfItem].setImages(Item_img) itemList[countOfItem].setPos(pos[0], pos[1]) def SearchKilledEnemy(enemyList, Enemy): for enemy in EnemyenemyList: if enemy.life == 0 : return 1 return 0 def main(winstyle = 0): #Initialize pygame.init() #Set the display mode winstyle = 0 bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle,32) screen = pygame.display.set_mode(SCREENRECT.size, winstyle,bestdepth) #create the background, tile the bgd image background = pygame.Surface(SCREENRECT.size) #Initialize Game groups all = pygame.sprite.RenderUpdates() shots = pygame.sprite.Group() player1 = pygame.sprite.Group() enemy_sprite = pygame.sprite.Group() enemy2_sprite = pygame.sprite.Group() building_1_sprite = pygame.sprite.Group() enemyShot1 = pygame.sprite.Group() item_sprite = pygame.sprite.Group() #asign default groups to each sprite class Player.containers = all,player1 Shots.containers = shots, all enemy_containers = enemy_sprite, all building_1_containers = building_1_sprite, all EnemyShot1.containers = all, enemyShot1 item_containers = all, item_sprite enemy2_containers = all, enemy2_sprite Explosion.containers = all #assign instance ty each class building_1 = Building() building_1.setContainers(building_1_containers) score = Score() #Load images, assign sprite classes Enemy1_img = load_images('enemy1_000.gif','enemy1_002.gif','enemy1_004.gif','enemy1_006.gif','enemy1_008.gif') #enemy_1[0].setImage(Enemy1_img[0]) #enemy_1[0].setImages(Enemy1_img) shotImgs = load_images('bullet1.gif', 'bullet2.gif', 'bullet3.gif', 'bullet4.gif') Shots.images = shotImgs imgs = load_images('dragon000.gif','dragon002.gif','dragon004.gif','dragon006.gif','dragon008.gif','dragon010.gif','dragon012.gif','dragon014.gif','dragon016.gif','dragon018.gif','dragon020.gif','dragon022.gif','dragon024.gif','dragon026.gif','dragon028.gif','dragon030.gif') Player.images = imgs img = load_image('building_1.gif') building_1.setImage(img) img = load_image('explosion1.gif') Explosion.images = [img] img = load_images('ShotOfEnemy1_000.gif','ShotOfEnemy1_002.gif','ShotOfEnemy1_004.gif','ShotOfEnemy1_006.gif') EnemyShot1.images = img Enemy2_img = load_images('enemy2_000.gif','enemy2_002.gif','enemy2_004.gif','enemy2_006.gif') Enemy3_img = load_images('enemy3_000.gif','enemy3_002.gif','enemy3_004.gif','enemy3_006.gif','enemy3_008.gif') Enemy4_img = load_images('enemy4_000.gif','enemy4_002.gif','enemy4_004.gif','enemy4_006.gif') Enemy5_img = load_images('enemy5_000.gif','enemy5_002.gif','enemy5_004.gif','enemy5_006.gif') Enemy6_img = load_images('enemy6.gif') #Enemy2.images = img item1_img = load_images('item1.gif') #decorate the game window pygame.mouse.set_visible(0) #Create some starting values clock = pygame.time.Clock() #initialize our starting sprites player = Player() #open the path and kind of enemy file = open(os.path.join('PathOfEnemy.txt')) pathAndKinds = file.readlines() one = 0 line = 0 countOfEnemy = 0 MAX_ENEMY = 5 MAX_ITEM = 6 Enemy1Kill = 0 #initialize list of Enemys enemy_1 = range(MAX_ENEMY) enemy_2 = range(MAX_ENEMY) item_1 = range(MAX_ITEM) curGun = 0 while player.alive(): #get input for event in pygame.event.get(): if event.type == QUIT or \ (event.type == KEYDOWN and event.key==K_ESCAPE): return if event.type == KEYDOWN : if event.key == K_0 : player.maxShots = player.maxShots + 1 if player.maxShots == 4 : player.maxShots = 1 keystate = pygame.key.get_pressed() #clear/erase the last drawn sprites all.clear(screen, background) #handle player input direction1 = keystate[K_RIGHT] - keystate[K_LEFT] direction2 = keystate[K_DOWN] - keystate[K_UP] if direction1 !=0 and direction2 != 0 : if direction2 < 0 : player.setImage(Player.UP) elif direction2 > 0 : player.setImage(Player.DOWN) player.move(direction1,direction2,'xy') elif direction1!=0: player.move(direction1,direction2,'x') elif direction2!=0: if direction2 < 0 : player.setImage(Player.UP) elif direction2 > 0 : player.setImage(Player.DOWN) player.move(direction1,direction2,'y') elif direction2 == 0 : player.setImage(Player.REGULAR) firing = keystate[K_SPACE] if player.reloading and firing and len(shots) <= MAX_SHOTS and player.timing % 10 is 0: if curGun == 3 : x,y = player.gunpos() for i in range(-30 * (player.maxShots - 1) + y, 30 * (player.maxShots - 1) + y + 1 , 30) : shot = Shots((x,i), curGun, (i-y)/30) else : Shots(player.gunpos(), curGun) if player.timing % 2 is 0 : player.reloading = firing player.reloading = firing player.timing += 1 #Enemy & Building Control Statements... if player.timing%70==0: if(int(pathAndKinds[line][2])==0): DynamicEnemyAssign(enemy_1, countOfEnemy, Enemy, 1, 4, enemy_containers, Enemy3_img, pathAndKinds, line, player.gunpos()[1]) elif(int(pathAndKinds[line][2])==1): DynamicEnemyAssign(enemy_2, countOfEnemy, Enemy,3, 4, enemy_containers, Enemy2_img, pathAndKinds, line, player.gunpos()[1]) building_1.setPos() if countOfEnemy>=MAX_ENEMY-1: countOfEnemy=-1 countOfEnemy +=1 line += 1 for shot in pygame.sprite.groupcollide(shots,enemy_sprite,1,1).keys(): Explosion(shot.pos()) DynamicItemAssign(item_1, countOfEnemy, Item, 1, item_containers, item1_img, shot.pos()) score.plusScore(1) for shot in pygame.sprite.groupcollide(shots,enemy_sprite,1,1).keys(): Explosion(shot.pos()) score.plusScore(2) for shot in pygame.sprite.groupcollide(item_sprite, player1, 1, 0).keys() : player.experience += 1 if player.experience is 30 and curGun != 3: curGun += 1 player.experience = 0 elif curGun == 3 and player.experience is 30 : player.maxShots += 1 #update all the sprites all.update() #draw the scene dirty = all.draw(screen) pygame.display.update(dirty) #cap the framerate clock.tick(80) #call the "main" function if running this script if __name__=='__main__':main()