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

星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来

目录

前言

一、监听按键并作出判断

 二、持续移动

 三、左右移动

 总结:


前言

今天开始正式操控我们的小蜜蜂了,之前学java的时候是有一个函数监听鼠标和键盘的操作,我们通过传过来不同的值进行判断,现在来看看python是否一样的实现。

一、监听按键并作出判断

 以我浅薄的知识判断,流程应该为时刻监听键盘或者鼠标的操作,然后判断键盘是否点击的方向键,假如点击一下向左移动,那么我们就将小蜜蜂的位置向左移动一个设定好的距离,然后再显示在屏幕上。我们专门创建了一个模块game_functions来存放游戏操作的代码,那么我们在game_functions模块里面编写就性,下面我们看看代码:

import sys
import pygamedef check_events(ship):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:if event.key == pygame.K_RIGHT:ship.rect.centerx += 1
def update_screen(new_setting,screen,ship):screen.fill(new_setting.bg_color)ship.blitme()pygame.display.flip()

可以看出,我们将check_events()函数进行了补充,增加了判断,之前只是判断是否点击了关闭,现在增加了对键盘输入的判断,我们详细分析一下:

1、首先判断事件类型是否为键盘事件KEYDOWN。pygame.KEYDOWN是一个事件类型,指的是键盘上某个键被按下的事件。当键盘上的某个键被按下时,pygame会生成一个KEYDOWN事件,程序可以通过检测这个事件来获取键盘按键的信息,如按下的是哪个键、是否同时按下了Shift、Ctrl等修饰键。

2、当判断我们确实是在键盘按下某个键后,进入下一步判断,判断到底是按了哪个键,代码中我们目前只写的按向右移动的键。常见的event.key值包括:

  • pygame.K_UP/K_DOWN/K_LEFT/K_RIGHT表示方向键上下左右
  • pygame.K_SPACE表示空格键
  • pygame.K_ESCAPE表示Esc键
  • pygame.K_RETURN表示回车键
  • pygame.K_a到pygame.K_z表示26个字母键

3、当我们判断匹配后,我们需要将小蜜蜂位置向右移动一格,那么我们需要改变Ship模块里面的rect.centerx值,将它加1,那么我们就需要传入ship,因此在定义check_events()是要设置参数,将ship传进来。

 我们将check_events()函数修改好以后,那么我们就需要在主函数里调用它,之前我们已经调用了check_events()函数用来判断程序的关闭,但是现在因为要加传参进去,所以略加修改,增加传参ship就行。

import pygame
import settings
from ship import Ship
import game_functions as gfdef run_game():pygame.init()new_setting=settings.Settings()screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))ship = Ship(screen)pygame.display.set_caption("Alien Invasion")while True:gf.check_events(ship)gf.update_screen(new_setting,screen,ship)run_game()

 

 

 通过运行程序,点击右方向键,我们可以看出,小蜜蜂向右进行了移动。

 二、持续移动

 在操作的过程中,我发现我需要不停的点击右移动键才能实现小蜜蜂不断右移动,这是反人性的,以我多年打cs、街头篮球、QQ飞车、泡泡堂的经验来说,人类更习惯于点着不放实现持续移动,喜欢连发,而不喜欢点射。“大蟒蛇”很贴心的告诉我们下一步该怎么实现持续功能。

 “大蟒蛇”提供的思路是:不再以按下向右移动键为判断小蜜蜂向右移动的条件,而是设置另一个变量(比如m),m初始值为0,如果按下右移动键,m为1,只要m等于1,小蜜蜂就向右移动,如果m等于0,小蜜蜂就不动。个人觉得思路可行,只需要再加一个判断,判断松开右移动键时,将0赋值给m。下面我们来看代码

import pygameclass Ship():def __init__(self,screen):self.screen = screenself.image = pygame.image.load('cat.png')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomself.moving_right = Falsedef update(self):if self.moving_right:self.rect.centerx += 1def blitme(self):self.screen.blit(self.image,self.rect)

 我们看到,我们重写了Ship模块,不仅是增加了一个变量(moving_right就相当于我之前说的m,True和False就相当于1和0),还增加了函数update,将小蜜蜂的移动写到了这里,那么我们的主函数和game_functions也要作出相应修改(为什么不写在game_functions里?)

