飞机大战基础参考:
pygame学习笔记——飞机大战练习案例_小橙子的博客-CSDN博客
爆炸效果思路:
当子弹和敌机碰撞时,爆炸效果图片移到子弹的坐标,展示爆炸效果。
展示爆炸效果需要用到多线程,防止对主线程进行干扰。
多线程参考:
python学习笔记——多线程_小橙子的博客-CSDN博客
注:以下爆炸效果使用两张图片代替
#7.创建爆炸效果
class BaoZha(pygame.sprite.Sprite):
def __init__(self,xy):
pygame.sprite.Sprite.__init__(self) # 调用父类的初始化方法
#爆炸效果可能是多张图片,使用列表保存
self.image = [pygame.Surface((30, 50)),pygame.Surface((50, 30))]
self.image[0].fill('blue')
self.image[1].fill('pink')
#使用列表中第一个图片的位置
self.rect = self.image[0].get_rect()
# 设置初始位置
self.rect.center = xy
def update(self):
for i in range(10):
#使用余数切换不同的图片
screen_surface.blit(self.image[i%2], self.rect.center)
pygame.display.flip()#切换完图片,更新屏幕
time.sleep(0.1)
self.kill() # 终止,相当于删除特效
#print(a[0].rect.center)#获得碰撞子弹的坐标
bz = BaoZha(a[0].rect.center)#创建一个爆炸效果对象
#因为update中有for循环且有等待效果,防止干扰主线程
_thread.start_new_thread(bz.update,tuple())#创建一个线程
完成的测试代码:
import pygame, sys
import random,time
import _thread
# 1.pygame库的初始化
pygame.init()
# 2.设置窗口
screen_surface = pygame.display.set_mode((480, 600))
# 4.创建一个飞机
class Plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self) # 调用父类的初始化方法
# super().__init__(self)#此方式调用不管事,原因未知
self.image = pygame.Surface((50, 50))
self.image.fill('green')
self.rect = self.image.get_rect()
# 设置初始位置
self.rect.center = (screen_surface.get_width() / 2, screen_surface.get_height() - 20)
def update(self):
# 获取键盘事件,如果按下,返回True
keys = pygame.key.get_pressed() # 类似字典,通过key获取value
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect = self.rect.move(-10, 0)
if keys[pygame.K_RIGHT] and self.rect.right < screen_surface.get_width():
self.rect = self.rect.move(10, 0)
if keys[pygame.K_UP] and self.rect.top > 0:
self.rect = self.rect.move(0, -10)
if keys[pygame.K_DOWN] and self.rect.bottom < screen_surface.get_height():
self.rect = self.rect.move(0, 10)
screen_surface.blit(self.image, self.rect) # 屏幕上 放 飞机,位置是rect的位置
# 5.创建一个子弹类Bullet
class Bullet(pygame.sprite.Sprite):
def __init__(self, center): # center是初始位置,传入坦克的中心
pygame.sprite.Sprite.__init__(self) # 调用父类的初始化方法
self.image = pygame.Surface((10, 30))
self.image.fill('yellow')
self.rect = self.image.get_rect()
# 设置初始位置 初始位置要在飞机处——>外部传进
self.rect.center = center
def update(self):
# 获取键盘事件,如果按下,返回True
self.rect = self.rect.move(0, -20)
screen_surface.blit(self.image, self.rect)
if self.rect.top < 0: # 判断是否出屏幕
self.kill() # 终止,相当于删除子弹
# 6.创建敌机
class Enemy_plane(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self) # 调用父类的初始化方法
# super().__init__(self)#此方式调用不管事,原因未知
self.image = pygame.Surface((50, 50))
self.image.fill('red')
self.rect = self.image.get_rect()
# 设置初始位置
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
def update(self):
self.rect = self.rect.move((0, 10))
if self.rect.y > screen_surface.get_height():
x = random.randint(0, screen_surface.get_width())
y = 0
self.rect.center = (x, y)
screen_surface.blit(self.image, self.rect) # 屏幕上 放 飞机,位置是rect的位置
#7.创建爆炸效果
class BaoZha(pygame.sprite.Sprite):
def __init__(self,xy):
pygame.sprite.Sprite.__init__(self) # 调用父类的初始化方法
#爆炸效果可能是多张图片,使用列表保存
self.image = [pygame.Surface((30, 50)),pygame.Surface((50, 30))]
self.image[0].fill('blue')
self.image[1].fill('pink')
#使用列表中第一个图片的位置
self.rect = self.image[0].get_rect()
# 设置初始位置
self.rect.center = xy
def update(self):
for i in range(10):
#使用余数切换不同的图片
screen_surface.blit(self.image[i%2], self.rect.center)
pygame.display.flip()#切换完图片,更新屏幕
time.sleep(0.1)
self.kill() # 终止,相当于删除特效
# 创建一架飞机
plane_surface = Plane()
# 创建一个 子弹 精灵组(用于存放所有的精灵对象)
bullet_sprite = pygame.sprite.Group()
# 创建敌机
enemy_plane_surface = Enemy_plane()
score = 0 # 存储得分
clock = pygame.time.Clock()
# 3.游戏的主循环(事件的监听,数据的修改及绘图,界面的更新)
while True:
# 3.1 事件的监听,关闭按钮无法使用。
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# 按下一个空格,创建一个子弹对象
bullet_surface = Bullet(plane_surface.rect.center)
bullet_sprite.add(bullet_surface)
# 3.2 数据的修改及绘图
screen_surface.fill((0, 0, 0)) # 重新绘制背景
# 3.2 飞机修改数据 更新画面
plane_surface.update() # 修改数据+更新画面
# 3.2 子弹更新数据 更新画面
bullet_sprite.update() # 修改数据+更新画面
# 3.2 敌机更新数据 更新画面
enemy_plane_surface.update()
a = pygame.sprite.spritecollide(enemy_plane_surface, bullet_sprite, True)
if a:
#print(a[0].rect.center)#获得碰撞子弹的坐标
bz = BaoZha(a[0].rect.center)#创建一个爆炸效果对象
#因为update中有for循环且有等待效果,防止干扰主线程
_thread.start_new_thread(bz.update,tuple())#创建一个线程
score += 10
x = random.randint(0, screen_surface.get_width())
y = 0
enemy_plane_surface.rect.center = (x, y)
b = pygame.sprite.collide_rect(enemy_plane_surface, plane_surface) # 返回布尔值
if b:
break
# 实现记录分数
font_name = pygame.font.match_font("黑体") # 2.获得字体文件
font = pygame.font.Font(font_name, 20) # 1.获取font对象(需要字体文件)
# 绘制内容:text为内容,True为是否抗锯齿, WHITE是字体颜色
font_surface = font.render(str(score), True, 'white') # 3.将文字生成 surface对象
screen_surface.blit(font_surface, (screen_surface.get_width() / 2, 10))
# 3.3 界面的更新
pygame.display.flip()
clock.tick(30) # 一秒切换30图片,具体等多长事件,这个方法自己会计算
|