wxPython和pycairo练习记录14

【Windows】 解决联想为主的所有自带摄像头(integrate camera)打不开的毛病(特别点名小新、thinkbook、thinkpad、y7000...) 解决联想系列电脑打不开自带摄像头的问题 阅读详情

wxPython和pycairo练习记录14

继续之前的坦克游戏。碰撞检测技术像什么四叉树、凸包,看不懂啊,所以先从成熟的 pygame 框架里抠出几个能用到的。

pygame 介绍

pygame 是一个利用 SDL(c语言编写)库的写的一个游戏库。
那么游戏的基本流程是什么,说白了就是下面这个事情:

  1. 检查玩家输入(事件)
  2. 判断元素间有无冲突(比如子弹碰撞、碰到补给、碰到怪物等)
  3. 根据信息绘制屏幕上的元素
  4. 重复1、2、3步骤
    pygame最小开发框架

以上内容出自https://www.bilibili.com/read/cv23670475/ 作者:教娃学编程

从上面 pygame 的介绍来看,和 wxPython 工作流程基本是一样的。

抠代码,pygame 中的碰撞检测

pygame 中的碰撞检测

文档:
https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_rect

源码:
https://github.com/pygame/pygame/blob/main/src_py/sprite.py
https://github.com/pygame/pygame/blob/main/src_c/rect.c

之前写坦克游戏并没有明确组合多个 Sprite 对象,还是先只考虑独立的 Sprite 吧。这样,需要用到和改写的方法只有 collide_rect、collide_rect_ratio、collide_circle、collide_circle_ratio、collide_mask。

观察了一下,发现这些方法其实可以直接把待检测 Sprite 对象作为参数,都可以独立出来,而不需要和 Sprite 类绑定。

collide_rect、collide_rect_ratio

这部分较简单,比较根据 Sprite 对象坐标和尺寸生成的矩形的四个顶点坐标,判断是否有重合。缩放是相对 Sprite 对象中心点进行缩放,得到新的操作矩形,然后判断重合。
collide_rect

class Collision:

    @staticmethod
    def inflate(rect, x, y):
        return wx.Rect(int(rect.X - x / 2), int(rect.Y - y / 2), int(rect.Width + x), int(rect.Height + y))

    @staticmethod
    def colliderect(A, B):
        if A.Width == 0 or A.Height == 0 or B.Width == 0 or B.Height == 0:
            return False
        return (min(A.X, A.X + A.Width) < max(B.X, B.X + B.Width) and
                min(A.Y, A.Y + A.Height) < max(B.Y, B.Y + B.Height) and
                max(A.X, A.X + A.Width) > min(B.X, B.X + B.Width) and
                max(A.Y, A.Y + A.Height) > min(B.Y, B.Y + B.Height))

    @staticmethod
    def collide_rect(left, right):
        return Collision.colliderect(left.GetRect(), right.GetRect())

    @staticmethod
    def collide_rect_ratio(left, right, ratio=1.0):
        leftrect = left.GetRect()
        width = leftrect.Width
        height = leftrect.Height
        leftrect = Collision.inflate(leftrect, width * ratio - width, height * ratio - height)

        rightrect = right.GetRect()
        width = rightrect.Width
        height = rightrect.Height
        rightrect = Collision.inflate(rightrect, width * ratio - width, height * ratio - height)

        return Collision.colliderect(leftrect, rightrect)

这里的矩形 wx.Rect 类似图形处理程序里选中图像后的调节边框,但它是横平竖直的。如果 Sprite 对象的 surface 是菱形或者其他不规则图形,collide_rect明显就不适用了。

collide_circle、collide_circle_ratio

简单通过勾股定理,先计算两个 Sprite 对象的圆心距离,然后通过对象的 wx.Rect 操作矩形计算圆半径,两个对象半径之和与之前的圆心距离比较。可以看到操作矩形是圆的外切正方形,圆半径与外切正方形对角线一半的比值为1:2^0.5,似乎没必要计算,直接等于矩形宽度的一半。如果不是正圆,这两个碰撞检测方法应该也不适用。
collide_circle