import sys
import pygamedef check_events(ship):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.type==pygame.KEYUP:if event.key == pygame.K_RIGHT:ship.moving_right = Falsedef update_screen(new_setting,screen,ship):screen.fill(new_setting.bg_color)ship.blitme()pygame.display.flip()

我们可以看出,在game_functions模块里面,我们只需要将moving_right变量进行修改,就能控制小蜜蜂的移动。如果能理解前面我们的思路,那么KRYUP状态就很好理解了,就是弹起或者说松开按键的意思。下面我们再在主程序对我们新建立的update函数调用就行了。

import pygame
import settings
from ship import Ship
import game_functions as gfdef run_game():pygame.init()new_setting=settings.Settings()screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))ship = Ship(screen)pygame.display.set_caption("Alien Invasion")while True:gf.check_events(ship)ship.update()gf.update_screen(new_setting,screen,ship)run_game()

 三、左右移动

 上面我们已经实现了向右移动,那么向左移动就变得十分简单,只需要在同样的地方加一个判断就行,这里建议大家自己写,我们只需要在ship和game_functions模块添加代码就行。

 ship:

import pygameclass Ship():def __init__(self,screen):self.screen = screenself.image = pygame.image.load('cat.png')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomself.moving_right = Falseself.moving_left = Falsedef update(self):if self.moving_right:self.rect.centerx += 1if self.moving_left:self.rect.centerx -= 1def blitme(self):self.screen.blit(self.image,self.rect)

 game_functions:

import sys
import pygamedef check_events(ship):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.type==pygame.KEYUP:if event.key == pygame.K_RIGHT:ship.moving_right = Falseif event.key == pygame.K_LEFT:ship.moving_left = Falsedef update_screen(new_setting,screen,ship):screen.fill(new_setting.bg_color)ship.blitme()pygame.display.flip()

  

 总结:

 今天我们完成了小蜜蜂的左右移动,由点及面,窥一斑可见全豹,我们可以整理一下思路,之后我们只需要建立大黄蜂模块和子弹模块,然后在那两个模块里设置变量控制他们的移动和消失,就可以初步完成游戏的基本功能。

相关文章:

星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来

目录 前言 一、监听按键并作出判断 二、持续移动 三、左右移动 总结: 前言 今天开始正式操控我们的小蜜蜂了,之前学java的时候是有一个函数监听鼠标和键盘的操作,我们通过传过来不同的值进行判断,现在来看看python是否一样的实现…...

Visual Studio 2022 你必须知道的实用调试技巧

目录 1、什么是bug? 2.调试是什么?有多重要? 2.1我们是如何写代码的? 2.2又是如何排查出现的问题的呢? ​编辑 2.3 调试是什么? 2.4调试的基本步骤 2.5Debug和Release的介绍 3.Windows环境调试介绍…...

Webgl 存储限定符attribute、gl.getAttribLocation、gl.vertexAttrib3f及其同族函数和矢量版本的介绍

目录 attribute变量规范 获取attribute变量的存储位置 gl.getAttribLocation()函数的规范: 向attribute变量赋值 gl.vertexAttrib3f()的规范。 gl.vertexAttrib3f()的同族函数 示例代码…...

postgresql跨库创建视图

