当前位置: 首页 > news >正文

星际争霸之小霸王之小蜜蜂(六)--让子弹飞

目录

前言

 一、添加子弹设置

 二、创建子弹

 三、创建绘制和移动子弹函数

 四、让子弹飞

 五、效果

 总结


前言

小蜜蜂的基本操作已经完成了,现在开始编写子弹的代码了。

 一、添加子弹设置

 在我的预想里,我们的小蜜蜂既然是一只猫,那么放出的子弹应该是一只猫爪,或者是爪印,一个小梅花也是可以的,但是“大蟒蛇”是画出一个灰色的长方形小方块作为子弹,我们先按照书上的来操作,后期我们自己再升级。

首先跟新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背包问题一、先给出代码二、讲解第一步&#xff1a;初始化第二步&#xff1a;动态规划&#xff0c;填表第三步&#xff1a;回溯&#xff0c;找到选择方案总结 三、进阶&#xff08;用一维数组解决问题&#xff09; 一、先给出代码…...

为什么需要单元测试?

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

《合成孔径雷达成像算法与实现》Figure3.13——匹配滤波器的三种实现方式

clc clear close all% 参数设置 TBP 80; % 时间带宽积 T 10e-6; % 脉冲持续时间 N_ZD 60; % 零频点位于中点右侧的距离&#xff0c;P58% 参数计算 B TBP/T; …...

Android企业项目开发实训室建设方案

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

11_Redis经典五大类型源码及底层实现

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

AWS WAF实战、优势对比和缺陷解决

文章目录 挑战和目标AWS WAF的优势AWS WAF的不足我是怎么做的?什么是比较好的AWS WAF设计? 笔者为了解决公司Web站点防御性问题&#xff0c;较为深入的研究AWS WAF的相关规则。面对上千万的冲突&#xff0c;笔者不得设计出一种能漂亮处理冲突数据WAF规则。 AWS WAF开发人员在…...

13,【设计模式】代理

代理 代理支持任意参数的简单代理实现 代理 代理的本质是函数指针 代理分为单播&#xff0c;多播&#xff0c;动态多播&#xff08;ue4中提出的&#xff09; 单播&#xff1a;在网络通信中&#xff0c;单播是一种一对一的通信方式 多播&#xff1a;在网络通信中&#xff0c;…...

基于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 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并…...

宝塔 杀死 java服务 netstat -tlnp | grep :7003 kill 2205698

7003 是端口 netstat -tlnp | grep :7003 kill 2205698...

Python3 数据类型转换

Python3 数据类型转换 有时候&#xff0c;我们需要对数据内置的类型进行转换&#xff0c;数据类型的转换&#xff0c;一般情况下你只需要将数据类型作为函数名即可。 Python 数据类型转换可以分为两种&#xff1a; 隐式类型转换 - 自动完成显式类型转换 - 需要使用类型函数来…...

Cookie 和 Session 的工作流程

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

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服务&#xff0c;配置镜像加速器 Docker安装与镜像加速器配置_ZRSAI的博客-CSDN博客 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 执行该命令后&#xff0c;Docker会自动从Docker Hub镜像库中下载Ubuntu镜像&#xff0c;并将其保存到本地计算机上: [ro…...

MongoDB使用GridFS存储大数据(Java)

MongoDB 是一个灵活的 NoSQL 数据库&#xff0c;能够存储大量的数据。但是&#xff0c;当涉及到特别大的数据项&#xff0c;比如大文件、视频或大型图片时&#xff0c;MongoDB 提供了一个特殊的方法来存储这些数据&#xff1a;GridFS。 简介&#xff1a; 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原生代码使用的基础上&#xff0c;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…...

[蓝帽杯 2022 初赛]domainhacker

打开流量包&#xff0c;追踪TCP流&#xff0c;看到一串url编码 放到瑞士军刀里面解密 最下面这一串会觉得像base64编码 删掉前面两个字符就可以base64解码 依次类推&#xff0c;提取到第13个流&#xff0c;得到一串编码其中里面有密码 导出http对象 发现最后有个1.rar文件 不出…...

在 Pytorch 中使用 TensorBoard

机器学习的训练过程中会产生各类数据&#xff0c;包括 “标量scalar”、“图像image”、“统计图diagram”、“视频video”、“音频audio”、“文本text”、“嵌入Embedding” 等等。为了更好地追踪和分析这些数据&#xff0c;许多可视化工具应运而生&#xff0c;比如之前介绍的…...

Grafana Dashboard 备份方案

文章目录 Grafana Dashboard 备份方案引言工具简介支持的组件要求配置备份安装使用 pypi 安装grafana备份工具配置环境变量使用Grafana Backup Tool 进行备份恢复备份 Grafana Dashboard恢复 Grafana Dashboard结论Grafana Dashboard 备份方案 引言 每个使用 Grafana 的同学都…...

