python项目:飞机大战已封装(第一部分)第二部分在飞机大战专辑,后期合并

本文介绍了使用Python的pygame库开发的一款飞机大战游戏,包括英雄机子弹的类定义、敌机子弹、英雄机主类的构造函数和移动控制方法,以及游戏窗口设置和子弹碰撞检测机制。
摘要由CSDN通过智能技术生成

资源

图片资源已经展示在了顶部

游戏窗口属性

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 方法来在屏幕上绘制子弹。

    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)如果被敌机击中则敌机子弹消失防止子弹穿模

  • 41
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值