pygame实现物体运动拖尾尾迹-渐隐版

news2024/9/24 3:22:18

在这里插入图片描述

解说文案:

视频讲解:https://www.bilibili.com/video/BV14w411S74E/

上一集我们实现了物体本体形式的拖尾,这一集我们基于上一集来实现物体逐渐变透明到消失的拖尾。

上集我们也说过,逐渐变透明到消失的物体拖尾只不过是给物体添加一个透明度,然后透明度逐渐变化的效果。

那么我们只需要掌握透明度物体绘制方法即可。

如果我们去问gpt,如何在pygame中画一个半透明的圆,它会给你这样的答案,但你真正使用的时候,会发现它不是半透明的。在网上查阅后,我发现原来pygame的屏幕不支持显示rgba颜色。

但是我们可以曲线救国实现这一效果,实现方式如下:我们可以先创建一块支持rgba颜色的区域a,将图形绘制在a上面,再将a绘制在主窗口上。

其实实现起来并不难,我们只需要封装一个支持rgba颜色的绘制函数即可。这里我们给出一个绘制圆的函数,其他图形同理,我会在笔记中给出其他的代码。

我们来看这个用于绘制带有透明度的圆形函数的实现,首先计算一个包含圆形的矩形区域,然后为矩形区域创建带有透明度的Surface,其次是在Surface上绘制圆形,最后将将Surface绘制到主窗口上。
看完这个函数后,我们再来看完整的代码。

如果你看了上一期的视频,那么完整的代码理解起来非常的简单,它与上期代码的唯一不同就在于在记录圆的数组中也记录了每个圆的透明度,绘制圆函数也加了一个透明度的数值,然后在每次绘制的时候去减少圆的透明度,最后我们删掉透明度小于0的物体以防止物体数量的无限增长。

就这样便实现了视频开始的效果,我们来运行一下看看。

同上集一样,我们依旧可以通过改变代码里的参数来实现改变拖尾效果。比如这里我们增大透明度减少的速度,这样拖尾就会消失的更快,这样就相当于缩短了拖尾。

我们就可以看到这样的效果。

其他的参数我们不一一举例,举一反三是编程的必备思维,我们应该去锻炼这种思维。好了,本集内容到此结束。后面还有各种炫酷效果,关注up主不迷路呦~

代码

import pygame
import sys

# 初始化,创建屏幕,设置窗口的标题,即游戏名称
pygame.init()
screen = pygame.display.set_mode((600, 400))
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.get_size()]
ball_velocity = [0, 0]

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

# 定义一个函数,用于绘制带有透明度的圆形
def draw_circle_alpha(surface, color, center, radius):
    # 计算一个包含圆形的矩形区域
    target_rect = pygame.Rect(center, (0, 0)).inflate((radius * 2, radius * 2))
    # 创建带有透明度的Surface
    shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
    # 在Surface上绘制圆形
    pygame.draw.circle(shape_surf, color, (radius, radius), radius)
    # 将Surface绘制到指定位置
    surface.blit(shape_surf, target_rect)

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

    screen.fill((255,255,255))

    # 获取鼠标位置
    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(), ball_color,255))  # 初始透明度为255

    # 更新和绘制轨迹点
    for i, (point, color,a) in enumerate(trail_points):
        draw_circle_alpha(screen, (*color,a), point, 20)
        # 尾迹长
        # trail_points[i]=(point, color,a-5)
        # 尾迹短
        trail_points[i]=(point, color,a-50)

    # 删除透明度为0的轨迹点
    trail_points = [p for p in trail_points if p[2] > 0]

    # 更新屏幕
    pygame.display.flip()

    # 控制帧率
    pygame.time.Clock().tick(60)

pygame.quit()
sys.exit()

其他图案封装函数

import pygame  # 导入pygame库

# 定义一个函数,用于绘制带有透明度的矩形
def draw_rect_alpha(surface, color, rect):
    shape_surf = pygame.Surface(pygame.Rect(rect).size, pygame.SRCALPHA)  # 创建带有透明度的Surface
    pygame.draw.rect(shape_surf, color, shape_surf.get_rect())  # 在Surface上绘制矩形
    surface.blit(shape_surf, rect)  # 将Surface绘制到指定位置

# 定义一个函数,用于绘制带有透明度的圆形
def draw_circle_alpha(surface, color, center, radius):
    target_rect = pygame.Rect(center, (0, 0)).inflate((radius * 2, radius * 2))  # 创建一个包含圆形的矩形区域
    shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)  # 创建带有透明度的Surface
    pygame.draw.circle(shape_surf, color, (radius, radius), radius)  # 在Surface上绘制圆形
    surface.blit(shape_surf, target_rect)  # 将Surface绘制到指定位置

