# coding=utf8 import pygame from pygame.locals import * from random import randint as rint class MySprite(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.master_image = None self.frame = 0 self.old_frame = -1 self.frame_width = 1 self.frame_height = 1 self.first_frame = 0 self.last_frame = 0 self.columns = 1 self.last_time = 0 self.direction = 0 self.velocity = Point(0.0, 0.0) # X property def _getx(self): return self.rect.x def _setx(self, value): self.rect.x = value X = property(_getx, _setx) # Y property def _gety(self): return self.rect.y def _sety(self, value): self.rect.y = value Y = property(_gety, _sety) # position property def _getpos(self): return self.rect.topleft def _setpos(self, pos): self.rect.topleft = pos position = property(_getpos, _setpos) def load(self, filename, width, height, columns): self.master_image = pygame.image.load(filename).convert_alpha() self.frame_width = width self.frame_height = height self.rect = Rect(0, 0, width, height) self.columns = columns # try to auto-calculate total frames rect = self.master_image.get_rect() self.last_frame = (rect.width // width) * (rect.height // height) - 1 def update(self, current_time, rate=30): # update animation frame number if current_time > self.last_time + rate: self.frame += 1 if self.frame > self.last_frame: self.frame = self.first_frame self.last_time = current_time # build current frame only if it changed if self.frame != self.old_frame: frame_x = (self.frame % self.columns) * self.frame_width frame_y = (self.frame // self.columns) * self.frame_height rect = Rect(frame_x, frame_y, self.frame_width, self.frame_height) self.image = self.master_image.subsurface(rect) self.old_frame = self.frame def __str__(self): return str(self.frame) + "," + str(self.first_frame) + \ "," + str(self.last_frame) + "," + str(self.frame_width) + \ "," + str(self.frame_height) + "," + str(self.columns) + \ "," + str(self.rect) # Point class class Point(object): def __init__(self, x, y): self.__x = x self.__y = y # X property def getx(self): return self.__x def setx(self, x): self.__x = x x = property(getx, setx) # Y property def gety(self): return self.__y def sety(self, y): self.__y = y y = property(gety, sety) def __str__(self): return "{X:" + "{:.0f}".format(self.__x) + \ ",Y:" + "{:.0f}".format(self.__y) + "}" pygame.init() playerHealth = 100 keys = [False, False, False, False] skybg = pygame.image.load("resources/images/skybg.jpg") missile = pygame.image.load("resources/images/bullet2.png") screen = pygame.display.set_mode((1024, 600)) pygame.display.set_caption("SkyFight") timer = pygame.time.Clock() # warship sprite warship_group = pygame.sprite.Group() # enemy sprite chopper_group = pygame.sprite.Group() # player sprite player_group = pygame.sprite.Group() player = MySprite() player.load("resources/images/playerchopper.png", 173, 58, 4) player.position = 0, 350 player_group.add(player) # player missile sprite missile_group = pygame.sprite.Group() # enemy missile sprite enemy_missile_group = pygame.sprite.Group() # warship missile group warship_missile_group = pygame.sprite.Group() # flame sprite flame_group = pygame.sprite.Group() def addNewFlame(position): flame = MySprite() flame.load("resources/images/flame.png", 64, 64, 4) flame.position = position flame_group.add(flame) # warship flame warship_flame_group = pygame.sprite.Group() def addNewWarshipFlame(position): warship_flame = MySprite() warship_flame.load("resources/images/warship_flame.png", 64, 64, 4) warship_flame.position = position warship_flame_group.add(warship_flame) badtimer = 100 badtimer1 = 0 missile_launched = 0 missile_hit = 0 missile_hit_warship = 0 total_enemy_showedup = 0 enemy_missile_launched = 0 warship_health = 10 # to make autopilot missile launch interval tickstart = [] tickstart.append(pygame.time.get_ticks()) while True: # start game ticks timer.tick(60) ticks = pygame.time.get_ticks() screen.fill(0) # draw background sky screen.blit(skybg, (0, 0)) # add warship sprite (only one warship on the screen) if len(warship_group) == 0: warship = MySprite() warship.load("resources/images/warship.png", 350, 70, 1) warship.position = 1024, 500 warship_group.add(warship) # adjust warship to come close to player if warship.X < player.X + 200: warship.X += 1 elif warship.X > player.X + 200: warship.X -= 1 # draw warship warship_group.update(ticks) warship_group.draw(screen) # warship launch missile for warship in warship_group: if len(warship_missile_group) == 0: if warship.X < 800: warship_missile = MySprite() warship_missile.load("resources/images/warship_missile.png", 32, 121, 1) warship_missile.position = warship.X + 160, warship.Y - 60 warship_missile_group.add(warship_missile) # guide missile & change missile position for warship_missilex in warship_missile_group: warship_missilex.Y -= 1 if warship_missilex.Y < 0: warship_missile_group.remove(warship_missilex) # warship missile & enemy collision detect collision = None collision = pygame.sprite.spritecollideany( warship_missilex, chopper_group) if collision != None: if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision): chopper_group.remove(collision) flameposition = warship_missilex.position addNewFlame(flameposition) # warship missile & enemy missile collision detect collision = None collision = pygame.sprite.spritecollideany( warship_missilex, enemy_missile_group) if collision != None: if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision): enemy_missile_group.remove(collision) flameposition = warship_missilex.position addNewFlame(flameposition) # warship missile & player missile collision detect collision = None collision = pygame.sprite.spritecollideany( warship_missilex, missile_group) if collision != None: if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision): missile_group.remove(collision) flameposition = warship_missilex.position addNewFlame(flameposition) # warship missile & player collision detect collision = None collision = pygame.sprite.spritecollideany( warship_missilex, player_group) if collision != None: if pygame.sprite.collide_circle_ratio(0.65)(warship_missilex, collision): playerHealth -= 10 warship_missile_group.remove(warship_missilex) flameposition = warship_missilex.position addNewFlame(flameposition) # add random enenmy chopper badtimer -= 1 if badtimer == 0: chopper = MySprite() chopper.load("resources/images/enemychopper.png", 173, 60, 4) chopper.position = 1024, rint(0, 400) c