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

news2024/9/22 1:43:08

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

文章目录

  • 一、获取按键的三种方式
    • 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]:#left
		aircraft_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=False
	screen.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]:#left
		if aircraft_local.x>0:
			aircraft_local=aircraft_local.move(-1, 0)

	if presskey[pygame.K_d]or presskey[pygame.K_RIGHT]:#right
		if aircraft_local.x<width-80:
			aircraft_local=aircraft_local.move(1, 0)

	if presskey[pygame.K_s]or presskey[pygame.K_DOWN]:#down
		if aircraft_local.y<height-80:
			aircraft_local.y+=1

	if presskey[pygame.K_w]or presskey[pygame.K_UP]:#up
		if 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 time

size=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=False


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

	if presskey[pygame.K_d]or presskey[pygame.K_RIGHT]:#right
		if aircraft_local.x<width-80:
			aircraft_local=aircraft_local.move(1, 0)

	if presskey[pygame.K_s]or presskey[pygame.K_DOWN]:#down
		if aircraft_local.y<height-80:
			aircraft_local.y+=1

	if presskey[pygame.K_w]or presskey[pygame.K_UP]:#up
		if 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=0
		
	screen.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.coloradmin.cn/o/440627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门教程||C++ 文件和流||C++ 异常处理

C 文件和流 C 文件和流 到目前为止&#xff0c;我们已经使用了 iostream 标准库&#xff0c;它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream&#xff0c;它定义…

《我的第一本算法书》读书笔记

《我的第一本算法书》读书笔记 作者&#xff1a;宫崎修一 石田保辉 ◆ 1-3 数组 在链表和数组中&#xff0c;数据都是线性地排成一列。在链表中访问数据较为复杂&#xff0c;添加和删除数据较为简单&#xff1b;而在数组中访问数据比较简单&#xff0c;添加和删除数据却比较复…

转行IT,怎么选专业?

转行IT&#xff0c;怎么选专业&#xff1f; 知己知彼&#xff0c;百战不殆 先清楚你自身的基础情况&#xff1a;学历、年龄、是否有基础、学习能力如何、自律性、时间管理能力、有没有生活压力、有没有家要养、车贷、房贷…… 思考的问题越现实&#xff0c;对你的帮助越大 选…

运营商大数据获客是什么,是如何实现精准获客的

长久以来&#xff0c;企业希望自己的产品获得更多的客户&#xff0c;那么就需要花钱做推广和营销。然而随着互联网和自媒体的发展&#xff0c;并不是钱花出去了&#xff0c;就能带来有效的流量和高质量的客户&#xff0c;费效比太高&#xff0c;精准度太差&#xff0c;没有好的…

神经网络初学者的激活函数指南

如果你刚刚开始学习神经网络&#xff0c;激活函数的原理一开始可能很难理解。但是如果你想开发强大的神经网络&#xff0c;理解它们是很重要的。 但在我们深入研究激活函数之前&#xff0c;先快速回顾一下神经网络架构的基本元素。如果你已经熟悉神经网络的工作原理&#xff0c…

STM32+ESP8266+QT客户端上位机显示DHT11温湿度与点灯

目录 1、简介 2、硬件连接 3、上位机源码 3.1 widget.h 3.2 widget.c 3.3 显示图 4、下位机源码 4.1 cubemax配置 4.2 keil源码 1、简介 本文使用STM32F103C8T6单片机使用单片机通过ESP8266WIFI模块与QT设计的上位机进行通讯&#xff0c;ESP8266设置AP模式。实现DHT11传…

跨越DDD从理论到工程落地的鸿沟

DDD作为一种优秀的设计思想&#xff0c;的确为复杂业务治理带来了曙光。然而因为DDD本身难以掌握&#xff0c;很容易造成DDD从理论到工程落地之间出现巨大的鸿沟。就像电影里面的桥段&#xff0c;只谈DDD理论姿势很优美&#xff0c;一旦工程落地就跪了…所以DDD的项目&#xff…

Android实战-RecyclerView+Glide刷新列表的若干bug

文章目录 前言一. RecyclerView中使用Glide出现加载图片闪烁1.1 提出问题1.2 查看源码1.3 ViewTarget和SimpleTarget 二. CustomTarget和CustomViewTarget2.1 onResourceCleared和onLoadCleared2.2 onLoadStarted和onResourceLoading 结束 前言 最近在项目中使用RecyclerViewG…

Java——合并两个排序的链表

题目链接 牛客在线oj题——合并两个排序的链表 题目描述 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围&#xff1a; 0≤n≤1000&#xff0c;−1000≤节点值≤1000 要求&#xff1a;空间复杂…

物联网定位技术|实验报告|实验二 多边定位算法、DV-HOP算法

