pygame实现物体运动拖尾尾迹

前言

😎🥳😎🤠🤖🙈💭🍳🍱

本文我们来讲一下如何使用pygame实现一个拖尾特效。


主要内容

🦞🦐🦀🦑🦪

讲解:

一分钟一个pygame案例,在这两集我们将要学习一下如何使用pygame来实现视频中的物体运动尾迹拖尾效果,非常非常简单。

当然我们这里只是实现了物体本身拖尾,透明度递减的物体拖尾,以及彩色线条拖尾,其实还具有粒子效果拖尾,纹理图拖尾矢量图形拖尾等,后面我们有机会或者大家想看的话也可拿出来讲一讲。 下面我们还是老规矩,先讲效果实现思路,再讲效果的实现代码。

首先,你可以暂停视频五秒钟,思考一下,如果是你,你会如何实现这样的效果。

好了,现在揭晓答案,无论是前面的小球,还是后面的线条,其实他们都是一样的原理,我们快速的移动鼠标可以发现运动尾迹其实就是物体经过的地方依旧绘制有物体图案,然后在一定时间后消失组成的效果。

其实我们可以将这一过程抽象为有一个长度固定的物体数组,将这些物体全部绘制在窗口上,之所以不运动的时候你只看到了一个物体,是因为所有的物体重合了,所以你只能看到一个。而运动的时候所有的物体的坐标不再一致,所以会显示一连串。

没错,就是这么简单,就是画一个圆与多个圆的区别,那么知道这一原理后,我们绘制出透明度逐渐减少的尾迹也只是改变下颜色的问题。但在pygame的主窗口中,是不支持rgba颜色的,所以我们后面也会给出解决方案。

现在,我们先来看绘制多个物体实现尾迹的实现代码。

还是老规矩,我们不再讲那些基础的代码,只讲与本视频知识点有关系的代码。我们在这里定义小球的半径和颜色,在这里定义小球的初始位置和初始速度,然后定义一个列表用于存储多个物体。

在事件的循环中,我们不断获取鼠标的位置,并且根据鼠标位置和小球的位置去更新小球的速度,再根据小球速度去更新小球的位置。然后将小球的位置信息添加进小球数组,这样就实现了记录路径上小球的功能。

然后我们用白色填充屏幕,接着画出列表中每一个小球,最重要的是,我们最多每次取出列表后20个小球,防止小球的无限增长。

好了,代码已经讲解完毕,是不是非常简单。下面我们来看一下运行的效果。

当然,显示的效果这些参数都是可以修改的,比如小球的颜色,大小,乃至小球拖尾的长度。

比如说我们这里将小球大小改为100,颜色改为黑色,拖尾长度改为5个。可以看到这样的效果。

怎么样,是不是很简单。下面几集我们来介绍如何绘制透明度变化的物体拖尾与渐变拖尾。关注阿婆主,获取第一手知识。

代码

python 复制代码
import pygame
import sys

# 初始化并屏幕大小,创建屏幕,设置窗口的标题,即游戏名称
pygame.init()
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_icon(pygame.image.load('logo.png').convert())
pygame.display.set_caption('编程启航')

# 小球属性
ball_radius = 20
ball_color = (0, 0, 255)

# 小球的位置和速度
ball_pos = [screen_width // 2, screen_height // 2]
ball_velocity = [0, 0]

# 拖尾效果所需的轨迹点
trail_points = []

# 游戏循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 获取鼠标位置
    mouse_pos = pygame.mouse.get_pos()

    # 更新小球速度
    ball_velocity[0] = (mouse_pos[0] - ball_pos[0]) * 0.1
    ball_velocity[1] = (mouse_pos[1] - ball_pos[1]) * 0.1

    # 更新小球位置
    ball_pos[0] += int(ball_velocity[0])
    ball_pos[1] += int(ball_velocity[1])

    # 添加当前位置到轨迹点列表
    trail_points.append(ball_pos.copy())

    # 清空屏幕
    screen.fill((255, 255, 255))

    # 更新和绘制轨迹点
    for i, point in enumerate(trail_points):
        pygame.draw.circle(screen, ball_color, point, ball_radius)
    
    # 控制小球数量
    trail_points = trail_points[-20:]

    # 更新屏幕,控制帧率
    pygame.display.flip()
    pygame.time.Clock().tick(60)

pygame.quit()
sys.exit()

总结

🐋 🐬 🐶 🐳 🐰 🦀☝️ ⭐ 👉 👀

如果你对这篇文章感兴趣,欢迎在评论区留言,分享你的想法和建议。如果你喜欢我的博客,请记得点赞、收藏和关注我,我会持续更新更多有用的网页技巧和教程。谢谢大家!


更多宝藏

🍇🍉🍊🍏🍋🍅🥝🥥🫒🫕🥗 项目仓库看这里🤗: github.com/w-x-x-w gitee.com/w-_-x 公众号名称😮:编程启航 博客文章看这里🤭: blog.csdn.net/weixin_6265... 视频推送看这里🤤: space.bilibili.com/1909782963

相关推荐
Dovir多多3 小时前
Python数据处理——re库与pydantic的使用总结与实战,处理采集到的思科ASA防火墙设备信息
网络·python·计算机网络·安全·网络安全·数据分析
沐霜枫叶5 小时前
解决pycharm无法识别miniconda
ide·python·pycharm
途途途途5 小时前
精选9个自动化任务的Python脚本精选
数据库·python·自动化
蓝染然6 小时前
jax踩坑指南——人类早期驯服jax实录
python
许野平6 小时前
Rust: enum 和 i32 的区别和互换
python·算法·rust·enum·i32
问道飞鱼6 小时前
【Python知识】Python进阶-什么是装饰器?
开发语言·python·装饰器
AI视觉网奇6 小时前
Detected at node ‘truediv‘ defined at (most recent call last): Node: ‘truediv‘
人工智能·python·tensorflow
GuYue.bing7 小时前
网络下载ts流媒体
开发语言·python
牛顿喜欢吃苹果7 小时前
linux创建虚拟串口
python
-Mr_X-7 小时前
FFmpeg在python里推流被处理过的视频流
python·ffmpeg