pygame 官方代码中,如果不指定半径,就直接用外切正方形对角线一半作为半径,明显不对啊。这里不是重点,所以就不去验证了。
https://github.com/pygame/pygame/blob/main/src_py/sprite.py
collide_circle

    @staticmethod
    def center(rect):
        return rect.X + rect.Width / 2, rect.Y + rect.Height / 2

    @staticmethod
    def collide_circle(left, right):
        leftrect = left.GetRect()
        rightrect = right.GetRect()

        leftcenterx, leftcentery = Collision.center(leftrect)
        rightcenterx, rightcentery = Collision.center(rightrect)
        xdistance = leftcenterx - rightcenterx
        ydistance = leftcentery - rightcentery
        distancesquared = xdistance ** 2 + ydistance ** 2

        leftradiussquared = (leftrect.Width ** 2 + leftrect.Height ** 2) / 4
        rightradiussquared = (rightrect.Width ** 2 + rightrect.Height ** 2) / 4

        return distancesquared < leftradiussquared + rightradiussquared

    @staticmethod
    def collide_circle_ratio(left, right, ratio=1.0):
        leftrect = left.GetRect()
        rightrect = right.GetRect()
        leftcenterx, leftcentery = Collision.center(leftrect)
        rightcenterx, rightcentery = Collision.center(rightrect)
        xdistance = leftcenterx - rightcenterx
        ydistance = leftcentery - rightcentery
        distancesquared = xdistance ** 2 + ydistance ** 2

        ratio = ratio ** 2 / 4.0
        leftradiussquared = (leftrect.Width ** 2 + leftrect.Height ** 2) * ratio
        rightradiussquared = (rightrect.Width ** 2 + rightrect.Height ** 2) * ratio

        return distancesquared < leftradiussquared + rightradiussquared

单元测试

collide_mask还没改完,先把前面两个方法的测试代码抠过来。
https://github.com/pygame/pygame/blob/main/test/rect_test.py
https://github.com/pygame/pygame/blob/main/test/sprite_test.py

# -*- coding: utf-8 -*-
import unittest
from wx import Rect
from cairo import ImageSurface, FORMAT_ARGB32
from collision import Collision
from display import Sprite


