import pygame, sys import random pygame.init() screen = pygame.display.set_mode([640,480]) background = pygame.Surface(screen.get_size()) background.fill([0, 0, 0]) clock = pygame.time.Clock() class Bullet(pygame.sprite.Sprite): def __init__(self, image_file, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) 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, image_file, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location class Fighter(pygame.sprite.Sprite): def __init__(self, image_file, speed, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed class Enemy(pygame.sprite.Sprite): def __init__(self, image_file, speed, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) 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.bottom < 0: self.rect.top = screen.get_rect().bottom if self.rect.top > screen.get_rect().bottom: self.rect.bottom = 0 class Energy(pygame.sprite.Sprite): def __init__(self, image_file, speed, location): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image = pygame.image.load(image_file) 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.bottom < 0: self.rect.top = screen.get_rect().bottom if self.rect.top > screen.get_rect().bottom: self.rect.bottom = 0 myFighter = Fighter('fighter.png', [20, 20], [270,360]) screen.blit(myFighter.image, myFighter.rect) enemies = pygame.sprite.Group() for i in range(5): enemies.add(Enemy('spaceship.png', [20, 1], [100+i*100, 20+i*5])) myBullet = Bullet('missile.png', [0,-40]) expoSprite = [Explosion('explosion-0.png', [0, -400]), 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])] expoLocations = [] energies = pygame.sprite.Group() delay = 100 interval = 50 pygame.key.set_repeat(delay, interval) enemyInterval = 50 score = 0 scoreFont = pygame.font.Font(None, 20) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.display.quit() sys.exit() ## elif event.type == pygame.KEYDOWN: ## if event.key == pygame.K_UP: ## myFighter.rect.top = myFighter.rect.top - 10 ## elif event.key == pygame.K_DOWN: ## myFighter.rect.top = myFighter.rect.top + 10 ## elif event.type == pygame.MOUSEBUTTONDOWN: ## if myBullet.rect.top <= 0: ## myBullet.rect.top = myFighter.rect.top ## myBullet.rect.centerx = myFighter.rect.centerx clock.tick(30) screen.blit(background, (0, 0)) if True in pygame.mouse.get_pressed(): if myBullet.rect.top <= 0: myBullet.rect.top = myFighter.rect.top myBullet.rect.centerx = myFighter.rect.centerx # add more enemies enemyInterval -= 1 if enemyInterval == 0: enemies.add(Enemy('spaceship.png', [10, 1], [random.randint(20, 500), 20])) enemyInterval = 50 myBullet.fire() screen.blit(myBullet.image, myBullet.rect) # use the following code instead of pygame.MOUSEMOTION for acceleration effect 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) for enemy in enemies: enemy.move() for enemy in enemies: hitList = pygame.sprite.spritecollide(myBullet, enemies, True) if len(hitList) > 0: myBullet.rect.top = -400 for hit in hitList: expoLocations.append([(hit.rect.left-65, hit.rect.top-42), 0]) energies.add(Energy('energy.png', [random.randint(1, 4), random.randint(1, 2)], (hit.rect.left+21, hit.rect.top+18))) screen.blit(enemy.image, enemy.rect) for expo in expoLocations: if expo[1] < 7: screen.blit(expoSprite[expo[1]].image, expo[0]) expo[1] += 1 else: expoLocations.remove(expo) for energy in energies: energy.move() score += len(pygame.sprite.spritecollide(myFighter, energies, True)) screen.blit(energy.image, energy.rect) scoreText = "Score: " + str(score) scoreSurf = scoreFont.render(scoreText, 1, (100, 100, 255)) screen.blit(scoreSurf, [20, 5]) screen.blit(myFighter.image, myFighter.rect) pygame.display.flip()