opencv-疲劳检测-眨眼检测

#导入工具包 from scipy.spatial import distance as dist from collections import OrderedDict import numpy as np import argparse import time import dlib import cv2FACIAL_LANDMARKS_68_IDXS OrderedDict([("mouth", (48, 68)),("right_eyebrow",…...

2023-08-24力扣每日一题

链接&#xff1a; 1267. 统计参与通信的服务器 题意&#xff1a; 同行同列可以发生通信&#xff0c;求能发生通信的机器数量 解&#xff1a; 标记每行/每列的机器个数即可 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; class Solution { pub…...

蚂蚁数科持续发力PaaS领域,SOFAStack布局全栈软件供应链安全产品

8月18日&#xff0c;记者了解到&#xff0c;蚂蚁数科再度加码云原生PaaS领域&#xff0c;SOFAStack率先完成全栈软件供应链安全产品及解决方案的布局&#xff0c;包括静态代码扫描Pinpoint、软件成分分析SCA、交互式安全测试IAST、运行时防护RASP、安全洞察Appinsight等&#x…...

Java后端开发面试题——消息中间篇

RabbitMQ-如何保证消息不丢失 交换机持久化&#xff1a; Bean public DirectExchange simpleExchange(){// 三个参数&#xff1a;交换机名称、是否持久化、当没有queue与其绑定时是否自动删除 return new DirectExchange("simple.direct", true, false); }队列持久化…...

C++ Windows API IsDebuggerPresent的作用

IsDebuggerPresent 是 Windows API 中的一个函数&#xff0c;它用于检测当前运行的程序是否正在被调试。当程序被如 Visual Studio 这样的调试器附加时&#xff0c;此函数会返回 TRUE&#xff1b;否则&#xff0c;它会返回 FALSE。 这个函数经常被用在一些安全相关的场景或是防…...

【JVM 内存结构 | 程序计数器】

内存结构 前言简介程序计数器定义作用特点示例应用场景 主页传送门&#xff1a;&#x1f4c0; 传送 前言 Java 虚拟机的内存空间由 堆、栈、方法区、程序计数器和本地方法栈五部分组成。 简介 JVM&#xff08;Java Virtual Machine&#xff09;内存结构包括以下几个部分&#…...

华为云Stack的学习(一)

一、华为云Stack架构 1.HCS 物理分散、逻辑统一、业务驱动、运管协同、业务感知 2.华为云Stack的特点 可靠性 包括整体可靠性、数据可靠性和单一设备可靠性。通过云平台的分布式架构&#xff0c;从整体系统上提高可靠性&#xff0c;降低系统对单设备可靠性的要求。 可用性…...

齐大胜请于果做网站是第几集/灰色词快速排名方法

学习连接&#xff1a;http://www.runoob.com/redis/redis-tutorial.html 一、Redis介绍 Redis是NoSql的一种。 NoSql&#xff0c;全名&#xff1a;Not Only Sql&#xff0c;是一种非关系型数据库&#xff0c;它不能替代关系弄数据库&#xff0c;只是关系型数据库的一个补充&…...

如何让搜索引擎快速收录网站/培训机构是干什么的

linux 第一章 硬件&#xff1a; (1) cpu:如Intel8086包括i386 (2) 内存:RAM (3)存储设备: 硬盘,CD-ROM&#xff0c;软盘和磁带 (4)输入输出设备:鼠标&#xff0c;键盘&#xff0c;调制解调器等 软件: (1) 程序:程序是计算机完成一项任务的指令的集合。 (2)数据是由程序使用或生…...

网站的基本组成部分有哪些/seo专业培训seo专业培训

在使用Query EasyUI、Ext等框架开发项目的时候&#xff0c;经常会用到很多小的图标&#xff0c;常见几个图片应用方式总结如下&#xff1a; 一、在jQuery Easyui中添加小图标 1、添加图标的两小步&#xff1a; 先到themes目录下的icon.css中&#xff0c;添加新图标对应的CSS类选…...

网站建设与维护网课/安卓优化神器

Java异常处理和设计在程序设计中&#xff0c;进行异常处理是非常关键和重要的一部分。一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。试想一下&#xff0c;如果一个项目从头到尾没有考虑过异常处理&#xff0c;当程序出错从哪里寻找出错的…...

网站建设费用会计科目/知乎seo排名帝搜软件

全卷积网络是语义分割的开创性工作&#xff0c;然而&#xff0c;FCN的感受野有限&#xff0c;不能有效捕捉语义分割所需要的全局上下文信息&#xff0c;因此FCN被后来的方法打败&#xff0c;比如增加不同size的滤波器来获得多尺度感受野&#xff0c;然而这势必增加参数数量。不…...

正能量网站下载/四年级写一小段新闻

先简单写下观察者模式。观察者模式&#xff0c;又叫做发布-订阅模式。观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;是他们能够自动更新自己。 1 ///…...