class CollisionTest(unittest.TestCase):
    def setUp(self):
        self.s1 = Sprite(0, 0, ImageSurface(FORMAT_ARGB32, 50, 10))
        self.s2 = Sprite(40, 0, ImageSurface(FORMAT_ARGB32, 10, 10))
        self.s3 = Sprite(100, 100, ImageSurface(FORMAT_ARGB32, 10, 10))

    def test_inflate__larger(self):
        """The inflate method inflates around the center of the rectangle"""
        r = Rect(2, 4, 6, 8)
        r2 = Collision.inflate(r, 4, 6)

        self.assertEqual(Collision.center(r), Collision.center(r2))
        self.assertEqual(r.left - 2, r2.left)
        self.assertEqual(r.top - 3, r2.top)
        self.assertEqual(r.right + 2, r2.right)
        self.assertEqual(r.bottom + 3, r2.bottom)
        self.assertEqual(r.width + 4, r2.width)
        self.assertEqual(r.height + 6, r2.height)

    def test_inflate__smaller(self):
        """The inflate method inflates around the center of the rectangle"""
        r = Rect(2, 4, 6, 8)
        r2 = Collision.inflate(r, -4, -6)

        self.assertEqual(Collision.center(r), Collision.center(r2))
        self.assertEqual(r.left + 2, r2.left)
        self.assertEqual(r.top + 3, r2.top)
        self.assertEqual(r.right - 2, r2.right)
        self.assertEqual(r.bottom - 3, r2.bottom)
        self.assertEqual(r.width - 4, r2.width)
        self.assertEqual(r.height - 6, r2.height)

    def test_colliderect(self):
        r1 = Rect(1, 2, 3, 4)
        self.assertTrue(
            Collision.colliderect(r1, Rect(0, 0, 2, 3)),
            "r1 does not collide with Rect(0, 0, 2, 3)",
        )
        self.assertFalse(
            Collision.colliderect(r1, Rect(0, 0, 1, 2)), "r1 collides with Rect(0, 0, 1, 2)"
        )
        self.assertTrue(
            Collision.colliderect(r1, Rect(r1.right, r1.bottom, 2, 2)),
            "r1 does not collide with Rect(r1.right, r1.bottom, 2, 2)",
        )
        self.assertTrue(
            Collision.colliderect(r1, Rect(r1.left + 1, r1.top + 1, r1.width - 2, r1.height - 2)),
            "r1 does not collide with Rect(r1.left + 1, r1.top + 1, "
            + "r1.width - 2, r1.height - 2)",
        )
        self.assertTrue(r1.Intersects(Rect(r1.left + 1, r1.top + 1, r1.width - 2, r1.height - 2)))
        self.assertTrue(
            Collision.colliderect(r1, Rect(r1.left - 1, r1.top - 1, r1.width + 2, r1.height + 2)),
            "r1 does not collide with Rect(r1.left - 1, r1.top - 1, "
            + "r1.width + 2, r1.height + 2)",
        )
        self.assertTrue(
            Collision.colliderect(r1, Rect(r1)), "r1 does not collide with an identical rect"
        )
        self.assertFalse(
            Collision.colliderect(r1, Rect(r1.right, r1.bottom, 0, 0)),
            "r1 collides with Rect(r1.right, r1.bottom, 0, 0)",
        )
        self.assertTrue(
            Collision.colliderect(r1, Rect(r1.right, r1.bottom, 1, 1)),
            "r1 does not collide with Rect(r1.right, r1.bottom, 1, 1)",
        )
        self.assertTrue(r1.Intersects(Rect(r1.right, r1.bottom, 1, 1)))

    def test_collide_rect(self):
        # Test colliding - some edges touching
        self.assertTrue(Collision.collide_rect(self.s1, self.s2))
        self.assertTrue(Collision.collide_rect(self.s2, self.s1))

        # Test colliding - all edges touching
        self.s2.SetX(self.s3.GetX())
        self.s2.SetY(self.s3.GetY())

        self.assertTrue(Collision.collide_rect(self.s2, self.s3))
        self.assertTrue(Collision.collide_rect(self.s3, self.s2))

        # Test colliding - no edges touching
        self.s2.SetRect(Collision.inflate(self.s2.GetRect(), 10, 10))

        self.assertTrue(Collision.collide_rect(self.s2, self.s3))
        self.assertTrue(Collision.collide_rect(self.s3, self.s2))

        # Test colliding - some edges intersecting
        self.s2.SetX(self.s1.GetRect().right - self.s2.GetWidth() / 2)
        self.s2.SetY(self.s1.GetRect().bottom - self.s2.GetHeight() / 2)

        self.assertTrue(Collision.collide_rect(self.s1, self.s2))
        self.assertTrue(Collision.collide_rect(self.s2, self.s1))

        # Test not colliding
        self.assertFalse(Collision.collide_rect(self.s1, self.s3))
        self.assertFalse(Collision.collide_rect(self.s3, self.s1))

    def test_collide_rect_ratio__ratio_of_one_like_default(self):
        # collide_rect_ratio should behave the same as default at a 1.0 ratio.
        self.assertTrue(
            Collision.collide_rect_ratio(self.s1, self.s2, 1.0)
        )
        self.assertFalse(
            Collision.collide_rect_ratio(self.s1, self.s3, 1.0)
        )

    def test_collide_rect_ratio__collides_all_at_ratio_of_twenty(self):
        # collide_rect_ratio should collide all at a 20.0 ratio.
        self.assertTrue(
            Collision.collide_rect_ratio(self.s1, self.s2, 20.0)
        )
        self.assertTrue(
            Collision.collide_rect_ratio(self.s1, self.s3, 20.0)
        )

    def test_collide_circle__no_ratio_set(self):
        # collide_circle with no ratio set.
        self.assertTrue(
            Collision.collide_circle(self.s1, self.s2)
        )
        self.assertFalse(
            Collision.collide_circle(self.s1, self.s3)
        )

    def test_collide_circle_ratio__no_radius_and_ratio_of_one(self):
        # collide_circle_ratio with no radius set, at a 1.0 ratio.
        self.assertTrue(
            Collision.collide_circle_ratio(self.s1, self.s2, 1.0)
        )
        self.assertFalse(
            Collision.collide_circle_ratio(self.s1, self.s3, 1.0)
        )

    def test_collide_circle_ratio__no_radius_and_ratio_of_twenty(self):
        # collide_circle_ratio with no radius set, at a 20.0 ratio.
        self.assertTrue(
            Collision.collide_circle_ratio(self.s1, self.s2, 20.0)
        )
        self.assertTrue(
            Collision.collide_circle_ratio(self.s1, self.s3, 20.0)
        )


