资源
图片资源已经展示在了顶部
游戏窗口属性
import random
import time
import pygame
# 初始化游戏
pygame.init()
# 创建游戏窗口
screen = pygame.display.set_mode((480, 650)) # 创建一个480x500的窗口
# 修改游戏的名称和图标
pygame.display.set_caption("飞机大战") # 设置游戏窗口标题为"飞机大战"
icon = pygame.image.load("img/icon.png") # 加载游戏图标
pygame.display.set_icon(icon) # 设置游戏图标
# 加载背景图片
bg_img = pygame.image.load('img/background.png')
上面我们用import进行了导包以方便后期调用,并用pygame.init()进行了初始化,pygame的所有使用都需要初始化,然后用pygame.display.set_mode创建游戏总画布注意总画布大小要与背景图相关联
英雄机子弹的类定义
class HeroBullet:
"""英雄精灵子弹的类"""
def __init__(self,x,y,screen):
self.x = x
self.y = y
self.show = screen
self.pic = pygame.image.load("img/bullet1.png")
英雄子弹类解析
在许多射击游戏中,子弹类是基本的组成部分之一,用于处理子弹的生成、移动以及渲染。以下是一个简单的英雄子弹类的实现。
类定义和功能
HeroBullet 类定义了一个英雄飞机发射的子弹的基本属性和方法。
构造函数 init
构造函数是类的初始化方法,用于在创建类的新实例时设置对象的初始状态。
x 和 y:这两个参数定义了子弹在屏幕上的初始位置。这通常是英雄飞机的位置或者稍微偏移的位置,以便子弹能从飞机的枪口处发射。
screen:这个参数代表了游戏的显示屏幕,子弹将在这个屏幕上被绘制。通常这个对象来自于pygame的显示模块。
pic:这是子弹的图像,使用 pygame.image.load(“img/bullet1.png”) 加载。这个图像代表了子弹的视觉样式。
构造函数中的 self.x, self.y, self.show, 和 self.pic 是实例变量,它们存储每个子弹对象的状态。这些变量随后可以被其他方法如绘制和移动方法使用,以便在游戏中正确地显示和更新子弹的位置。
# 画子弹
def draw(self):
self.show.blit(self.pic, (self.x, self.y))
self.move()
self.show.blit(self.pic, (self.x, self.y)): 这行代码是将对象的图像绘制到屏幕上的关键步骤:
self.show:这可能是对显示表面或屏幕对象的引用,用于指定图像需要被绘制的位置。
self.pic:这是需要显示的对象的图像。在游戏中,这通常是一个由图像文件加载而成的图形对象。
(self.x, self.y):这是一个元组,表示图像在显示表面上的坐标位置。这些坐标决定了图像在屏幕上的位置。
self.move(): 这行代码调用同一个对象的 move 方法:
self.move():这个方法负责更新对象的位置。它可能会修改 self.x 和 self.y 的值,这影响了下一次调用 draw 时对象将被绘制的位置。这是创建移动动画的关键。
# 子弹移动
def move(self):
self.y -= 5
每次调用使子弹y坐标减5这样子弹就可以从英雄机发出向上射击了,注意咱们0,0坐标在左上角
敌机子弹定义
class DiBullet:
def __init__(self,x,y,screen):
self.x = x
self.y = y
self.show = screen
self.pic = pygame.image.load("img/bullet2.png")
同理
# 画子弹
def draw(self):
self.show.blit(self.pic,(self.x,self.y))
self.move()
同理
# 子弹移动
def move(self):
self.y += 5
定义英雄机主类
构造函数 init()与创建HeroPlane类
class HeroPlane():
"""英雄战机类"""
def __init__(self,x,y,screen):
self.x = x
self.y = y
self.show = screen
# 英雄机设置
# 加载背景图片
self.bg_img = pygame.image.load('img/background.png')
# 加载英雄机
self.hero_plane1 = pygame.image.load('img/me2.png')
self.hero_plane2 = pygame.image.load('img/me1.png')
self.hero_rect = pygame.Rect(190, 526, 66, 80) # 创建一个矩形表示英雄机的位置和大小
self.heroPlaneX = self.hero_rect.x # 英雄机的x坐标
self.heroPlaneY = self.hero_rect.y # 英雄机的y坐标
# 定义图片切换索引
self.hero_imgindex = 0
# 战机子弹列表
self.hero_Bulletlist = []
# 战机爆炸条件
self.hero_bomb = False
# 战机爆炸索引
self.hero_bomb_index = 0
# 定义英雄子弹
# 加载英雄机爆炸图片
self.hero_bomb_img = ['img/me_destroy_1.png',
'img/me_destroy_2.png',
'img/me_destroy_3.png',
'img/me_destroy_4.png']
draw方法
def draw(self):
if self.hero_bomb == False:
# 显示战机
if self.hero_bomb_index == 0:
screen.blit(self.hero_plane1, (self.x, self.y))
self.hero_bomb_index = 1
else:
screen.blit(self.hero_plane2, (self.x, self.y))
self.hero_bomb_index = 0
else:
if self.hero_bomb_index == len(self.hero_bomb_img):
time.sleep(0.22)
exit()
self.hero_bomb_imgs = pygame.image.load(self.hero_bomb_img[self.hero_bomb_index])
screen.blit(self.hero_bomb_imgs, (self.x, self.y))
self.hero_bomb_index += 1
time.sleep(0.2)
用切换图片的方法使战机尾部喷火
战机正常飞行时的绘制:
if self.hero_bomb == False: 这个条件判断战机是否处于未爆炸状态。
在未爆炸状态下,代码会在两个战机图像 (self.hero_plane1 和 self.hero_plane2) 之间切换,以创建飞行的动画效果。
self.hero_bomb_index 用作切换图像的索引。
战机爆炸时的绘制:
else: 这部分处理当 self.hero_bomb 为 True 时的情况,即战机被击中并开始爆炸。
if self.hero_bomb_index == len(self.hero_bomb_img): 检查是否所有的爆炸图像都已显示完毕,如果是,则暂停一段时间后退出程序。
self.hero_bomb_imgs = pygame.image.load(self.hero_bomb_img[self.hero_bomb_index]): 加载当前爆炸图像。
screen.blit(self.hero_bomb_imgs, (self.x, self.y)): 在屏幕上绘制爆炸图像。
self.hero_bomb_index += 1: 更新爆炸图像索引以在下一帧显示下一个图像。
time.sleep(0.2): 每次更新图像后暂停0.2秒,以放慢爆炸动画的播放速度。
英雄机的移动和控制方法 xunghuang()
def xunghuang(self,event_list):
# 战机底部飞入
self.y -= 2
if self.y <= 0:
self.y = 500
self.y -= 2: 这行代码使得战机的垂直位置(y 坐标)每次调用该方法时下降 2 个单位。这意味着战机会向屏幕顶部移动。
if self.y <= 0: 检查战机是否已经移动到屏幕顶部(或者超出屏幕顶部)。因为y坐标越小表示越接近屏幕顶部。
self.y = 500: 如果战机已经到达或超出屏幕顶部,这行代码会将战机的y坐标重新设置到 500。
# 获取所有监听事件
self.event_list = pygame.event.get()
# 获取窗口退出事件
for event in event_list:
if event.type == pygame.QUIT:
print("游戏结束了")
# 卸载模块
pygame.quit()
exit(0)
pygame.quit(): 调用 pygame.quit() 来卸载所有的 Pygame 模块,是一个清理操作,确保Pygame资源被正确释放。
# 战机移动
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self.x = self.x - 10 if self.x >= 5 else 0
elif event.key == pygame.K_RIGHT:
self.x = self.x + 10 if self.x <= 370 else 380
elif event.key == pygame.K_UP:
self.y = self.y - 10 if self.y >= 5 else 0
elif event.key == pygame.K_DOWN:
self.y = self.y + 20 if self.y <= 521 else 526
elif event.key == pygame.K_SPACE: # 控制英雄机发射子弹
hero_bullet = HeroBullet(self.x + 40 + 10, self.y - 11, screen)
self.hero_Bulletlist.append(hero_bullet)
#
# 调用函数画出战机子弹并判断子弹是否相交
for bullet in self.hero_Bulletlist:
bullet.draw()
代码分析
战机移动:
通过检测键盘的按键事件 (pygame.KEYDOWN) 来移动战机。根据按下的键(左、右、上、下),更新战机的位置 (self.x, self.y)。
每个方向的移动都有边界检查,以防战机移动出屏幕。例如,当向左移动时,战机的 x 坐标会减少,但不会低于 0(self.x = self.x - 10 if self.x >= 5 else 0)。
射击逻辑:
当检测到空格键 (pygame.K_SPACE) 被按下时,创建一个新的子弹实例 (HeroBullet) 并将其添加到 self.hero_Bulletlist 列表中,用于管理所有活动的子弹。
子弹的初始位置根据战机的当前位置 (self.x, self.y) 加上一定的偏移来确定,这样子弹就会从战机的前端发射。
最后遍历 self.hero_Bulletlist 列表,调用每个子弹的 draw 方法来在屏幕上绘制子弹。文章来源:https://www.toymoban.com/news/detail-854844.html
def jiangchepz(self,hero_Bulletlist):
hero_rect = pygame.rect.Rect(self.x, self.y, 102, 126)
for bullet in hero_Bulletlist:
# 定义战机子弹的rect
bullet_rect = pygame.rect.Rect(bullet.x, bullet.y, 5, 12)
# 检测敌机和子弹矩形是否相交
flag = bullet_rect.colliderect(hero_rect)
# 如果相交
if flag:
print("你输了")
self.hero_bomb = True
hero_Bulletlist.remove(bullet)
用hero_rect 装载战机长宽,hero_Bulletlist.remove(bullet)如果被敌机击中则敌机子弹消失防止子弹穿模文章来源地址https://www.toymoban.com/news/detail-854844.html
到了这里,关于python项目:飞机大战已封装(第一部分)第二部分在飞机大战专辑,后期合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!