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

这篇具有很好参考价值的文章主要介绍了python项目:飞机大战已封装(第一部分)第二部分在飞机大战专辑,后期合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

资源

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

游戏窗口属性

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)如果被敌机击中则敌机子弹消失防止子弹穿模文章来源地址https://www.toymoban.com/news/detail-854844.html

到了这里,关于python项目:飞机大战已封装(第一部分)第二部分在飞机大战专辑,后期合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL学习-第一部分

    MySQL数据库 MySQL是一个**关系型数据库管理系统****,**由瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用

    2024年02月15日
    浏览(52)
  • 6.播放音频(第一部分)

    这一章将对播放音频的具体内容做讲解。我的想法是按照tinyalsa中的例子作为讲解的范本,因为tinyalsa足够简单,很多时候都忽略了它的细节。趁着这个机会再整理一下tinyalsa的内容。我使用的tinyalsa从https://github.com/tinyalsa/tinyalsa下载,从examples/writei.c开始。 其中函数read_file从

    2023年04月08日
    浏览(38)
  • 第一部分:Spark基础篇

    第一部分:Spark基础篇_奔跑者-辉的博客-CSDN博客 第二部分:Spark进阶篇_奔跑者-辉的博客-CSDN博客 第三部分:Spark调优篇_奔跑者-辉的博客-CSDN博客 第一部分:Flink基础篇_奔跑者-辉的博客-CSDN博客 (*建议收藏*) 实时数仓之 Kappa 架构与 Lambda 架构_奔跑者-辉的博客-CSDN博客(*建议收

    2024年02月05日
    浏览(48)
  • 第一部分-基础篇-第一章:PSTN与VOIP(下篇)

      学习资料来源《FreeSWITCH权威指南》-作者杜金房这本书。我是2022年6月毕业的,偶然的机会接触到FreeSWITCH,但是目前在南京从事java后端开发,FreeSWITCH纯属个人爱好,进行笔记整理。也一直希望有机会可以参与FreeSWITCH相关工作开发,如有需要,请联系我18956043585,先说声谢

    2024年02月06日
    浏览(56)
  • HTML学习 第一部分(前端学习)

    参考学习网站: 网页简介 (w3schools.com) 我的学习思路是:网站+实践+视频。 视频很重要的,因为它会给你一种开阔思路的方式。你会想,噢!原来还可以这样。这是书本或者网站教程 所不能教给你的。而且,对一些教程,它的用法你可能 在工作或者以后都用不上,这种情况下

    2024年02月15日
    浏览(50)
  • Mysql入门基础教程(第一部分)

    MySQL基础教程解释了一些基本的SQL语句。如果这是您第一次使用关系数据库管理系统,本教程将为您提供使用MySQL数据库服务器所需的一切,例如查询数据,更新数据,管理数据库和创建表。 如果您已经熟悉其他关系数据库管理系统(如PostgreSQL,Oracle或Microsoft SQL Server等),

    2024年04月14日
    浏览(39)
  • python+pygame之飞机大战-第一版源代码分析

    目录 一、源代码 二、源代码梳理分析: (一)代码的主要结构 1、引用需要的模块 2、定义的类 3、定义main()函数:主程序 (二)代码分析收获 最好的学习方法是学习别人的代码,加上自己以前比较喜欢雷电这款游戏,所以就从飞机大战入手了,从网上下的源代码和图片素材

    2023年04月10日
    浏览(41)
  • 字符串---第一部分 序列、字串;上升,公共

    第一部分 最长上升子序列,最长上升子串,最长公共子序列,最长公共子串--dp 第二部分 KMP,trie,双指针 第三部分 待定 动态规划:审题,状态确定,状态转移,边界条件 线性DP 最长上升子序列 403 线性DP 最长上升子序列【动态规划】_哔哩哔哩_bilibili 给定一个无序整数数组

    2024年02月07日
    浏览(49)
  • 阿里服务器怎么用教程[第一部分]

    第一步,登录我们的阿里云账号。   第二步,根据自己的具体情况,选择好服务器的配置,比如你是大型企业,预估网站访问量很大,那么就要选配置较好的服务器,如果是个人网站,预估流量较小,就可以选择配置较低的云服务器。   第三步,购买好云服务器后,我们在

    2024年02月10日
    浏览(48)
  • 【OpenCV入门】第一部分——图像处理基础

    图像处理包括4个基本操作: 读取图像 、 显示图像 、 保存图像 和 获取图像属性 。 imread() filename :目标图像的完整路径名。 flags :图像的颜色类型的标记,有0和1两个值,其中1为默认值。当读取一幅彩色图像时,如果想要得到一幅 彩色图像 ,那么flags的值为1(此时flags的

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包