# 定义一个函数,用于绘制带有透明度的多边形
def draw_polygon_alpha(surface, color, points):
    lx, ly = zip(*points)  # 获取多边形顶点的x和y坐标
    min_x, min_y, max_x, max_y = min(lx), min(ly), max(lx), max(ly)  # 计算多边形的外接矩形
    target_rect = pygame.Rect(min_x, min_y, max_x - min_x, max_y - min_y)  # 创建一个包含多边形的矩形区域
    shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)  # 创建带有透明度的Surface
    pygame.draw.polygon(shape_surf, color, [(x - min_x, y - min_y) for x, y in points])  # 在Surface上绘制多边形
    surface.blit(shape_surf, target_rect)  # 将Surface绘制到指定位置

pygame.init()  # 初始化pygame库
window = pygame.display.set_mode((250, 250))  # 创建窗口大小为250x250的显示窗口
clock = pygame.time.Clock()  # 创建时钟对象,用于控制帧率

background = pygame.Surface(window.get_size())  # 创建一个大小与窗口相同的Surface
ts, w, h, c1, c2 = 50, *window.get_size(), (160, 160, 160), (192, 192, 192)

# 创建棋盘格状的背景
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

run = True
while run:
    clock.tick(60)  # 控制帧率为60帧每秒
    for event in pygame.event.get():  # 获取事件
        if event.type == pygame.QUIT:  # 如果事件类型为QUIT,即关闭窗口事件
            run = False  # 设置循环标志为False,退出循环

    window.blit(background, (0, 0))  # 将背景绘制到窗口上

    # 使用定义的函数绘制带有透明度的矩形、圆形和多边形
    draw_rect_alpha(window, (0, 0, 255, 127), (55, 90, 140, 140))
    draw_circle_alpha(window, (255, 0, 0, 127), (150, 100), 80)
    draw_polygon_alpha(window, (255, 255, 0, 127),
        [(100, 10), (100 + 0.8660 * 90, 145), (100 - 0.8660 * 90, 145)])

    pygame.display.flip()  # 更新显示

pygame.quit()  # 退出pygame库
exit()  # 退出程序

总结

🐋 🐬 🐶 🐳 🐰 🦀☝️ ⭐ 👉 👀

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


更多宝藏

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

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

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

相关文章

Qt无边框青绿色主题

收费产品,学生党、闹眼子党勿扰 收费金额:500元 1 概述 最近因项目需要,写了一个炫酷的青绿色、无边框界面,和3DSMax的界面有点类似。 2 截图 首先看看3DSMax的界面 不知道大家看出来没,这个ui其实很简单&#xff…

15. Docker实战监控神器Uptime Kuma

目录 1、前言 2、什么是Uptime Kuma? 3、Docker部署Uptime Kuma 3.1、安装 3.2、访问 3.3、配置 3.4、集成飞书机器人 3.5、效果 1、前言 在利用Docker部署项目时,我们需要时刻知道已部署的容器的状态。且通常会把所有的站点监控配置到云平台上&#xff0c…

算法通关村十三关 | 辗转相除法、素数和丑数

1. 辗转相除法 辗转相除法又称欧几里得算法,求两个数的最大公因数,希腊数学家喜欢用图形来处理问题,于是将要求最大公约数问题转化为,以两个数字构成矩形,寻找可以铺满整个矩形的最大正方形的边长问题。 题目 例如8和1…

基于Spring Boot的企业门户网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的企业门户网站设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java springboot…

<Xilinx AXI4> AXI4_Full(一)总线说明

目录 01 AXI4-Full Brust传输介绍 write burst transcation read burst transcation 02 AXI4_Full读写事务接口说明 写事务(Write transaction) AXI4-Full_master写事务逻辑信号 AXI4-Full_slave写事务逻辑信号 读事务(Read transaction) AXI4-Full_master读事务逻辑信…

删除、移动、复制文件时总是要卡在99%一段时间解决方法

Win10文件夹重命名、移动、删除等操作卡顿3-5秒。 原因分析: 查看发现,卡顿期间资源管理器无响应,并且其高度占用CPU资源,但是对于非文件夹文件操作没有问题。 解决方案: 1、双击“此电脑”,选择“查看”,再选择“选…

基于 Spring 前后端分离版本的论坛系统

