很合适新手入门使用的Python游戏开发包pygame实例教程-02[如何控制飞行]

news/2024/4/24 21:08:07/文章来源:https://blog.csdn.net/haigear/article/details/130189762

前面一篇博文,我们让飞机动起来了,但不是那么完美,我们继续来完善我们的游戏代码,本篇博文主要介绍获取按键的方式已经飞行的控制。

文章目录

  • 一、获取按键的三种方式
    • 1、通过event.get配合pygame.key枚举
    • 2、通过event.get配合ord
  • 二、完善飞行
    • 1、飞机飞行的速度
    • 2、飞行的边界
    • 3、移动的两种方式
      • (1)通过坐标属性
      • (2)通过move方法
  • 三、来一架敌机吧

文章原出处: https://haigear.blog.csdn.net/article/details/130189762

一、获取按键的三种方式

1、通过event.get配合pygame.key枚举

for event in pygame.event.get():if event.type==KEYDOWN:if event.key==pygame.K_RIGHT:aircraft_local=aircraft_local.move(1, 0)

2、通过event.get配合ord

for event in pygame.event.get():if event.type==KEYDOWN:if event.key == ord('q'):pygame.quit()

3、通过pygame的get_pressed方法

presskey=pygame.key.get_pressed()
if presskey[pygame.K_a] or presskey[pygame.K_LEFT]:#leftaircraft_local=aircraft_local.move(-1, 0)

二、完善飞行

1、飞机飞行的速度

这里我们引入time包,利用它来控制好。前面那篇的代码飞行速度过快,所以,我们这里引入time的tick进行控制,这样,我们的运行速度,更准确的说是画面的更新速度就会自动根据tick中的速度来更新了。代码如下:

pygame.init()screen=pygame.display.set_mode(size)
aircraft_local=aircraft.get_rect(x=100,y=200)
clock=pygame.time.Clock()pygame.display.set_caption("firstPygame Window")
while runing:for event in pygame.event.get():if event.type==QUIT :runing=Falsescreen.fill((200,100,0))screen.blit(bg,(0,0))screen.blit(aircraft,aircraft_local)# 这里省去了按键移动的代码pygame.display.update()clock.tick(60)

2、飞行的边界

这里,我们又增加了一层判断,即对x和y的边界进行判断,这样我们的飞机就不至于跑出屏幕外了。

presskey=pygame.key.get_pressed()if presskey[pygame.K_a] or presskey[pygame.K_LEFT]:#leftif aircraft_local.x>0:aircraft_local=aircraft_local.move(-1, 0)if presskey[pygame.K_d]or presskey[pygame.K_RIGHT]:#rightif aircraft_local.x<width-80:aircraft_local=aircraft_local.move(1, 0)if presskey[pygame.K_s]or presskey[pygame.K_DOWN]:#downif aircraft_local.y<height-80:aircraft_local.y+=1if presskey[pygame.K_w]or presskey[pygame.K_UP]:#upif aircraft_local.y>0:aircraft_local.y-=1	

3、移动的两种方式

(1)通过坐标属性

aircraft_local.y+=1

或者,如果你习惯下面这样写也可

aircraft_local.=aircraft_local.y+1

(2)通过move方法

aircraft_local=aircraft_local.move(-1, 0)

三、来一架敌机吧

假定我们也和加载飞机一样,加载了一架敌机的图片,下面我们就使用move方法,让飞机从上飞到底下。

# 前面加载plane的图片省略
while runing:
if plane_local.y<=height-40 :plane_local=plane_local.move(0,1)
if plane_local.y==height-40:plane_local.y=0
screen.blit(bg,(0,0))
screen.blit(aircraft,aircraft_local)
screen.blit(plane,plane_local)
pygame.display.update()
clock.tick(60)

效果如下图:
在这里插入图片描述
完全代码如下:

