Pygame——动画的灵活控制,弹弹球实例

2023-10-11 17:59

本文主要是介绍Pygame——动画的灵活控制,弹弹球实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节视频

【零基础 Python体验课】第四季 pygame游戏开发


关注我的人就知道我的Github上也有这些代码和文档

Pygame动画的灵活控制

做动画不可能只让一个小球动起来就完了,所以控制好每一个部件是最重要的,在帧动画内部,最好不要出现太多固定的数字,最好使用变量存储代替,这样更灵活控制,直接修改变量的大小不就可以直接修改很多地方吗?但是固定的数字就无法实现。

这次我们来一个使用小球弹来弹去,scratch中模拟。[是这样,我本人也很喜欢Scratch,简单且能模拟很多功能,从几个方块中总结思路很好💪
在这里插入图片描述

下面来说怎么实现Pygame的弹弹球,还是纵向移动,就是以Y轴。

重点:如果制作中出现可能变化的量尽量赋值为变量,不要是固定数字,Y轴可变,存入变量y,这说起来简单,但是做起来难!

让球移动的思路就是让球的Y轴变化,每次擦除上次的圆球,然后Y轴增加再画一次。这是一个球的向下运动,试试看,球运动到末尾就下去了,窗口边界拦不住它。说明Pygame窗口是没有给你设置边界的,需要你自己写判断。绘制圆球的时候有一个值是半径,存到r变量里,那么只需要判断y的值是不是大于WIN_HEIGHT(窗口高度常量)-r(圆半径),就知道是不是到达了底边界,顶部就直接是y==r。那么向下运动的时候是y += 1,那么向上的时候y怎么办,既然每次增长的量会变,那么就把1变成变量y_speed,每次y += y_speed,在到达底部的时候将y_speed = -1,在到达顶部的时候y_speed = 1就行了。于是有了清晰的思路,代码出现!核心部分

while True:# 帧动画编辑位置# if num % 10000 == 0:#     pygame.draw.circle(window, (255, 255, 255), (100, y), 50)#     y = y + 1#     pygame.draw.circle(window, (255, 0, 0), (100, y), 50)#     pygame.display.update()# num += 1if num % 10 == 0:sleep(0.001)pygame.draw.circle(window, (255, 255, 255), (100, y), r)y = y + y_speedif y > 550:y_speed = -1if y < 50:y_speed = 1pygame.draw.circle(window, (255, 0, 0), (100, y), r)pygame.display.update()num += 1for event in pygame.event.get():if event.type == pygame.QUIT:exit()

中间if语句是最关键的,sleep函数需要from time import sleep

那我们让Pygame的行动更智能一点,可以支持输入一个速度,然后让它移动,将一个正数变量转为负数只需要这样-var就够了。还可以加上窗口,使用tkinter制作。

完整代码

import pygame
from   time import sleep
from tkinter import *
from tkinter import messageboxWIN_WIDTH = 400
WIN_HEIGHT = 600
pygame.init()
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption("动画的灵活运用")
titlelineico = pygame.image.load("img/airplane.ico")  # 导入窗口图标,规格:32x32,格式:.ico
pygame.display.set_icon(titlelineico)  # 设置窗口图标
window.fill((255, 255, 255))
pygame.display.flip()y = 100
r = 50
pygame.draw.circle(window, (255, 0, 0), (100, y), r)
pygame.display.update()def get_speed(event):global y_speedif txt.get() == "":messagebox.showwarning("Error", "输入为空,按下确定重试")else:y_speed = int(txt.get())root.destroy()root = Tk()
root.geometry("300x180")
root.title("AskSpeed")
lbf = LabelFrame(root, text='输入Y轴移动速度,回车确定')
lbf.pack()
txt = Entry(lbf, width=30)
txt.bind("<Return>", get_speed)
txt.focus_set()
txt.pack()
root.mainloop()
num= 0
while True:# 帧动画编辑位置# if num % 10000 == 0:#     pygame.draw.circle(window, (255, 255, 255), (100, y), 50)#     y = y + 1#     pygame.draw.circle(window, (255, 0, 0), (100, y), 50)#     pygame.display.update()# num += 1if num % 1000 == 0:sleep(0.001)pygame.draw.circle(window, (255, 255, 255), (100, y), r)y = y + y_speedif y > 550:y_speed = -y_speedif y < 50:y_speed = -y_speedpygame.draw.circle(window, (255, 0, 0), (100, y), r)pygame.display.update()num += 1for event in pygame.event.get():if event.type == pygame.QUIT:exit()

这个弹球游戏结束,我遇到一个问题,一个球在移动的时候,擦除上一次的记录,会把在路线中的其他控件同样擦掉,比如图片,所以必须在移动的同时重新渲染在路径上的部件

在这里插入图片描述
好吧,这是小埋,我就喜欢!


解决方法:

每次刷新图片,window.blit(img, (180, 180)) # 重新渲染

while flag:sleep(0.02)pygame.draw.circle(window, (255, 255, 255), (150, y), r)window.blit(img, (180, 180)) # 重新渲染y += 4r += 1pygame.draw.circle(window, (255, 0, 0), (150, y), r)pygame.display.update()# 4.检测事件for event in pygame.event.get():  # 获取事件# 检测关闭按钮被点击的事件if event.type == pygame.QUIT:exit()  # 结束这一个线程# flag = False

在这里插入图片描述
就OK了,这次到这里,麻烦点赞关注!谢谢

这篇关于Pygame——动画的灵活控制,弹弹球实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/189842

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但