草庐IT

Pygame入门 2022 (2)

一只大鸽子 2024-01-05 原文

动画

前面已经知道如何显示图片,只需要改变图片(位置),就可以做出动画的效果了。
首先和前面一样,我们把一只蜗牛显示在窗口中:

snail_surface = pygame.image.load('graphics/snail/snail1.png')
...
screen.blit(snail_surface,(600,250))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWyPFMCL-1661269394793)(assets/snail_static.png)]

只需要修改蜗牛的位置,就可以让蜗牛动起来了:

snail_surface = pygame.image.load('graphics/snail/snail1.png')
snail_x_pos = 600
...

snail_x_pos -= 1
screen.blit(snail_surface,(snail_x_pos,250))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbPi9DhS-1661269394795)(assets/snail_move.gif)]

很“快”,蜗牛会跑出屏幕外。如果你想让蜗牛一直跑下去,可以用一个if语句,当蜗牛跑出去时,重置蜗牛位置:

if snail_pos_x < -100 : snail_pos_x = 800

这样蜗牛就会一直跑下去了。

拖影

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tx9icZsf-1661269394797)(assets/tuoying.gif)]
如果我们把背景注释掉,会发现,蜗牛的移动形成了一个轨迹。
实际上,Pygame每次都会在原来的基础上绘制一次(而不会清空之前的图像),如果没有重新绘制背景将之前的蜗牛遮盖掉,就会出现这种情况。

convert

sky_surface = pygame.image.load('graphics/Sky.png').convert()
ground_surface  = pygame.image.load('graphics/ground.png').convert()
test_font = pygame.font.Font('font/Pixeltype.ttf',50)
text_surface = test_font.render("My game",False,'Black')

snail_surface = pygame.image.load('graphics/snail/snail1.png').convert_alpha()

在加载png后用.convert() 可以将图片转化成Pygame更适合处理的形式,加快运行速度。
对于物体,使用.convert_alpha(),否则会出现奇怪的边框。

长方形

长方形(Rectangles)
作用:
提供surface精确位置;
基本的碰撞
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8hweJcLr-1661269394798)(assets/rect.png)]
可以使用pygame.Rect() 创建长方形,但是一般我们是从图片中创建。这里新建一个人物,并从中创建长方形:

player_surf = pygame.image.load('graphics/Player/player_walk_1.png').convert_alpha()
player_rect = player_surf.get_rect(midbottom=(80,300))

然后,我们就可以通过长方形来修改图片位置:

    ...
    player_rect.left += 1
    screen.blit(player_surf,player_rect)

类似地,我们把之前的蜗牛也用长方形来控制:

snail_surface = pygame.image.load('graphics/snail/snail1.png').convert_alpha()
snail_rect = snail_surface.get_rect(midbottom=(600,300))

    ...
    snail_rect.x -= 4
    if snail_rect.right <= 0: snail_rect.left = 800
    screen.blit(snail_surface,snail_rect)

长方形的碰撞检测

Collsion

两个长方形之间碰撞检测:
rect1.colliderect(rect2)

长方形和点的碰撞检测,这很适合检测鼠标和长方形的碰撞。
rect1.collidepoint((x,y))

获取鼠标位置的方式:

1.通过pygame.mouse
通过get_pos()获取鼠标位置(x,y),
通过get_pressed() 获取鼠标(左,中,右)是否按下。


mouse_pos = pygame.mouse.get_pos()
if player_rect.collidepoint(mouse_pos):
    print(pygame.mouse.get_pressed())

2.通过event

if event.type == pygame.MOUSEMOTION:
    print(event.pos)

长方形的绘制

pygame.draw.xx 可以绘制各种图形,包括长方形,圆形,直线等。可以去官网文档查看,这里只展示长方形:

pygame.draw.rect(screen,'Pink',score_rect)
pygame.draw.rect(screen,'Pink',score_rect,10)

颜色


Pygame支持RGB及其16进制形式显示颜色。

RGB 即(Red,Green,Blue) 三原色数组,值为0-255.
hexadecimal(16进制形式)为 #rrggbb
在绘图时,可以通过rgb或其16进制形式指定颜色。

pygame.draw.rect(screen,'#c0e8ec',score_rect)

角色

1.键盘输入


1.pygame.key
pygame.key.get_pressed()会返回一个字典,记录每个键的是否被按。

keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
    print("JUMP")

2.event loop

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE:
        print("JUMP")

pygame.keys 适合与类相关的控制,
事件循环适合更一般的事情,例如关闭游戏。

2. 跳跃和掉落(重力)

设置和现实中类似的重力,跌落时会加速下降,

player_gravity = 0
...
    player_gravity += 1
    player_rect.y += player_gravity

(这里用词有误,实际上重力是不变的,这里的player_gravity实际是玩家在y轴移动的距离。)
跳跃是掉落的相反方向:

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE and player_rect.bottom>=300:
        player_gravity -= 20

3. 地板

我们不想人物一直掉落,他应该在掉到地板的时候就停止掉落:

if player_rect.bottom >= 300:
    player_rect.bottom = 300
    player_gravity = 0

附上完整代码:

import pygame
from sys import  exit

# 初始化 引擎
pygame.init()
# 设置屏幕
screen = pygame.display.set_mode((800,400)) # 宽度800,高度400
pygame.display.set_caption('Runner') # 设置标题
# 时钟
clock = pygame.time.Clock()
# surface
sky_surface = pygame.image.load('graphics/Sky.png').convert()
ground_surface  = pygame.image.load('graphics/ground.png').convert()
test_font = pygame.font.Font('font/Pixeltype.ttf',50)
score_surf = test_font.render("My game", False, 'Black')
score_rect = score_surf.get_rect(center=(400,50))

snail_surface = pygame.image.load('graphics/snail/snail1.png').convert_alpha()
snail_rect = snail_surface.get_rect(midbottom=(600,300))

player_surf = pygame.image.load('graphics/Player/player_walk_1.png').convert_alpha()
player_rect = player_surf.get_rect(midbottom=(80,300))
player_gravity = 0

while True:
    # 获取用户输入
    for event in pygame.event.get():
        # 用户点击退出,关闭游戏
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and player_rect.bottom>=300:
                player_gravity -= 20
    # 绘图,更新
    screen.blit(sky_surface, (0, 0))  # 将test_surface放到screen上。(0,0):放置后test_surface的左上角位于screen的(0,0)处
    screen.blit(ground_surface,(0,300))

    pygame.draw.rect(screen,'#c0e8ec',score_rect)
    pygame.draw.rect(screen,'#c0e8ec',score_rect,10)

    screen.blit(score_surf, score_rect)

    snail_rect.x -= 4
    if snail_rect.right <= 0: snail_rect.left = 800
    screen.blit(snail_surface,snail_rect)

    player_gravity += 1
    player_rect.y += player_gravity
    if player_rect.bottom >= 300:
        player_rect.bottom = 300
        player_gravity = 0
    screen.blit(player_surf,player_rect)


    pygame.display.update()
    clock.tick(60) # 不超过60 fps

有关Pygame入门 2022 (2)的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  3. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  4. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  5. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  6. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  7. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  8. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  9. ESP32学习入门:WiFi连接网络 - 2

    目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方

  10. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

随机推荐