import pygame
from pygame.locals import *
import os
import timesize=width,height=(400,600)
# 加载图片
aircraft=pygame.transform.scale(pygame.image.load(os.path.join("assets","aircraft.png")),(80,80))
plane=pygame.transform.rotate(pygame.transform.scale(pygame.image.load(os.path.join("assets","plane01.png")),(40,40)),-90)
bg=pygame.transform.scale(pygame.image.load(os.path.join("assets","bg.jpg")),(width,height))runing=True
step=width/200;
pygame.init()screen=pygame.display.set_mode(size)aircraft_local=aircraft.get_rect(x=100,y=200)
plane_local=aircraft.get_rect(x=180,y=0)
clock=pygame.time.Clock()pygame.display.set_caption("firstPygame Window")
screen.fill((200,100,0))while runing:for event in pygame.event.get():if event.type==QUIT :runing=Falsepresskey=pygame.key.get_pressed()if presskey[pygame.K_a] or presskey[pygame.K_LEFT]:#leftif aircraft_local.x>0:aircraft_local=aircraft_local.move(-1, 0)if presskey[pygame.K_d]or presskey[pygame.K_RIGHT]:#rightif aircraft_local.x<width-80:aircraft_local=aircraft_local.move(1, 0)if presskey[pygame.K_s]or presskey[pygame.K_DOWN]:#downif aircraft_local.y<height-80:aircraft_local.y+=1if presskey[pygame.K_w]or presskey[pygame.K_UP]:#upif aircraft_local.y>0:aircraft_local.y-=1	if plane_local.y<=height-40 :plane_local=plane_local.move(0,1)if plane_local.y==height-40:plane_local.y=0screen.blit(bg,(0,0))screen.blit(aircraft,aircraft_local)screen.blit(plane,plane_local)pygame.display.update()clock.tick(60)

有关blit()函数的参考博文
上面的代码主要是对前面第一篇的代码进行了一些完善,下一篇博文,我们则开始对飞机及敌机进行类的设计和封装。

转载请注明出处:https://haigear.blog.csdn.net/article/details/130189762

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102419.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微积分入门

文章目录 前言初期积分微分微积分问题 后期极限 ε \varepsilon ε- δ \delta δ极限勒贝格积分 结语 前言 微积分总共走过了两个时期。首先是牛顿和莱布尼茨利用无穷小量定义微分和积分&#xff0c;并且发现了微分和积分的关系&#xff0c;这是第一个时期&#xff0c;这时的…

设计模式——组件协作模式之模板方法模式

文章目录 前言一、“组件协作” 模式二、模板方法模式1、动机2、源码分析讲解①、结构化软件设计②、面向对象软件设计 三、模板方法模式定义四、结构要点总结 前言 一、“组件协作” 模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”&#xff0c;“组件协作…

Cuckoo Filter

其他判重数据结构 Bloom Filter 无法支持删除和计数的功能&#xff0c;需要更多的存储空间来存储数据 因为在CS中&#xff0c;删除和计数是常见的操作&#xff0c;但是这会对布隆过滤器的存储空间产生影响&#xff0c;同样为了实现这一操作&#xff0c;需要更多的存储空间 数…

ArcGIS Pro导航工具

主要导航工具为浏览工具 、屏幕导航器 、书签 、转到XY工具 。 其它还包括链接视图、地图比例&#xff08;2D&#xff09;、场景高度&#xff08;3D&#xff09;、暂停并刷新绘制、照相机属性、在3D模式下导航、键盘快捷键等。 1 主要导航工具 地图和场景的默认工具为浏览工具…

C++ “类与对象”

类与对象的概念 类相当于是结构体的声明&#xff0c;是结构体的设计图&#xff0c;而对象是利用设计图的创造的产物. &#xff08;1&#xff09;.类的大小计算 类的大小计算时与结构体类似&#xff0c;但函数是不计入大小的&#xff08;函数放在单独的公共空间&#xff09;. 在…

Unity API详解——Object类

Object类是Unity中所有对象的基类&#xff0c;例如GameObject、Component、Material、Shader、Texture、Mesh、Font等都是Object的子类。本博客介绍Object类的一些实例方法和静态方法。 一、Object类实例方法 在Object类中&#xff0c;涉及的实例方法主要有GetInstanceID方法…

8. 优先队列

8. 优先队列 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在某些情况下&#xff0c;我们可能需要找出队列中的最大值或者最小值&#xff0c;例如使用一个队列保存计算机的任务&#xff0c;一般情况下计算机的任务都是有优先级…