if __name__ == "__main__":
    unittest.main(verbosity=2)

单元测试

后续改完再发。

实战:爬取某小程序的订单数据(解析小程序 API 参数) 本文以美团外卖小程序为例,详细分析了电商类小程序订单数据接口的技术实现与采集方法。首先通过抓包定位核心接口,解析其请求参数;重点破解了token验证机制与sign签名加密算法,通过逆向分析还原参数生成逻辑;最后基于Python实现了订单数据的自动化爬取与存储。文章强调数据采集需遵守法律合规性,提供应对反爬机制的策略,并指出了必须在获得合法授权的前提下使用这些技术。该研究为数据采集工程师提供了实用的技术参考,但必须严格遵循"最小必要"原则,确保不违反平台规则和用户隐私保护法规。 阅读详情

相关推荐

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程 1.NVIDIA驱动检测及安装 2.Anaconda的安装 3.安装cuda、cudnn、pytorch 4.其他报错

aaaccc444的博客 2424

wxPython和pycairo练习记录10

一开始考虑不全面,后面写的时候就只有一个心思,烂代码,完成就好。代码创建控件实例是个痛苦的过程,因为做的基本都是重复的事,能用循环的最好写进循环,熟悉控件后推荐用 wxFromBuilder。

SmileBasic的博客 568

python 抖音采集_python爬取抖音视频的实例详解

import requestsimport jsonimport reimport osfrom pprint import pprint as ppimport queueclass DouYin:header = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*...

weixin_35795675的博客 1864

wxPython和pycairo练习记录2

因为要实现图像的显示和交互,今天添加两个基础的图像容器类。

SmileBasic的博客 971

用Python玩转Carla-Apollo联合仿真:手把手教你实现自动驾驶测试

本文详细介绍了如何使用Python实现Carla-Apollo联合仿真,从环境搭建到自动驾驶算法测试的全流程。通过Carla提供的高逼真仿真环境和Apollo的自动驾驶算法栈,开发者可以高效验证感知、规划和控制模块。文章包含环境配置、Python API操作、桥接实现及实战测试,为自动驾驶开发提供完整解决方案。

wasm7browser的博客 268

Docker部署FRP实现内网穿透

FRP是一款开源内网穿透工具,通过在公网服务器部署服务端(FRPS),内网设备运行客户端(FRPC)实现外部访问。支持TCP、UDP、HTTP等多种协议。部署时需配置服务端(如群晖NAS使用Docker)和客户端(如Windows下载可执行文件)。服务端需设置监听端口、控制面板及Token认证,客户端需指定服务器地址和相同Token。完成配置后可通过公网IP或域名访问内网资源,并在控制面板监控连接状态。

波哥技术栈 1602

wxPython和pycairo练习记录8

