import pygame
import random
CREATE_ENEMY_EVENT = pygame.USEREVENT
HERO_FIRE_EVENT = pygame.USEREVENT + 1
ENEMY_FIRE_EVENT = pygame.USEREVENT + 2
class BaseSprite(pygame.sprite.Sprite):
def __init__(self,image,speed=0):
super().__init__()
self.image = pygame.image.load(image)
self.rect = self.image.get_rect()
self.speed = speed
def update(self):
self.rect.y -= self.speed
class BackGround(BaseSprite):
def __init__(self,image,isUP=True,speed=1):
super().__init__(image,speed)
if isUP:
self.rect.y = -self.rect.height
self.rect.x = 0
else:
self.rect.y = 0
self.rect.x = 0
def update(self):
self.rect.y += self.speed
if self.rect.y > self.rect.height:
self.rect.y = -self.rect.height
class Enemy(BaseSprite):
def __init__(self,image,speed=1):
super().__init__(image,speed)
self.rect.y = -self.rect.height
self.speed = random.randint(2,4)
self.rect.x = random.randint(0,423)
self.bullet_group = pygame.sprite.Group()
pass
def update(self):
self.rect.y += self.speed
if self.rect.y > 700:
self.kill()
def fire(self):
# print("敌机发射子弹")
bullet2 = Bullet('./images/ebullet.png')
bullet2.rect.centerx = self.rect.centerx
bullet2.rect.y = self.rect.y + 35
bullet2.speed = self.speed -1
self.bullet_group.add(bullet2)
pass
class Hero(BaseSprite):
def __init__(self,image,speed=0):
super().__init__(image,speed)
self.rect.centerx = 240
self.rect.y = 700-120-126
self.bullet_group = pygame.sprite.Group()
def update(self):
self.rect.x += self.speed
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.x > 480-102:
self.rect.x = 480-102
def fire(self):
#print('英雄发射了两颗子弹')
bullet = Bullet('./images/hbullet.png')
bullet.rect.centerx = self.rect.centerx
bullet.rect.y = self.rect.y - 35
bullet1 = Bullet('./images/hbullet.png')
bullet1.rect.centerx = self.rect.centerx
bullet1.rect.y = self.rect.y - 45
self.bullet_group.add(bullet,bullet1)
pass
class Bullet(BaseSprite):
def __init__(self,image,speed=1):
super().__init__(image,speed)
pass
def update(self):
self.rect.y -= self.speed
if self.rect.y < - self.rect.height:
self.kill()
class MainGame():
def create_sprites(self):
bg1 = BackGround('./images/bg.png')
bg2 = BackGround('./images/bg.png',isUP=False)
self.backgroup = pygame.sprite.Group(bg1,bg2)
self.hero = Hero('./images/hero.png')
pygame.time.set_timer(HERO_FIRE_EVENT,500)
self.herogroup = pygame.sprite.Group(self.hero)
self.enemy = Enemy('./images/enemy.png')
pygame.time.set_timer(ENEMY_FIRE_EVENT,3000)
pygame.time.set_timer(self.CREATE_ENEMY_EVENT, 1000)
self.enemygroup = pygame.sprite.Group()
def __init__(self):
screen_rect = pygame.Rect(0,0,480,700)
self.screen = pygame.display.set_mode((screen_rect.width,screen_rect.height),0,32)
self.clock = pygame.time.Clock()
self.CREATE_ENEMY_EVENT = pygame.USEREVENT
self.create_sprites()
print('游戏初始化完成')
def event_handler(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
elif event.type == self.CREATE_ENEMY_EVENT:
#print('创建敌机')
enemy = Enemy('./images/enemy.png')
self.enemygroup.add(enemy)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self.hero.speed = -3
elif event.key == pygame.K_RIGHT:
self.hero.speed = 3
else:
self.hero.speed = 0
if event.type == HERO_FIRE_EVENT:
self.hero.fire()
else:
self.enemy.speed = 0
if event.type == ENEMY_FIRE_EVENT:
self.enemy.fire()
def check_collide(self):
pygame.sprite.groupcollide(self.hero.bullet_group,self.enemygroup,True,True)
pygame.sprite.groupcollide(self.hero.bullet_group, self.enemy.bullet_group, True, True)
enemy_count = pygame.sprite.spritecollide(self.hero,self.enemygroup,True)
for event in self.enemy.bullet_group:
bullet_count = pygame.sprite.spritecollide(self.hero,self.enemy.bullet_group,True)
if len(bullet_count) > 0:
self.hero.kill()
pygame.quit()
exit()
if len(enemy_count)>0:
self.hero.kill()
pygame.quit()
exit()
pass
def update_draw_sprites(self):
for group in [self.backgroup,self.enemygroup,self.enemy.bullet_group,self.herogroup,self.hero.bullet_group]:
group.update()
group.draw(self.screen)
def start_game(self):
while True:
self.clock.tick(60)
self.event_handler()
self.check_collide()
self.update_draw_sprites()
pygame.display.update()
if __name__=='__main__':
game = MainGame()
game.start_game()
相似问题