ROS1学习笔记:常用可视化工具的使用(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;常用可视化工具的实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录 一、日志输出工具&#xff1a;rqt_console二、绘制数据曲线&#xff1a;rqt_plot三、 图像渲染工具&#xff1a;rqt_image_view四、图形界面总接口&#xff1a;r…

kong(4):限流配置

Kong 提供了 Rate Limiting 插件&#xff0c;实现对请求的限流功能&#xff0c;避免过大的请求量过大&#xff0c;将后端服务打挂。 Rate Limiting 支持秒/分/小时/日/月/年多种时间维度的限流&#xff0c;并且可以组合使用。例如说&#xff1a;限制每秒最 多 100 次请求&…

初识Android内存优化

一、简介 Android 内存优化是指优化 Android 应用程序的内存使用&#xff0c;以减少可用内存的消耗&#xff0c;提高应用程序的性能和可靠性。Android 内存优化可以通过减少内存使用量&#xff0c;减少对资源的消耗&#xff0c;以及提高内存利用率来实现。 安卓系统对每个应用…

什么才是好CDN

选择一种领先于网络和移动技术不断进步以及不断演变的威胁格局的CDN&#xff0c;将使您能够始终如一地为客户提供尽可能好的在线体验&#xff0c;同时最大限度地降低运营复杂性和管理成本。 但问题来了&#xff1a;什么才是最好的CDN&#xff1f; 这个问题的唯一答案是&#x…

Tomcat概述以及部署与优化

一、Tomcat概述 1、Tomcat的概念 Tomcat是Java语言开发的&#xff0c;服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&am…

Flutter开发日常练习-小猫咪杂货店(新增动画和跳转抖音)

之前的练习加了个详情页面,然后跳转第三方页面抖音用户详情页面 跳转详情页添加了Hero的动画,共享元素过度 一个 标准 hero 动画 使 hero 从一页飞至新页面&#xff0c;通常以不同大小到达不同的目的地。 设定好每个图片的id,通过id作为 Hero 组件的标识,id不能重,否则会报错&…

OSCP-Medjed(重置用户密码、mysql写webshell、可写文件替换提权)

目录 扫描 FTP WEB 提权 扫描 FTP 尝试登录到FTP服务器,该服务器位于端口30021 使用Filezilla,并能够浏览文件。那里有一些配置文件,但找不到任何值得注意的东西,不能写入目录。

算法--前缀和技巧 (蓝桥杯123-灵能传输)

文章目录 什么是前缀和用途什么时候用例题[蓝桥杯 2021 国 ABC] 123题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路代码 灵能传输(蓝桥杯96%&#xff0c;洛谷ac)[蓝桥杯 2019 省 B] 灵能传输题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1…

【Leetcode -21.合并两个有序链表 -83.删除排序链表中的重复元素】

Leetcode Leetcode-21.合并两个有序链表Leetcode-83.删除排序链表中的重复元素 Leetcode-21.合并两个有序链表 题目&#xff1a;将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 […

【Web3.0大势所趋】我看到了互联网未来的模样

前言 Web3.0 是一个越来越受到关注的话题&#xff0c;它被认为将会带来天翻地覆的变化。本文我们一起来谈谈 Web3.0 的概念、特点和优势&#xff0c;并探讨它为什么如此重要和具有革命性的。 文章目录 前言Web3.0是什么Web3.0的技术Web3.0的优势总结 Web3.0是什么 Web3.0: 是下…

MATLAB实现图像滤波及噪声消除

图像增强是指根据特定的需要突出一幅图像中的某些信息&#xff0c;同时削弱或去除某些不需要的信息的处理方法。其主要目的是使处理后的图像对某种特定的应用来说&#xff0c;比原始图像更适用。因此&#xff0c;这类处理是为了某种应用目的而去改善图像质量的。处理的结果使图…

最短路径Floyd与区间DP

floyd算法是求最短路径的算法&#xff0c;算法复杂度为n(o^3),其优点在于能够一次求解所有点到其他点的最短路径&#xff0c;不需要其他运算&#xff0c;使用二维数组存储。其三层循环自外向内分别为&#xff1a;中间点&#xff0c;起始点和终点。状态方程为&#xff1a; num[…

JVM原理

JVM 什么是JVM&#xff1f; JVM是一种虚拟出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 JVM有自己完善的硬件架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。 使用J…