星际争霸之小霸王之小蜜蜂(六)--让子弹飞
目录
前言
一、添加子弹设置
二、创建子弹
三、创建绘制和移动子弹函数
四、让子弹飞
五、效果
总结
前言
小蜜蜂的基本操作已经完成了,现在开始编写子弹的代码了。
一、添加子弹设置
在我的预想里,我们的小蜜蜂既然是一只猫,那么放出的子弹应该是一只猫爪,或者是爪印,一个小梅花也是可以的,但是“大蟒蛇”是画出一个灰色的长方形小方块作为子弹,我们先按照书上的来操作,后期我们自己再升级。
首先跟新setting模块,增加子弹需要的设置的属性值,比如长、宽、颜色、速度等
class Settings():def __init__(self):self.screen_width = 800self.screen_height = 600self.bg_color = (220,220,220)self.ship_speed_factor = 0.1self.bullet_speed_factor = 1self.bullet_width = 1self.bullet_height = 5self.bullet_color = 60,60,60
二、创建子弹
和创建小蜜蜂一样,我们同样的思路,要创建一个子弹的类,每调用一次就会产生一个子弹
import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):def __init__(self,new_setting,screen,ship):super(Bullet,self).__init__()self.screen = screenself.rect = pygame.Rect(0,0,new_setting.bullet_width,new_setting.bullet_hight)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.topself.y = float(self.rect.y)self.color = new_setting.bullet_colorself.speed_factor = new_setting.bullet_speed_factor
上面的代码完成了子弹的属性配置,我们逐条分析下:
1、我们导入的Sprite是pygame的一个类,用于实现精灵。在Pygame中,精灵是一种可以在游戏中显示的对象,可以理解成一个个小图片。精灵类提供了很多有用的方法,可以方便地创建游戏中的精灵对象,而无需手动创建每个图像并将其加载到游戏中。精灵通常用于实现游戏中的角色、物品等元素。例如,你可以使用精灵类来创建一个在游戏中显示的角色,并使其具有移动、跳跃等行为。
为什么叫精灵,就不知道了,网上查解释是有人认为是因为精灵是一种抽象的概念,可以用来表示游戏中的一切能感知时间流逝、具有坐标位置的元素。总之,精灵是一个非常实用的类,可以帮助你更轻松地开发游戏。
2、class Bullet(Sprite)的目的是让Bullet继承Sprite,这意味着Bullet类将具有Sprite类的所有属性和方法,并且还可以添加自己的属性和方法。
3、super()函数是用来调用父类的方法的,结合2的解释,那么super(Bullet,self).__init__()就是调用了Sprite的初始化方法,确保Bullet类能够正确地继承并使用Sprite类的初始化代码。
4、self.rect = pygame.Rect(0,0,new_setting.bullet_width,new_setting.bullet_hight),因为子弹跟小蜜蜂不一样,它不是图片,它需要凭空先创建一个出来,所以在坐标0,0的位置先创建出一个子弹的实例,然后后面再设置属性,将其移动到正确的位置。
三、创建绘制和移动子弹函数
前面我们已经将子弹的基本属性创建好了,如果我们需要使用它们,还需要创建绘制函数和移动函数,我们将代码还是写在bullet模块里。
def update(self):self.y -=self.speed_factorself.rect.y =self.ydef draw_bullet(self):pygame.draw.rect(self.screen,self.color,self.rect)
这里就不解释了,移动为什么这么写,参考小蜜蜂的移动,是为了更好的调解速度。
四、让子弹飞
现在我们已经将子弹的各个属性都准备好了,下面就是调用模块创建子弹对象就行了。有些小伙伴认为那还不简单,在game_functions模块里面加上判断,当按下的键盘键为空格时,产生一颗子弹,这样就能实现发射子弹的效果。
简单的思路确实是这样,但是这只能针对一发子弹,我们可以想象,在实际的游戏过程中,屏幕上的子弹是一发接着一发,都快连成线了,当我们使用上面思路时,每一次创建一个新子弹都会覆盖掉前面的一发子弹,屏幕上只会有一发子弹。因此我们要用到sprite中的Group类。
在pygame中,sprite模块带有一个名为Group的类,它是一个容器类,用于保存和管理多个Sprite对象。Group类具有以下方法:
add(sprites):向组中添加精灵。
remove(sprites):从组中删除精灵。
sprites():返回所有精灵列表。
update(dt):更新所有精灵的位置。
draw(surface, group=None):将所有精灵绘制到屏幕上。
因此,首先我们在主程序中创建Group类的对象
Bullets = Group()
随后我们对game_functions进行修改,主要修改两个地方,一个是在按键判断哪里加上按空格键的判断,二是在屏幕刷新那添加刷新子弹,代码如下:
import sys
import pygame
from bullet import Bulletdef check_keydown_events(event,new_setting,screen,ship,bullets):if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:new_bullet = Bullet(new_setting,screen,ship)bullets.add(new_bullet)def check_keyup_events(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(new_setting,screen,ship,bullets):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:check_keydown_events(event,new_setting,screen,ship,bullets)elif event.type==pygame.KEYUP:check_keyup_events(event, ship)def update_screen(new_setting,screen,ship,bullets):screen.fill(new_setting.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()pygame.display.flip()
可以看出,我们再判断按下了空格键后,执行代码new_bullet = Bullet(new_setting,screen,ship),创建了一个子弹对象,也就是精灵,然后通过代码bullets.add(new_bullet),将每个子弹精灵加到编组中。
在刷新屏幕中,我们使用for循环将每个子弹显现在设定好的位置。
可以看出,在game_functions的多个函数中增加了参数bullets,因此,我们再主函数调用的时候要将参数传进去。主函数代码修改为:
import pygame
import settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Groupdef run_game():pygame.init()new_setting=settings.Settings()screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))ship = Ship(screen,new_setting)pygame.display.set_caption("狂敲代码的橘子")bullets = Group()while True:gf.check_events(new_setting,screen,ship,bullets)ship.update()bullets.update()gf.update_screen(new_setting,screen,ship,bullets)run_game()
这里解释下, bullets.update(),表示这个编组的每个精灵调用update()函数,即确定了每个精灵的位置,然后调用update_screen函数刷新屏幕,显示出小蜜蜂和子弹。
五、效果
截至现在,让子弹飞的代码基本完成,我们运行程序看看效果。
总结
子弹已经飞起来了,如同我们已经走在了去往山坡的路上,纵有艰险,我们一一克服,终将取得那美丽的蒲公英。
相关文章:

星际争霸之小霸王之小蜜蜂(六)--让子弹飞
目录 前言 一、添加子弹设置 二、创建子弹 三、创建绘制和移动子弹函数 四、让子弹飞 五、效果 总结 前言 小蜜蜂的基本操作已经完成了,现在开始编写子弹的代码了。 一、添加子弹设置 在我的预想里,我们的小蜜蜂既然是一只猫,那么放出的子弹…...

opencv简单使用
cv2库安装, conda install opencv-python注意cv2使用时,路径不能有中文。(不然会一直’None’ _ update # 处理中文路径问题 def cv_imread(file_path): #使用之前需要导入numpy、cv2库,file_path为包含中文的路径return cv2.imd…...

SpringBoot 微人事 职称管理模块(十三)
职称管理前端页面设计 在职称管理页面添加输入框 export default {name: "JobLevelMarna",data(){return{Jl:{name:""}}}}效果图 添加一个下拉框 v-model的值为当前被选中的el-option的 value 属性值 <el-select v-model"Jl.titlelevel" …...
动态规划之0-1背包问题
动态规划之0-1背包问题 文章目录 动态规划之0-1背包问题一、先给出代码二、讲解第一步:初始化第二步:动态规划,填表第三步:回溯,找到选择方案总结 三、进阶(用一维数组解决问题) 一、先给出代码…...

为什么需要单元测试?
为什么需要单元测试? 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需要相结合,但是缺乏了对产品研发细节(特别是代码细节的理解)。 从测试人员角度而言…...

《合成孔径雷达成像算法与实现》Figure3.13——匹配滤波器的三种实现方式
clc clear close all% 参数设置 TBP 80; % 时间带宽积 T 10e-6; % 脉冲持续时间 N_ZD 60; % 零频点位于中点右侧的距离,P58% 参数计算 B TBP/T; …...

Android企业项目开发实训室建设方案
一 、系统概述 Android企业项目开发作为新一代信息技术的重点和促进信息消费的核心产业,已成为我国转变信息服务业的发展新热点:成为信息通信领域发展最快、市场潜力最大的业务领域。互联网尤其是移动互联网,以其巨大的信息交换能力和快速渗透…...

11_Redis经典五大类型源码及底层实现
Redis经典五大类型源码及底层实现 一、Redis数据类型的底层数据结构 SDS动态字符串双向链表压缩列表 zpilist哈希表 hashtable调表 skiplist整数集合 intset快速列表 quicklist紧凑列表 listpack 二、Redis源码地址 Github:https://github.com/redis/redis 三、…...

AWS WAF实战、优势对比和缺陷解决
文章目录 挑战和目标AWS WAF的优势AWS WAF的不足我是怎么做的?什么是比较好的AWS WAF设计? 笔者为了解决公司Web站点防御性问题,较为深入的研究AWS WAF的相关规则。面对上千万的冲突,笔者不得设计出一种能漂亮处理冲突数据WAF规则。 AWS WAF开发人员在…...
13,【设计模式】代理
代理 代理支持任意参数的简单代理实现 代理 代理的本质是函数指针 代理分为单播,多播,动态多播(ue4中提出的) 单播:在网络通信中,单播是一种一对一的通信方式 多播:在网络通信中,…...

基于IDEA使用maven创建hibernate项目
1、创建maven项目 2、导入hibernate需要的jar包 <!--hibernate核心依赖--><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.1.Final</version></dependency><!--…...

使用Termux在安卓手机上搭建Hexo博客网站,并发布到公网访问
文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并…...

宝塔 杀死 java服务 netstat -tlnp | grep :7003 kill 2205698
7003 是端口 netstat -tlnp | grep :7003 kill 2205698...
Python3 数据类型转换
Python3 数据类型转换 有时候,我们需要对数据内置的类型进行转换,数据类型的转换,一般情况下你只需要将数据类型作为函数名即可。 Python 数据类型转换可以分为两种: 隐式类型转换 - 自动完成显式类型转换 - 需要使用类型函数来…...

Cookie 和 Session 的工作流程
目录 一、Cookie是什么? 二、Session是什么? 三、Cookie的工作流程 四、Session的工作流程 五、Session和Cookie的区别和联系 一、Cookie是什么? Cookie是一种在网站和用户之间交换信息的机制。它是由Web服务器发送给用户浏览器的小型文本文件ÿ…...

AutoSAR配置与实践(基础篇)3.6 BSW的WatchDog功能
3.6 BSW的WatchDog功能 一、WatchDog功能介绍1.1 WatchDog 模块组成1.2 内外部看门狗区别和原理1.3 常见看门狗校验方式一、WatchDog功能介绍 1.1 WatchDog 模块组成 WatchDog 即看门狗功能。这个看门狗不是真正看家的狗,而是软件的一个模块,但是因为功能类似故以此起名。主…...
运维高级第6次作业
1.安装docker服务,配置镜像加速器 Docker安装与镜像加速器配置_ZRSAI的博客-CSDN博客 2.下载系统镜像(Ubuntu、 centos) 执行该命令后,Docker会自动从Docker Hub镜像库中下载Ubuntu镜像,并将其保存到本地计算机上: [ro…...
MongoDB使用GridFS存储大数据(Java)
MongoDB 是一个灵活的 NoSQL 数据库,能够存储大量的数据。但是,当涉及到特别大的数据项,比如大文件、视频或大型图片时,MongoDB 提供了一个特殊的方法来存储这些数据:GridFS。 简介: 1. 什么是 GridFS&am…...

内网穿透实战应用-windwos10系统搭建我的世界服务器,内网穿透实现联机游戏Minecraft
文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …...
pytorch基于ray和accelerate实现多GPU数据并行的模型加速训练
在pytorch的DDP原生代码使用的基础上,ray和accelerate两个库对于pytorch并行训练的代码使用做了更加友好的封装。 以下为极简的代码示例。 ray ray.py #codingutf-8 import os import sys import time import numpy as np import torch from torch import nn im…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...