经过障碍物的编写,发现需要停止前进并重新梳理一下。1.新的检测项加入时,已经在向混乱发展。是时候用上封装变化的编程工具,用策略模式或状态模式重写。2.显示,在基类引入层级和优先级,不同层低层级先绘制,同层高优先级先绘制。3.范围的碰撞和本身的碰撞的作用顺序。还有像已经实现的碉堡,只有一个外层碰撞区域,如果要多加几层呢,最外层出现坦克,射速为1,再近一层射速为5,最近一层射速达到20。

SmileBasic的博客 387

智能车新手必看:如何用PID和差速转弯让小车跑得更稳(附代码示例)

本文详细介绍了智能车控制系统中PID算法和差速转弯的实现方法,包括位置式与增量式PID的选择、参数整定技巧以及编码器反馈的关键作用。通过代码示例和实战经验,帮助新手快速掌握智能车稳定行驶的核心技术,提升赛道表现。

mmm90的博客 122

wxPython和pycairo练习记录1

学习,分为学和习,学完了不练习,让大脑觉得不重要,会忘记。所以,我决定练习并记录 wxPython 和 pycairo 的代码编写,如果你也想试试请自行配置环境。wxPython官网:https://www.wxpython.org/pycairo官网:https://cairographics.org/pycairo/本机环境:WIN10因为没有相关完整项目经验,所以不能把全局都设计好,先从基本的迭代。...

SmileBasic的博客 283

学习C++的递归函数(包含汉诺塔讲解)

简单来讲,递归函数就是函数本身自己调用自己,那么函数又是什么呢?#include <stdio.h> //这行是头文件,不同的头文件可以用不同的函数int main() //这里就是一个main函数//这里是你要编写程序的内容return 0;(这是个小细节如下)所以我们平时用来练习的就是一个main函数,而且是一个整型类型的函数,而这也是最后一句话为什么要加一句 return 0;了,因为它最后要返回整数类型,其它整数也可以,但是大家规定为0,这是C++自带的函数。

2302_81032013的博客 2594

MySQL服务启动失败?手把手教你排查NET HELPMSG 3534错误(附完整修复流程)

本文针对Windows平台上MySQL服务启动失败并提示NET HELPMSG 3534错误的常见问题,提供了系统性的排查与修复指南。文章深入剖析了错误本质,并手把手教你通过查看MySQL错误日志、检查并初始化数据目录、修正Windows服务配置、排查my.ini配置文件陷阱等核心步骤,彻底解决这一棘手问题,帮助开发者和运维人员快速恢复数据库服务。

wdx0123456的博客 897

wxPython和pycairo练习记录3

现在的感觉像是学武功的人,对着一本秘籍瞎练,没有师父,也没有参照,不知对错。之前写的有很多混乱的地方,比如主 fps 对对象 fps 的作用,比如 MovieClip 对象 surface 的宽高及对继承方法 GetWidth 的影响,等等没有影响现有结果的地方。唯一检验的标准是,实现出想要的效果。这次想实现的是,在四个角生成敌方坦克,自动行驶,相互碰撞转向。...

SmileBasic的博客 354

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 88

wxPython和pycairo练习记录6

这次想要实现障碍物。

SmileBasic的博客 330

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

wxPython和pycairo练习记录17

按理说素材图片虽然是位图但因为是纯色,手动缩放显示都没问题,不知道为什么会这样,网上解释说是"Cairo 默认使用线性插值算法进行缩放操作,而线性插值会导致图像像素的颜色被平滑地混合,从而造成图像的模糊效果。不要当过程完美主义者,很容易自我攻击。素材中的 characters.gif,用 wx.Image 加载后,调用 GetAlpha 方法发现得到不正确的透明通道值,而且 HasAlpha 得到的结果是 False,因为没有正确解释透明通道数据,RGB 数据也错了,加载后整个图片都变成了粉色。

SmileBasic的博客 897

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

wxPython和pycairo练习记录9

