效果图:
代码:
# coding:UTF-8
import pygame
from pygame import locals
from sys import exit
from pygame.sprite import Sprite,Group
import random , time , math
class BGSprite(Sprite): #背景精灵
def __init__(self,imagepath):
super().__init__()
self.image = pygame.image.load(imagepath)
self.rect = self.image.get_rect()
class EnemySprite(Sprite): #敌方战机
def __init__(self,imagepath,pos,speed,screen,movetype,bullettype,hp):
super().__init__()
self.image = pygame.image.load(imagepath)
# self.image = self.image.subsurface(rect)
self.rect = self.image.get_rect()
self.rect.x = pos[0]
self.rect.y = pos[1]
self.speed = speed
self.xspeed = random.randint(0,speed+1) * movetype
self.timer = 0
self.timer2 = 3
self.bulletgroup = Group()
self.screen = screen
self.bullettype = bullettype
self.hp = hp
def update(self):
self.bulletgroup.update()
self.bulletgroup.draw(self.screen)
if self.bullettype == 0:
self.timer += 0.01
if self.timer > 1:
# print("敌机发射子弹")
bullet = EnemyBulletSprite("images/bullet/enemy_bullet1.png", [self.rect.x + 40, self.rect.y + 39.5],
-2, 0)
bullet2 = EnemyBulletSprite("images/bullet/enemy_bullet1.png", [self.rect.x + 40, self.rect.y + 39.5],
-2, -1)
bullet3 = EnemyBulletSprite("images/bullet/enemy_bullet1.png", [self.rect.x + 40, self.rect.y + 39.5],
-2, 1)
self.bulletgroup.add(bullet)
self.bulletgroup.add(bullet2)
self.bulletgroup.add(bullet3)
self.timer = 0
else:
self.timer += 0.01
self.timer2 += 0.01
if self.timer > 1:
bullet = EnemyBulletSprite("images/bullet/enemy_bullet2.png", [self.rect.x + 40, self.rect.y + 39.5],-2, -1)
bullet2 = EnemyBulletSprite("images/bullet/enemy_bullet2.png", [self.rect.x + 120, self.rect.y + 39.5],-2, 1)
self.bulletgroup.add(bullet)
self.bulletgroup.add(bullet2)
self.timer = 0
if self.timer2 > 4: #BOSS发射导弹
bullet = EnemyBulletSprite("images/bullet/boss_bullet.png", [self.rect.x + 80, self.rect.y + 39.5],-2, 0)
self.bulletgroup.add(bullet)
self.timer2 = 0
self.rect.y += self.speed
self.rect.x += self.xspeed
if self.rect.x > 400:
self.xspeed *= -1
self.rect.x += self.xspeed
if self.rect.x < 0:
self.xspeed *= -1
self.rect.x += self.xspeed
if self.rect.y > 800:
self.kill()
def bomb(self):
bombimages = ["images/boom/boom01.png",
"images/boom/boom02.png",
"images/boom/boom03.png",
"images/boom/boom04.png",
"images/boom/boom05.png",
"images/boom/boom06.png",
]
for i in bombimages :
self.screen.blit(pygame.image.load(i),(self.rect.x,self.rect.y))
time.sleep(0.005)
pygame.display.update()
self.kill()
class BulletHelp(Sprite): #补给品
def __init__(self,imagepath,rect,pos,speed,screen,movetype):
super().__init__()
self.image = pygame.image.load(imagepath)
self.image = self.image.subsurface(rect)
self.rect = self.image.get_rect()
self.rect.x = pos[0]
self.rect.y = pos[1]
self.speed = speed
self.xspeed = random.randint(0, speed) * movetype
self.screen = screen
def update(self):
self.rect.y += self.speed
self.rect.x += self.xspeed
if self.rect.x > 400:
self.xspeed *= -1
self.rect.x += self.xspeed
if self.rect.x < 0:
self.xspeed *= -1
self.rect.x += self.xspeed
if self.rect.y > 800:
self.kill()
class BulletSprite(Sprite): #玩家子弹精灵租
def __init__(self,imagepath,pos,speed,direction):
super().__init__()
self.image = pygame.image.load(imagepath)
# self.image = self.image.subsurface(rect)
self.rect = self.image.get_rect()
self.rect.x = pos[0]
self.rect.y = pos[1]
self.speed = speed
self.dir = direction
def move(self):
if self.dir == 0:
self.rect.y -= self.speed
elif self.dir > 0 :
self.rect.y -= self.speed * math.sin(self.dir)
self.rect.x -= self.speed * math.cos(self.dir+90)
else:
self.rect.y -= self.speed * math.sin(self.dir * -1 )
self.rect.x += self.speed * math.cos(self.dir * -1 + 90)
if self.rect.y < -50:
self.kill()
def update(self):
self.move()
class EnemyBulletSprite(Sprite): #敌机子弹精灵组
def __init__(self,imagepath,pos,speed,direction):
super().__init__()
self.image = pygame.image.load(imagepath)
# self.image = self.image.subsurface(rect)
self.rect = self.image.get_rect()
self.rect.x = pos[0]
self.rect.y = pos[1]
self.speed = speed
self.dir = direction
def move(self):
self.rect.y -= self.speed
if self.rect.y < -50:
self.kill()
def move2(self):
self.rect.y -= self.speed
self.rect.x -= self.speed/2
if self.rect.y < -50:
self.kill()
def move3(self):
self.rect.y -= self.speed
self.rect.x += self.speed/2
if self.rect.y < -50:
self.kill()
def update(self): #子弹发射方向
if self.dir == 0:
self.move()
elif self.dir == -1:
self.move2()
elif self.dir == 1:
self.move3()
class PlayerSprite(Sprite): #玩家战机
def __init__(self,imagepath,rect,pos,speed,screen):
super().__init__()
self.image = pygame.image.load(imagepath)
self.image = self.image.subsurface(rect)
self.rect = self.image.get_rect()
self.rect.x = pos[0]
self.rect.y = pos[1]
self.speed = speed
self.screen = screen
self.bulletgroup = Group()
self.score = 0
self.hp = 10000
self.timer = 0
# self.canfire = False
self.bullettype = 0
self.bulletnum = 10
def move(self):
keys = pygame.key.get_pressed()
if keys[locals.K_RIGHT]:
self.rect.x += self.speed
if self.rect.x > 412:
self.rect.x = 412
if keys[locals.K_LEFT]:
self.rect.x -= self.speed
if self.rect.x < 0:
self.rect.x = 0
if keys[locals.K_UP]:
self.rect.y -= self.speed
if self.rect.y < 0:
self.rect.y = 0
if keys[locals.K_DOWN]:
self.rect.y += self.speed
if self.rect.y > 702:
self.rect.y = 702
def fire(self):
self.timer += 1
if self.timer > 50:
self.timer = 0
if self.bullettype == 0:
bullet = BulletSprite("images/bullet/bullet1.png", [self.rect.x + 45, self.rect.y - 20], 6,0)
self.bulletgroup.add(bullet)
elif self.bullettype == 1:
bullet = BulletSprite("images/bullet/bullet1.png", [self.rect.x + 30, self.rect.y - 20], 6,0)
bullet2 = BulletSprite("images/bullet/bullet1.png", [self.rect.x + 60, self.rect.y - 20], 6,0)
self.bulletgroup.add(bullet)
self.bulletgroup.add(bullet2)
elif self.bullettype == 2:
bullet = BulletSprite("images/bullet/bullet1.png", [self.rect.x + 30, self.rect.y - 20], 6,0)
bullet2 = BulletSprite("images/bullet/bullet1.png", [self.rect.x + 60, self.rect.y - 20], 6,0)
bullet3 = BulletSprite("images/bullet/bullet3r.png", [self.rect.x + 60, self.rect.y - 20], 6,15)
bullet4 = BulletSprite("images/bullet/bullet3l.png", [self.rect.x + 28, self.rect.y - 20], 6,-15.076)
bullet5 = BulletSprite("images/bullet/bullet4r.png", [self.rect.x + 60, self.rect.y - 20], 6,45.5)
bullet6 = BulletSprite("images/bullet/bullet4l.png", [self.rect.x + 25, self.rect.y - 20], 6,-45.5)
self.bulletgroup.add(bullet)
self.bulletgroup.add(bullet2)
self.bulletgroup.add(bullet3)
self.bulletgroup.add(bullet4)
self.bulletgroup.add(bullet5)
self.bulletgroup.add(bullet6)
self.bulletnum -= 1
if self.bulletnum <= 0:
self.bullettype = 1
def update(self):
self.bulletgroup.update()
self.bulletgroup.draw(self.screen)
self.move()
self.fire()
CREATE_ENEMY = locals.USEREVENT + 1
CREATE_BOSS = locals.USEREVENT + 2
CREATE_BULLET_HELP = locals.USEREVENT + 3
def main():
pygame.init()
pygame.display.set_caption("雷霆战机")
screen = pygame.display.set_mode((512,768))
bggroup = Group()
bgsprite = BGSprite("images/bg/bg0.jpg")
bggroup.add(bgsprite)
playergroup = Group()
playersprite = PlayerSprite("images/hero/hero_b_03.png",[0,0,122,105],[bgsprite.rect.w/2 - 61 ,600],5,screen)
playergroup.add(playersprite)
enemygroup = Group()
bullethelpgroup = Group()
bossgroup = Group()
pygame.time.set_timer(CREATE_ENEMY,random.randint(500,1000))
pygame.time.set_timer(CREATE_BOSS, random.randint(3000, 5000))
pygame.time.set_timer(CREATE_BULLET_HELP,random.randint(3000,5000))
font = pygame.font.Font(None,32)
while True:
bggroup.update()
bggroup.draw(screen)
playergroup.update()
playergroup.draw(screen)
enemygroup.update()
enemygroup.draw(screen)
bossgroup.update()
bossgroup.draw(screen)
bullethelpgroup.update()
bullethelpgroup.draw(screen)
screen.blit(font.render("Score:"+str(playersprite.score) , True,(255, 0, 0)),(20,20))
screen.blit(font.render("HP:" + str(playersprite.hp), True, (255, 0, 0)), (20, 60))
pygame.display.update()
check1 = pygame.sprite.groupcollide(playersprite.bulletgroup,enemygroup,True,False)#碰撞检测 销毁子弹 销毁敌机
if check1:
enemy.hp -= 1
if enemy.hp <= 0:
list(check1.values())[0][0].bomb()
playersprite.score += 100
check11 = pygame.sprite.groupcollide(playersprite.bulletgroup, bossgroup, True, False) # 碰撞检测 销毁子弹 销毁敌机
if check11:
boss.hp -= 1
if boss.hp <= 0:
list(check11.values())[0][0].bomb()
playersprite.score += 500
check2 = pygame.sprite.groupcollide(playergroup,enemygroup,False,True)
if check2:
list(check2.values())[0][0].bomb()
playersprite.hp -= 1
check22 = pygame.sprite.groupcollide(playergroup, bossgroup, False, True)
if check22:
list(check22.values())[0][0].bomb()
playersprite.hp -= 1
#print(enemygroup)
for enemy in enemygroup:
check3 = pygame.sprite.groupcollide(playergroup,enemy.bulletgroup,False,True)
if check3:
playersprite.hp -= 1
#playersprite.bullettype = 0
for boss in bossgroup:
check33 = pygame.sprite.groupcollide(playergroup,boss.bulletgroup,False,True)
if check33:
playersprite.hp -= 1
#playersprite.bullettype = 0
if playersprite.hp <= 0:
playersprite.kill()
check4 = pygame.sprite.groupcollide(playergroup,bullethelpgroup,False,True)
if check4:
if playersprite.bullettype <= 1:
playersprite.bullettype += 1
playersprite.bulletnum = 10
else:
playersprite.bulletnum = 10
playersprite.fire()
for event in pygame.event.get():
# if event.type == locals.KEYUP:
# if event.key == locals.K_SPACE:
# playersprite.fire()
if event.type == locals.QUIT:
pygame.quit()
exit()
if event.type == CREATE_ENEMY:
enemy = EnemySprite("images/enemy/enemy2.png",[random.randint(0,410),-50],2,screen,random.randrange(-1,1,2),0,1)
enemygroup.add(enemy)
if event.type == CREATE_BOSS:
boss = EnemySprite("images/enemy/boss.png", [random.randint(0, 410), -50], 1,screen, 0,1,15)
bossgroup.add(boss)
if event.type == CREATE_BULLET_HELP:
bullethelp = BulletHelp("images/hero/supply.png",[0,0,40,41],[random.randint(0,410),-50],2,screen,random.randrange(-1,1,2))
bullethelpgroup.add(bullethelp)
if __name__ == '__main__':
main()
素材源码打包:https://pan.baidu.com/s/1YLn1FZ2IXBxIs53x8pqlrw 提取码: m28g