需求: A库a表中的字段拆分1个到B库b表,所以b表中只保留唯一标识字段(可以理解为id)和另一个被拆分的字段 需要用到的拓展:CREATE EXTENSION dblink 使用dblink创建连接: SELECT dblink_connect(other_db, hostaddr【IP…...

FPGA时钟

几年前FPGA时钟只需要连接一个单端输入的晶振,非常容易。现在不同了,差分时钟输入,差分信号又分为LVDS和LVPECL,时钟芯片输出后还要经过直流或交流耦合才能接入FPGA,有点晕了,今天仔细研究一下。 FPGA输入…...

FifthOne:计算机视觉提示和技巧

一、说明 欢迎来到我们每周的FiftyOne提示和技巧博客,我们回顾了最近在Slack,GitHub,Stack Overflow和Reddit上弹出的问题和答案。FiftyOne是一个开源机器学习工具集,使数据科学团队能够通过帮助他们策划高质量数据集、评估模型、…...

Oracle19c-补丁升级报错合集(一)

前言: 本文主要介绍Oracle19c补丁升级遇到的问题,涉及安装补丁prepatch步骤,apply应用报错以及datapatch -verbose数据字典更新报错 问题一: 在执行补丁rootcrs.sh -prepatch操作时,发生执行检查命令cluutil -chkshare报错 CLSRSC-180: An …...

嵌入式:ARM Day6

作业:完成cortex-A7核UART总线实验 目的:1.输入a,显示b,将输入的字符的ASCII码下一位字符输出 2.原样输出输入的字符串 源码: uart4.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #incl…...

ClickHouse安装步骤

文章目录 ClickHouse安装步骤背景安装启动用户相关修改密码登录验证新增用户config配置文件 基本操作服务管理 ClickHouse安装步骤 背景 经过研究ClickHouse是列式数据库,下面是在Centos7.9版本单机版的安装的演示 安装 首先安装yum-utils工具包 sudo yum inst…...

Android CCodec (二十) CCodec Native服务实现分析

1、C2解码服务registerAsService注册流程 google实现CCodec的vendor默认解码服务代码路径是在frameworks/av/media/codec2/hidl/services/vendor.cpp中,而其注册的是HIDL服务,本文就对HIDL服务注册做简要分析。首先看下vendor.cpp中的代码注册流程。 int main(int /* argc *…...

Shell编程学习之while循环语句和for循环语句的应用

Shell编程中的while循环:可以类比C语言中的while循环进行学习,详见本人原创博客链接: https://blog.csdn.net/qq_41878292/article/details/132081302?spm1001.2014.3001.5502伪代码表示: while 表达式 do循环体 done用法类比S…...

【校招VIP】CSS校招考点之选择器优先级

考点介绍: 选择器是CSS的基础,也是校招中的高频考点,特别是复合选择器的执行优先级,同时也是实战中样式不生效的跟踪依据。 因为选择器的种类较多,很难直接记忆,可以考虑选择一个相对值,比如id类…...

Netty+springboot开发即时通讯系统笔记(四)终

实时性 1.线程池多线程,把消息同步给其他端和对方用户,其中数据持久化往往是最浪费时间的操作,可以使用mq异步存储,因为其他业务不需要拿着整条数据,只需要这条数据的id进行操作。 2。消息校验前置,放在t…...

java -jar 启动服务后,关闭命令窗口后服务停止

java -jar 启动服务后,关闭命令窗口后服务停止 问题:当我们用java -jar命令启动服务后,只有一直保持Xshell的窗口开启且正常连接服务器时才能访问服务,当关闭命令窗口时,服务会停止运行 解决:使用nohup命…...

Android PowerManager的使用

唤醒锁定 如果需要使 CPU 保持运行状态&#xff0c;以便在设备进入休眠模式之前完成某项工作&#xff0c;可以使用“唤醒锁定” 。 添加权限 <uses-permission android:name"android.permission.WAKE_LOCK" />设置唤醒锁定 PowerManager powerManager (Po…...

安防监控/视频集中存储/云存储平台EasyCVR v3.3增加首页告警类型

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…...

7-6 统计字符出现次数

分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 本题要求编写程序&#xff0c;统计并输出某给定字符在给定字符串中出现的次数。 输入格式&#xff1a; 输入第一行给出一个以回车结束的字符串&#xff08;少于80个字符&#xff09;&#xff1b;第二行输入一个…...

美国大模型风向速报(一)为何重视提示工程?LangChain+向量数据库+开源大模型真香...

多家&#xff0c;且独家来自美国的信源同时向“亲爱的数据”表示&#xff0c; 提示工程&#xff08;Prompt Engineering&#xff09;在美国大模型领域备受重视。 读者都要聊&#xff0c; 那就干活。 &#xff08;一&#xff09;开源真香 现阶段&#xff0c;AI开源极客大展身手&…...

excel统计函数篇2之count系列

1、COUNT(value1,[value2],…):计算参数列表中数字的个数 2、COUNTA(value1,[value2],…)&#xff1a;计算参数列表中值的个数 联想在excel之数学函数、excel中的通配符一文中提到求和函数&#xff1a; SUMIF(range,ceriteria,[sum_range])&#xff1a;对范围内符合指定条件的…...

vue3组件多个根节点报错

打开扩展商店搜索下载 vetur 打开设置命令面板 搜索eslint 将下面的勾选取消...

基于Rust的QuickLZ压缩算法的详细实现与分析

1. 引言 QuickLZ是一种被广泛应用的高效压缩算法。在许多应用中&#xff0c;快速的数据压缩和解压缩是非常关键的&#xff0c;特别是在网络传输和存储空间有限的场景中。为了满足现代软件开发的需求&#xff0c;我们将使用Rust语言来实现这一算法。Rust是一种专为系统级编程而…...

next.js 创建 react ant design ts 项目

环境说明&#xff1a;next.js 官方文档要求node版本在16.8以上。笔者使用的 node版本是16.20.1&#xff0c;不要使用16.13.0&#xff0c;笔者在使用 node16.13.0环境时创建的 react 项目点击事件无效 next.js官网截图 next.js 官网&#xff1a;https://nextjs.org/ react 官网…...

无涯教程-Perl - use函数

描述 此函数将MODULE导出的所有功能(或仅LIST引用的功能)导入当前包的名称空间。有效等效于- BEGIN { require "Module.pm"; Module->import(); }也用于在当前脚本上强加编译器指令(编译指示),尽管从本质上讲它们只是模块。 请注意,use语句在编译时进行判断。在…...

(7)(7.6) 恢复任务回放

文章目录 前言 7.6.1 配置 7.6.2 工作原理 7.6.3 局限性 前言 本页介绍了什么是"任务继续时后退"功能以及如何使用该功能。 &#xff01;Note 从 4.1 版起&#xff0c;Plane、Copter 和 Rover 均可使用此功能。 在某些应用或运行区域&#xff0c;为了消除冲突&…...

spark yarn 开启动态资源分配

概念 不需要指定并发&#xff0c;只需要指定内存&#xff0c; 程序在运行后会动态调节并发数量&#xff0c;我们只需要设置一个上线即可 在spark 配置文件设置&#xff1a; spark.dynamicAllocation.enabled true spark.shuffle.service.enabled true 准备shuffer jar 将spar…...

Android学习之路(8) Activity

本节引言&#xff1a; 本节开始讲解Android的四大组件之一的Activity(活动)&#xff0c;先来看下官方对于Activity的介绍&#xff1a; 移动应用体验与桌面体验的不同之处在于&#xff0c;用户与应用的互动并不总是在同一位置开始&#xff0c;而是经常以不确定的方式开始。例如&…...

Linux的热拔插UDEV机制

文章目录 UDEV简介守护进程基本特点 守护进程和后台进程的区别开发守护进程结束 UDEV简介 udev是一个设备管理工具&#xff0c;udev以守护进程的形式运行&#xff0c;通过侦听内核发出来的uevent来管理/dev目录下的设备文件。 udev在用户空间运行&#xff0c;而不在内核空间 …...

Azure应用程序网关

文章目录 什么是应用程序网关实战演练创建虚拟网络创建虚拟机创建应用程序网关测试搭建结果 什么是应用程序网关 Azure应用程序网关是一种托管服务&#xff0c;用于提供安全、可缩放的 Web 应用程序前端点的应用程序传送控制和保护。它可以通过 SSL 终止、cookie 基于会话持久…...

免费开源服务器资源监控系统grafana+prometheus+node_exporter

有项目做测试的时候需要查询服务器资源利用情况&#xff0c;自己又没写相应的模块&#xff0c;此时就需要一套好用的资源监控系统&#xff0c;&#xff0c;咨询了运维人员给推荐了一套&#xff0c;装完后真的很好用。 就是grafanaprometheusnode_exporter&#xff08;linux&am…...

【文化课学习笔记】【化学】金属及其化合物

【化学】必修一&#xff1a;金属及其化合物 钠及其化合物 钠单质 物理性质 颜色&#xff1a;银白色&#xff0c;有金属光泽&#xff1b;密度&#xff1a; ρ H 2 O > ρ N a > ρ 煤油 \mathrm{\rho_{H_2O}>\rho_{Na}>\rho_{煤油}} ρH2​O​>ρNa​>ρ煤…...