想要实现的效果是,同时按下多个方向,无论松开或按下其他键,总是响应剩余最近按下的键,这里直接用列表存储处在按下状态的按键代码。测试 wxPython 按下多个方向后松开最近按下的,之前保持按住的会失效。那就不能靠按键直接改变坐标,只改变速度方向,然后坐标的计算移动交给定时器刷新。射击按键行为也交给定时器,只改变状态,不执行操作。效果看起来还不错。之后可以看到,坦克和砖墙碰撞时的回弹问题也没有了。...

SmileBasic的博客 449

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

wxPython和pycairo练习记录13

之前虽然通过设置窗口样式去掉了标题栏,但是背景看起来还是有些碍眼。通过 SetTransparent 只能调整整体透明度,文字和背景都透明了。希望实现的效果是背景透明,而文字不透明。

SmileBasic的博客 560

wxPython和pycairo练习记录19

pygame.mixer.Channel 这里的声道和音频文件的声道含义不一样,这里的声道是指播放通道,0 为第一个声道。在 wxPython 中 wx.adv.Sound 只能播放 WAV 格式的文件,或者在 UI 中调用 wx.media.MediaCtrl 控件,但素材里的音频还有 OGG 格式的,没法用 wxPython 在后台播放。测试的时候,只有设置同步播放 wx.adv.SOUND_SYNC 才有声音,后面再修改,所有代码都完成了如果还是这样就再创建一个线程来播放声音。

SmileBasic的博客 1044

wxPython和pycairo练习记录12

过年在家刷视频号直播时发现弹幕互动游戏,挺有意思的,刚好诠释了反射的用法。想要自己也做一个弹幕游戏,于是就有了这个基本的需求,先让弹幕滚动显示出来,直播时可以当作小挂件。

SmileBasic的博客 434

wxPython和pycairo练习记录4

继续写碰撞检测。

SmileBasic的博客 306

wxPython和pycairo练习记录11

了解事件机制是学习 wxPython 绕不过去的坎,结合各种资料和个人理解整理了一下,如果有问题请留言指出。

SmileBasic的博客 587

wxPython和pycairo练习记录7

继续写障碍,选几个典型的来写。有个问题,有调用图片文件的类,每次生成新实例,都重新加载一次图片。应该把素材统一加载为全局变量,具体使用只需要引用素材变量。积重难返,记住这个教训,以后写其他的再注意吧。...

SmileBasic的博客 503

wxPython和pycairo练习记录15

像素:是指在由一个数字序列表示的图像中的一个最小单位,称为像素。这里的像素并非我们平时所说的眼睛看到的点,它更像是屏幕上的一个网格,不同的显示设备可能有不同大小的格子。在 Python 中,我们可以方便地通过一些库读取图像的某个像素值。这个例子中,返回的像素值是 RGBA 数值元组。

SmileBasic的博客 416

wxPython和pycairo练习记录5

先不管稀烂的坦克碰撞检测,开始添加武器系统。

SmileBasic的博客 232

wxPython和pycairo练习记录18

Font.py 中 Font 类居然继承 Spritesheet 类来加载字符对应图片,还和 Sprites 类的功能差不多,总感觉哪里不太对。基本都没法写测试啊,后面待完成的是声音、鼠标键盘输入、碰撞检测、实体和主要显示类:面板、关卡、菜单、暂停画面。Camera.py 摄像机,这里的功能是记录坐标,跟随实体移动坐标。

SmileBasic的博客 396

wxPython和pycairo练习记录16

先找出没有依赖其他文件的代码,可以作为后续其他代码的零件,这里选择 https://github.com/mx0c/super-mario-python/blob/master/classes/Spritesheet.py。总之,将图像存储在 Surface 中的主要目的是为了提供一个统一的、灵活的、可移植的绘图接口,使得开发者可以更容易地进行绘图操作,并且可以轻松地将相同的绘图操作应用于不同的输出目标。在 Cairo 中,一切都被视为绘图操作,即使是对图像的修改也被视为在绘图上下文中进行的操作。

SmileBasic的博客 380
上一篇: 嘿,别蹉跎
下一篇: wxPython和pycairo练习记录15
SmileBasic
博客等级 码龄5年 347粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值