import pygame, sys import random pygame.init() screen = pygame.display.set_mode([640,480]) bg = pygame.Surface(screen.get_size()) bg.fill([0,0,0]) clock = pygame.time.Clock() class Fighter(pygame.sprite.Sprite): def __init__(self, imgFile, location, speed): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load(imgFile) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed ## def move(self): ## if self.rect.left <= screen.get_rect().left or \ ## self.rect.right >= screen.get_rect().right: ## self.speed[0] = -self.speed[0] ## newPos = self.rect.move(self.speed) ## self.rect = newPos class EnemySpaceShip(pygame.sprite.Sprite): def __init__(self, imgFile, location, speed): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load(imgFile) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed def move(self): if self.rect.left <= screen.get_rect().left or \ self.rect.right >= screen.get_rect().right: self.speed[0] = -self.speed[0] newPos = self.rect.move(self.speed) self.rect = newPos if self.rect.top > screen.get_rect().bottom: self.rect.bottom = 0 class Energy(pygame.sprite.Sprite): def __init__(self, imgFile, location, speed): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load(imgFile) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed def move(self): if self.rect.left <= screen.get_rect().left or \ self.rect.right >= screen.get_rect().right: self.speed[0] = -self.speed[0] newPos = self.rect.move(self.speed) self.rect = newPos if self.rect.top > screen.get_rect().bottom: self.rect.bottom = 0 class Missile(pygame.sprite.Sprite): def __init__(self, imgFile, location): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load(imgFile) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location def fire(self): if self.rect.top >= -30: self.rect.top -= 30 class Explosion(pygame.sprite.Sprite): def __init__(self, imgFile, location): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load(imgFile) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location myFighter = Fighter('fighter.png', [270, 360], [10,0]) myMissile = Missile('missile.png', [0, -100]) enemies = pygame.sprite.Group() for i in range(5): enemies.add(EnemySpaceShip('spaceship.png', [100+i*100, 20+i*10], [10,2])) energies = pygame.sprite.Group() # explosion sprite expoSprite = [Explosion('explosion-1.png', [0, -400]), Explosion('explosion-2.png', [0, -400]), Explosion('explosion-3.png', [0, -400]), Explosion('explosion-4.png', [0, -400]), Explosion('explosion-5.png', [0, -400]), Explosion('explosion-6.png', [0, -400]), Explosion('explosion-7.png', [0, -400])] expoLocation = [] screen.blit(myFighter.image, myFighter.rect) pygame.key.set_repeat(100, 1) countDown = 20 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: myFighter.rect.top -= 10 if event.key == pygame.K_DOWN: myFighter.rect.top += 10 if event.key == pygame.K_SPACE: if myMissile.rect.top <= 0: myMissile.rect.top = myFighter.rect.top myMissile.rect.centerx = myFighter.rect.centerx clock.tick(30) screen.blit(bg, (0,0)) if countDown == 0: enemies.add(EnemySpaceShip('spaceship.png', [random.randint(50, 600),20], [10,2])) countDown = 20 else: countDown -= 1 if True in pygame.mouse.get_pressed(): if myMissile.rect.top <= 0: myMissile.rect.top = myFighter.rect.top myMissile.rect.centerx = myFighter.rect.centerx #myFighter.move() # control fighter with mouse movement if abs(myFighter.rect.centerx - pygame.mouse.get_pos()[0]) > 1: myFighter.rect.centerx += int((pygame.mouse.get_pos()[0] - myFighter.rect.centerx)/10) if abs(myFighter.rect.centery - pygame.mouse.get_pos()[1]) > 1: myFighter.rect.centery += int((pygame.mouse.get_pos()[1] - myFighter.rect.centery)/10) myMissile.fire() for enemy in enemies: enemy.move() hitList = pygame.sprite.spritecollide(myMissile, enemies, True) if len(hitList) > 0: myMissile.rect.top = -400 for hit in hitList: expoLocation.append([(hit.rect.left-65,hit.rect.top-40), 0]) energies.add(Energy('energy.png', (hit.rect.left+20,hit.rect.top+20), [random.randint(1, 4),random.randint(1, 2)])) screen.blit(enemy.image, enemy.rect) for energy in energies: energy.move() pygame.sprite.spritecollide(myFighter, energies, True) screen.blit(energy.image, energy.rect) for expo in expoLocation: if expo[1] < 6: screen.blit(expoSprite[expo[1]].image, expo[0]) expo[1] += 1 else: expoLocation.remove(expo) screen.blit(myFighter.image, myFighter.rect) screen.blit(myMissile.image, myMissile.rect) pygame.display.flip()