在WSN定位中常常采用三边定位算法&#xff0c;试画图推导三边定位的计算公式&#xff0c;并表示为矩阵形式。 目录 1. 实验目标 2. 实验要求 3. 算法介绍 3.1基本内容介绍 3.2迭代多边定位算法 3.3 DV-HOP算法 4. 算法实现 4.1迭代多边定位算法 第一步&#xff1a;将数据读入内…

STM32HAL库USART外设配置流程及库函数讲解

HAL库中USART外设配置流程及库函数讲解 一说到串口通信&#xff0c;及必须说一下aRS-232/485协议。232协议标准物理接口就是我们常用的DB9串口线 RS-232电平&#xff1a; 逻辑1&#xff1a;-15~-3 逻辑0&#xff1a; 3~15 COMS电平&#xff1a; 逻辑1&#xff1a;3.3 逻辑0&a…

文件操作【下篇】

文章目录 &#x1f5c3;️5.文件的随机读写&#x1f4c1;5.1. fseek&#x1f4c1;5.2. ftell&#x1f4c1;5.3. rewind &#x1f5c3;️6.文本文件和二进制文件&#x1f5c3;️7.文件读取结束的判定&#x1f4c1;7.1. 被错误使用的 feof &#x1f5c3;️8.文件缓冲区 &#x1f…

如何使用YOLOv8推荐的Roboflow来制作训练自己的数据集

YOLOv8是Ultralytics开发的YOLO目标检测和图像分割模型的最新版本&#xff0c;相较于之前的版本&#xff0c;YOLOv8可以更快速有效地识别和定位图像中的物体&#xff0c;以及更准确地分类它们。 YOLOv8需要大量的训练数据来实现最佳性能。为了让YOLOv8能够有效地识别自己的应用…

【UE】保存游戏的demo

效果 注意左上角的打印信息&#xff0c;每当我按下k键&#xff0c;值就加1。当我关闭后重进游戏&#xff0c;按下k键&#xff0c;值是从上次退出游戏的值开始累加的。 步骤 1.新建蓝图&#xff0c;父类为“SaveGame” 命名为“MySaveGame”并打开 新建一个整型变量&#xff0c…

ODOO业财一体贸易行业ERP全面管理系统(核心流程简介)

前言&#xff1a; 贸易行业的两大管理难点在&#xff1a; 1.订单的跟踪效率&#xff1a;订单从报价、寄样、采购材料、委外加工、质检、入库、出库、收款&#xff0c;跟踪环节多&#xff0c;信息分散&#xff0c;跟单员难以把握订单执行进度&#xff0c;因此也导致延期交货等…

户外电源强制国标发布或加速行业洗牌 未来产品将往大容量及轻量化发展

一、户外电源行业概述 户外电源是一种内置锂离子电池的低碳绿色小型储能设备&#xff0c;又称“大号充电宝”、“便携式储能”。是电化学储能的分支&#xff0c;优在“便捷”&#xff0c;具有多次循环充放电、适配广泛、安全便捷的特点&#xff0c;在户外各场景中应用广泛受到…

Ubuntu安装k8s的Dashboard

介绍 Dashboard 是基于网页的 Kubernetes 用户界面。您可以使用 Dashboard 将容器应用部署到Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群本身及其附属资源。您可以使用Dashboard 获取运行在集群中的应用的概览信息&#xff0c;也可以创建或者…

从Allegro进行反标

从Allegro进行反标 目的反标流程常见问题 目的 通过反标&#xff0c;可以将Allegro中交换的管脚或重新编排的位号&#xff0c;一键更新到原理图中。 反标流程 从Capture输出最新网表文件&#xff1a; Capture Menu -> Tools -> Creat Netlist将最终的PCB设计文件放在…

Java:MybatisPlus--条件构造器

1、条件构造器类别 ①wrapper&#xff1a;抽象类&#xff0c;条件类的顶层&#xff0c;提供了一些获取和判断相关的方法。 ②AbstractWrapper&#xff1a;抽象类&#xff0c;Wrapper的子类&#xff0c;提供了所有的条件相关方法。 ③AbstractLambdaWrapper&#xff1a;抽象类…

对矩阵规模序列<5,10,3,12,5,50,6>,求矩阵链最优括号化方案

对矩阵规模序列<5,10,3,12,5,50,6>,求矩阵链最优括号化方案 理解符号的含义 n6 矩阵A1A2A3A4A5A6 本质是找一个最优的子结构 1.重要的递推公式 2.关键是求最小的m[i,j]就是乘积次数最少的。 k 的位置只有 j − i 种可能 3.下面是详细的解题的方案 根据矩阵链乘法问题&am…