访问地址:http://8.130.142.126:18080/sign-in.html 代码获取:基于 Spring 前后端分离版本的论坛系统: 基于 Spring 前后端分离版本的论坛系统 一.前置知识 1.软件生命周期 a. 可行性研究:通过分析软件开发要求,确定软件项目的性质、目标和规模&am…

苹果电脑同时使用内外网

公司用的有线的内网,自己要用无线的外网。插上网线就不能用wifi,很烦。于是学到了一种插上网线也能使用wifi的方法。 第一步,调整wifi和网线的顺序 系统偏好设置-网络-左下角设定服务顺序,把wifi调到有线网络前面。 第二步&…

盘点2023最新国内SaaS系统TOP20排名,中国的SaaS系统有未来吗?

在SaaS系统飞速发展的2023年,国内涌现出了一大批优秀的SaaS系统公司,都有哪些企业位列其中呢?SaaS系统有着什么样独特的竞争力,能够不断发展,成为目前市面上发展的较好的云服务框架?SaaS究竟是什么&#xf…

21.3 CSS 背景属性

1. 背景颜色 background-color属性: 设置元素的背景颜色. 它可以接受各种颜色值, 包括命名颜色, 十六进制颜色码, RGB值, HSL值等.快捷键: bctab background-color:#fff;<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

微芯I/O控制器瞄准工业与嵌入式运算应用

微芯科技(Microchip Technology)日前发布SCH322X系列I/O控制器新品&#xff0c;该系列产品基于工业及嵌入式开发工程师的需求而开发&#xff0c;功能丰富且具高灵活性。新一代I/O控制器系列拥有尺寸更小的包装和更长的产品生命周期&#xff0c;可运用于更多经济型工业及嵌入式开…

DSP_TMS320F28377D_算法加速方法3_使用TMU库加速

继上两篇方法 DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行_江湖上都叫我秋博的博客-CSDN博客 DSP_TMS320F28377D_算法加速方法2_添加浮点运算快速补充库rts2800_fpu32_fast_supplement.lib_江湖上都叫我秋博的博客-CSDN博客 之后&#xff0c;本文继续讨论第三种DSP算法…

Google Pay外包开发流程

集成 Google Pay 可以为你的应用提供方便的支付体验。下面是一个简要的 Google Pay 集成流程概述&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.创建 Google 开发者账号&#xff1a; 如果你还没有…

激活函数总结(二十六):激活函数补充(Probit、Smish)

激活函数总结&#xff08;二十六&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Probit 激活函数2.2 Smish 激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、…

CUDA小白 - NPP(2) - Arithmetic and Logical Operations(1)

cuda小白 原文链接 NPP GPU架构近些年也有不少的变化&#xff0c;具体的可以参考别的博主的介绍&#xff0c;都比较详细。还有一些cuda中的专有名词的含义&#xff0c;可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xff0c…

Sentinel配置的blockHandler方法不生效

①首先配置流控的资源名跟SentinelResource中的Value配置的一定要一直且唯一 ②其次blockhandler后面的方法一定要跟下面指定的方法名称是一样的 ③也就是我犯下的错误&#xff0c;一定要注意是上面那个才是Sentinel的&#xff0c;下面的是sun公司的…我说呢&#xff0c;一直…

Java“牵手”京东商品列表数据,关键词搜索京东商品数据接口,京东API申请指南

京东商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取京东商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问京东商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

Nacos 配置管理及相关使用

文章目录 Nacos 配置管理一、统一配置管理1、在Nacos 中添加配置文件2、从微服务拉取配置3、配置实现步骤&#xff08;1&#xff09;引入 nacos-config 依赖&#xff08;2&#xff09;添加 bootstrap.yml&#xff08;4&#xff09;在 nacos 中添加配置 二、配置热更新1、配置热…

Sentry 是一个开源的错误监控和日志聚合平台-- 通过docker-compose 安装Sentry

概述 Sentry 是一个开源的错误监控和日志聚合平台&#xff0c;用于帮助开发团队实时监控和调试应用程序中的错误和异常。它可以捕获应用程序中的错误和异常&#xff0c;并提供详细的错误报告&#xff0c;包括错误堆栈跟踪、环境信息、用户信息等。这些报告可以帮助开发团队快速…

关于C语言参数传递的

一、C语言参数传递是整体带入 #include <stdio.h> #define DF(a,b) (a2*b) int main() { int s5; int k DF((s1),(s-3)); printf("%d",k); }输出结果 原因&#xff1a; #define DF(a,b) (a2*b) int k DF((s1),(s-3)); //等效 int k DF((s1)2 * (s-3)); …