转 第十九章 flash实用技巧 (2)(as3.0)

STM32N647X0HXQ CubeMX 配置参数释义手册 *算力层(CPU / 缓存 / 内存)**Cortex‑M55 最高约800 MHz(Overdrive),片内约,还有。CubeMX 里很多开关其实是在决定:代码跑多快、数据从哪读、要不要和 DMA 抢一致性。**安全层(TrustZone + RIF + OTP/BSEC)**N6 不是「一个程序随便摸所有寄存器」的传统 MCU。硬件把世界切成Secure(安全域)和Non‑Secure(非安全域),再用RIF给每个外设/内存加「门禁」。配错一项,轻则外设用不了,重则直接。 阅读详情

基于时间的动画
      如果要让动画中物体的速度是一致的,    那么基于时间的动画就是我们要使用的方法。  这
种方法在一些游戏中比较常用。我们知道,帧和计时器动画都不能以特定的速率播放。一个
复杂的动画在一台又老又慢的电脑上运行可能要比最初设计的速度慢上许多。       我们马上会看
到,使用基于时间的动画无论最终动画运行的帧频如何,都将获得可靠的速度。
      首先要改变考虑速度的方法。到目前为止,在我说 vx = 5 时,我们使用的单位是像素
每帧(pixels per frame)  。换句话讲,每进入新的一帧物体都将在 x 轴上运动 5 像素。在计
时器动画中,当然,就应该是每次定时间隔移动 5 像素。
      对于时间动画,我们将使用真正的时间单位,如秒。由于我们是处理完整的一秒,而非
其中的一部分,因此这个速度值就要更大一些。如果某个物体的速度是每帧 10 像素,每秒
30 帧的速度运动,     大约每秒 300 像素。 比如下面这个例子,我从第六章的 Bouncing2.as 文
档类中截取了一部分并进行了一些变化,见下面粗体部分(也可在 TimeBased.as 中找到)      :
package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.utils.getTimer;
  public class TimeBased extends Sprite {
   private var ball:Ball;
   private var vx:Number;
   private var vy:Number;
   private var bounce:Number = -0.7;
   private var time:Number;
   public function TimeBased() {
    init();
}
private function init():void {
  stage.frameRate = 10;
  ball = new Ball();
  ball.x = stage.stageWidth / 2;
  ball.y = stage.stageHeight / 2;
  vx = 300;
  vy = -300;
  addChild(ball);
  time = getTimer();
  addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
  var elapsed:Number = getTimer() - time;
  time = getTimer();
  ball.x += vx * elapsed / 1000;
  ball.y += vy * elapsed / 1000;
  var left:Number = 0;
var right:Number = stage.stageWidth;
var top:Number = 0;
var bottom:Number = stage.stageHeight;
if (ball.x + ball.radius > right) {
  ball.x = right - ball.radius;
  vx *= bounce;
      } else if (ball.x - ball.radius < left) {
        ball.x = left + ball.radius;
        vx *= bounce;
      }
      if (ball.y + ball.radius > bottom) {
        ball.y = bottom - ball.radius;
        vy *= bounce;
      } else if (ball.y - ball.radius < top) {
        ball.y = top + ball.radius;
        vy *= bounce;
      }
    }
  }
}
如上所描述,我改变了对速度的计算,让它们使用固定的值,而非随机值。然后我创建了一
个名为 time 的变量,让它等于 flash.utils.getTimer 函数的结果。getTimer 函数非常简单。
它返回影片已经运行了的毫秒数 —— 这就是它全部的工作。我们没有办法清除它,重启它,
改变它,等等。它只是一个计数器。
        看起来它似乎用处不大,但是如果先调用一次 getTimer 将值保存起来,稍后再调用它
一次,将两个结果相减,我们就能知道确切的—— 毫秒 ——这两次调用之间经过了多少时
间。
        这就是策略:在每帧的开始时调用 getTimer 计算与上一帧间隔了多长时间。如果将它
除以 1,000,我们将得到以秒为单位的间隔时间,这是个以秒为单位的分数。由于我们的 vx
和 vy 现在是以像素每秒来计算的,因此可以让它们去乘以这个分数,这样就知道要对物体
移动多少了。同样,不要忘记重新设置 time 变量的值,以便让下一帧进行计算。
     测试一下,  我们将看到小球移动的速度几乎与最初的速度相同!但是真正令人激动的是
我们可以以任何帧频来发布这个影片,它仍然可以以同样的速度运动!通过修改
stage.frameRate 的值,试验一下高到 1,000 fps,低到 10 fps,你会看到小球的速度是相同
的。当然,较高的频率会让动画更加流畅,而较低的频率则会十分不连贯,但是速度是一致
的。
     大家可以把这个技术应用在本书任何一个包含速度的例子中。  如果这样的话, 还需要将
相似的技术应用在加速度或外力上,如重力,因为它们也是基于时间的。加速度肯定要比转
前要大很多,因为加速度被定义为速度对时间的变化率。例如,重力大约为 32 英尺/秒/
秒。
     如果在一个 30 fps 帧的动画中,重力为 0.5 的话,那么现在就应该是 450。计算方法
0.5 * 30 * 30。然后像这样将它加入:
       vy += gravity * elapsed / 1000;
在最后一个例子中加入 450 重力后测试一下。我们会看到它与帧动画中加入重力 0.5 的效
果是相同的。使用这种技术的一个技巧是将帧频设置得非常高,如 100。虽然没有机器能够
与真正的帧频相吻合,但是基于时间的动画将保证每个人看到的影片运行得都是最流畅的。
同质量物体的碰撞
    回忆一下第十一章的动量守恒。那里有非常严谨的代码。不过,当两个相同质量的物体
发生碰撞时,我们实现起来可以更简单一些。基本原理是,两个物体沿着碰撞的线路交换它
们的速度。同时还要用坐标旋转来决定碰撞的线路,以及物体的速度,这样就摆脱了复杂的
动量守恒公式。来看看它是如何工作的,让我们回到文件 MultiBilliard2.as 中,将用它作为
下一个例子 SameMass.as 的基础。我就不再列出原先所有的代码了,因为它实在是一个很
大的文件。但是,我们要来看一下创建所有小球的 for 循环:
for(var i:uint = 0; i < numBalls; i++) {
var radius:Number = Math.random() * 50 + 20;
  var ball:Ball = new Ball(radius);
  ball.mass = radius;
  ball.x = Math.random() * stage.stageWidth;
  ball.y = Math.random() * stage.stageHeight;
  ball.vx = Math.random() * 10 - 5;
  ball.vy = Math.random() * 10 - 5;
  addChild(ball);
  balls.push(ball);
}
对于新的文件来说,要把粗体字的部分改为这一行:
      var radius:Number = 30;
让所有小球大小都相同,消除了质量的概念,相当于给它们相同的质量。
接下来,看一下 checkCollision 函数。请找到这一部分:
// 旋转 ball0 的速度
var vel0:Point = rotate(ball0.vx,
ball0.vy,
sin,
cos,
true);
// 旋转 ball1 的速度
var vel1:Point = rotate(ball1.vx,
ball1.vy,
sin,
cos,
true);
// 碰撞反应
var vxTotal:Number = vel0.x - vel1.x;
vel0.x = ((ball0.mass - ball1.mass) * vel0.x +
2 * ball1.mass * vel1.x) /
(ball0.mass + ball1.mass);
vel1.x = vxTotal + vel0.x;
这一部分找出了碰撞线路上的速度,根据物体的质量求出碰撞的结果。“碰撞反应”部分是
动量守恒的要素,这就是我们可以消除的部分。我们可以让 vel0 和 vel1 进行交换,就可
以很容易地替换它了。整个代码段如下:
// 旋转 ball0 的速度
var vel0:Point = rotate(ball0.vx,
ball0.vy,
sin,
cos,
true);
// 旋转 ball1 的速度
var vel1:Point = rotate(ball1.vx,
ball1.vy,
sin,
cos,
true);
// 交换两个速度
var temp:Point = vel0;
vel0 = vel1;
vel1 = temp;
这里甚至还可以再优化, 但是为了代码的清晰我就不做改变了。现在我们已经摆脱了一小块
儿数学问题,测试一下修改前与修改后的文件,所得的结果是相同的。

声音整合
      本书一直没有提到声音的使用。  因为声音并不是动画的直接组成部分,    优质的声音效果
可以让 Flash 影片更加真实、引人入胜。
      我们可以使用不同的方法来加入声音。回溯到 Flash IDE 最早的程序版本,我们有一
种使用声音的特殊方式 —— 将声音导入到库,      再把它加入到帧里面。  这不是我要介绍的方
法。我将介绍在 AS 3 中使用声音的一些基础。
     AS 3 的 Sound 类有了很大的变化,而且还有几个额外的类可以帮助我们对其进行修
饰。这里没有太多的空间进行深入的讨论,     但是有一个方面我想应该对于我们这本书来说会
很有用。这就是当动画中发生某种事件时,应该播放声音。最明显的就应该是碰撞了。一个
小球碰到墙上或其它小球上,我们会听到“砰”“啵嘤”“啪”或其它什么声音。因此,我
                                                、      、
们需要掌握通过 ActionScript 来启动声音的能力。
  这个例子中,我们还要回到 Bouncing2.as,小球会与墙壁产生碰撞。每次碰撞到墙壁时,
我想让它发出声音。新的类请见 SoundEvents.as。
      首先,需要有声音效果。在网上有许多免费的声音效果资源。其中最火的 Flash 声音
网 站 是 FlashKit 。 他 们 的 音 乐 文 件 除 了 有 loop 以 外 , 还 有 一 个 声 音 效果库
www.flashkit.com/soundfx/。这些效果被分类为 Cartoon,Interfaces,Mechanical 等等,而且
这个网站有超过 6,000 多个声音效果文件,所以您应该能够找到适合自己的音效。我们可
                                    ,找到自己喜欢的文件后,以 MP3 格式进行下载。将
以在页面上直接进行预览(preview)
它保存到硬盘上与最终发部的影片放在同一目录下。
      有时我们要重新给文件一个更为简单的名字。例如,我下载了一个“boing”声音,我
就将它重命名为 boing.mp3。
      在 AS 3 中使用声音的基础实际上要比 AS 2 中简单一些。
首先,我们需要创建声音对象。假设在类中已经声明了一个名为 boing 的变量:
     private var boing:Sound;
创建一个声音对象就这么简单:
     boing = new Sound();
当然,如同大多数 AS 3 的类一样,Sound 类也在包中,flash.media 包,因此要确保先导
入 flash.media.Sound。
     连接一个外部声音对象最简单的方法是在构造函数中传入一个请求(request) 。
     就像读取外部图像(第四章)一样,我们不能直接传入外部声音文件的 URL。而是要
将它包装到 URLRequest 中(flash.net.URLRequest,需要导入它) 。应该像这样:
     boing = new Sound(new URLRequest("boing.mp3"));
全部内容就是这样。现在声音已经准备好。我们要做的就是:
     mySound.play();
无论在哪儿都会播放出这个音效。在 play 中有一些可选参数,如偏移的毫秒数,以及播放
的次数, 但是默认情况下是从声音的起始位置播放一次声音,这已经满足了我们通常的需求。
以下是 SoundEvents.as 的全部代码,展示了 Sound 对象的创建,无论何时小球碰撞到墙上,
都会播放声音。
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
public class SoundEvents extends Sprite {
 private var ball:Ball;
 private var vx:Number;
 private var vy:Number;
 private var bounce:Number = -0.7;
 private var boing:Sound;
 public function SoundEvents() {
   init();
 }
 private function init():void {
   boing = new Sound(new URLRequest("boing.mp3"));
   ball = new Ball();
   ball.x = stage.stageWidth / 2;
   ball.y = stage.stageHeight / 2;
   vx = Math.random() * 10 - 5;
   vy = -10;
   addChild(ball);
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
 }
 private function onEnterFrame(event:Event):void {
   ball.x += vx;
   ball.y += vy;
   var left:Number = 0;
  var right:Number = stage.stageWidth;
  var top:Number = 0;
  var bottom:Number = stage.stageHeight;
  if (ball.x + ball.radius > right) {
    boing.play();
    ball.x = right - ball.radius;
    vx *= bounce;
  } else if (ball.x - ball.radius < left) {
    boing.play();
    ball.x = left + ball.radius;
    vx *= bounce;
  }
  if (ball.y + ball.radius > bottom) {
    boing.play();
    ball.y = bottom - ball.radius;
    vy *= bounce;
  } else if (ball.y - ball.radius < top) {
    boing.play();
    ball.y = top + ball.radius;
    vy *= bounce;
  }
}
  }
}
    测试一下影片看一看 … … 听一听拥有声音以后带来的不同感受。当然,要找到正确
的声音用在正确的环境下,也不要加得太多,因为这本身也是一门艺术

(如果要转载请注明出处http://blog.sina.com.cn/jooi,谢谢)

如何处理动态语言(Python / JS)的“隐形”调用链? 本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。 阅读详情

相关推荐

STM32H750 内部FLASH介绍及应用

STM32H750VBT6的内部Flash实际上是128KB封装的QSPI NOR Flash,映射到0x08000000地址,支持XIP执行。其核心特性包括16KB扇区结构、100,000次擦写耐久性、20年数据保持能力。操作流程需先解锁、擦除扇区、编程32位字/64位双字数据,最后重新锁定。与外部QSPI Flash相比,内部Flash更适合存储小型固件和关键参数,而大容量存储建议使用外部Flash。实际应用中需注意H750的特殊架构,其Flash操作本质是通过QSPI接口实现的。

hazy1k的博客 2711

转 第十九章 flash实用技巧 (1)(as3.0)

现在您已经来到了最后一章。我将所有想要介绍的一些小东西都放在了这一章,它们不 太合适放在其它地方,或者说与前面章节的主线有些脱离。     本章,我还重组了前面每章课后列出的公式,因此可以当作这些公式的一个参考点。     由于这些课题都是比较零碎的概念,所以我没有办法将这

roadProgram的专栏 1179

计算机网络实验——入侵检测系统实验

在图1所示的网络结构中,此方案的具体实施:在路由器Router1的接口1出方向配置入侵检测策略,在收到ICMP ECHO请求包时,丢弃并同步向日志服务器报告警告,此时,终端PC2和PC3无法对终端PC0和PC1执行ping操作,并且日志服务器将记录相应的警告信息;在实验一的基础上,添加扩展分组过滤器,指定需要进行检测的信息流的类别,将扩展分组和对应的入侵检测规则进行绑定,使得只对特定的信息流进行入侵检测。加载指定类别的特征库,这里的指定类别是 ios_ips 类别中的 basic 子类别。

放放的博客 1563

《ActionScript 3 CookBook 简体中文完整版》下载

在ActionScript 3.0推出这样短的时间内ActionScript 3.0 CookBook 简体中文完整版公布,这对喜欢flash,喜欢AS的同仁来说无疑是一大快事,现在我们就先睹为快。 第一章. ActionScript 语言基础 第二章. 自定义类 第三章. 运行时环境 第四章. 数字和数学 第五章. 数组 第六章. 可视化对象列表 第七章. 绘图和遮罩 第八章...

weixin_34185560的博客 317

算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)

量化策略开发,高质量社群,交易思路分享等相关内容

松鼠宽客的博客 2540

从“Hello World”到区域赛银牌:我的ACM算法打怪升级全记录(附各阶段工具包)

本文记录了作者从编程新手到ACM区域赛银牌获得者的完整学习历程,详细分享了各阶段的算法学习路线、刷题策略和实战经验。涵盖从基础算法到动态规划的系统训练方法,并附赠经过竞赛检验的工具包和资源清单,为算法竞赛爱好者提供实用参考。

weixin_29201859的博客 124

Making Things Move! 中文版

 Making Things Move! 中文版 今已全部杀青今天是我最后一次发部关于这本书的中文版(非官方“邮电”译版)的消息了,因为我已经将它全部译完了。    历经四个月的时间,今天终于把 Foundation Actionscript 3.0 Animation —— Making Things Move! 一书全部译完。非常感谢本书作者 Keith Peters 带给我们这么好的

xyzvalue的专栏 1296

Ubuntu终端AI编程助手配置:Claude Code接入DeepSeek模型全攻略

在软件开发领域,AI编程助手正成为提升开发效率的重要工具。其核心原理是通过大语言模型理解自然语言指令,生成、解释或调试代码。这类工具的技术价值在于将AI能力无缝集成到开发工作流中,减少上下文切换,实现更流畅的人机协作。常见的应用场景包括代码生成、错误调试、代码重构和技术问答等。本文聚焦于在Ubuntu系统中,将流行的终端AI助手Claude Code的后端模型从原版Claude替换为DeepSeek。通过配置环境变量实现API端点和模型的映射,这一过程涉及Node.js环境管理、npm包安装和关键环境变量设

weixin_42527654的博客 379

dev c++怎么调试_探索者 STM32F407 开发板资料连载第十九章 USMART 调试组件实验

1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子第十九章 USMART 调试组件实验本章,我们将向大家介绍一个十分重要的辅助调试工具:USMART 调试组件。该组件由ALIENTEK 开发提供,功能类似 linux 的 shell(RTT 的 finsh 也属于此类)。USMART 最...

weixin_39992417的博客 181

【数学模型】灰色关联分析

数学模型-灰色关联分析

suic009的博客 1万+

Spine动画在Unity里卡顿、闪烁、排序错乱?这些性能优化与渲染问题一次讲清

本文深入解析了Spine动画在Unity中常见的卡顿、闪烁和排序错乱问题,提供了全面的性能优化与渲染解决方案。从性能瓶颈诊断到材质合并、动态合批优化,再到层级错乱与Alpha闪烁的处理,帮助开发者提升动画表现和运行效率。特别针对Unity和Spine的协同工作进行了详细的技术探讨。

weixin_29967445的博客 383

dev c++调试怎么看变量的值_探索者 STM32F407 开发板资料连载第十九章 USMART 调试组件实验...

1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子第十九章 USMART 调试组件实验本章,我们将向大家介绍一个十分重要的辅助调试工具:USMART 调试组件。该组件由ALIENTEK 开发提供,功能类似 linux 的 shell(RTT 的 finsh 也属于此类)。USMART 最...

weixin_32534073的博客 195

别再硬编码了!WinCC子画面动态加载的5种C脚本写法对比

本文深入解析WinCC子画面动态加载的5种C脚本实现方案,包括基础加载、路径动态解析、多语言切换、窗口自适应布局和混合架构交互。通过代码示例和场景分析,帮助开发者避免硬编码问题,提升工业自动化系统的交互效率和可维护性。特别推荐路径动态解析方案,有效解决项目路径管理的痛点。

weixin_29008691的博客 478

百例看完啦,学习小总结

到今天为止我的百例总算是看完啦,从年前一直看到现在,应该是从2012年1月7号~2012年2月1号一直在研究《百例》,它真的是本不错的书,适合想入门的初学者,譬如:俺。呵呵。。。每个例子不但有针对性,而且在每个例子里还可以复习以前的知识点,当你遇到看不懂的代码时,只要顺着不懂得代码往右再看一眼,就可以看到清清楚楚的注释了,而且注释的很清楚,很容易看懂。极力推荐《百例》,初学者一定要看。

葵歌小妖 1395

MIKE水动力笔记4_制作网格

建立水动力模型前的重要一步就是制作网格,本文所讲内容就是如何在MIKE中制作网格。

晏长街的博客 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

第九章 网络设备文件管理

本文简单的介绍H3C设备的文件系统以及启动过程,同时也介绍了FTP和TFTP协议及两者区别。

网工路上的垫脚石 519

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ADSP-BF533的视频教程下载(40个中文视频教程教会你用ADI的Blackfin系列DSP)

曾经为ADI的BF系列录了40个视频教程,从处理器内核、外设、驱动、应用全方位讲解,想做ADI BF系列DSP的入门必选,有兴趣的可以看一下。

ADI_OP的博客 639

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

模型之外的那套装置:用 AI harness 完成一个三端同步应用

AI harness 指模型之外、让模型能持续产出可交付软件的全部工程装置。本文把它称作"支架"。它由五层构成:输入层规定模型读什么,反馈层规定模型怎么知道自己错了,观测层把界面与设备状态变成可读事实,记忆层让跨会话不失真,边界层规定哪些动作不许模型自行作出。支架的价值在六天里可以直接计量。

Leo的Matrix 183

如果用pytest命令启动测试脚本有哪些方法和参数呢?请详细解析

pytest的命令行启动非常灵活,它围绕“”、“”和“”三个核心维度,提供了一套强大的参数体系。

simpleness_的博客 227

附录一源码阅读路线与断点索引

本索引固定于Boot 3.5.7与Framework 6.2.12。先选择要解释的现象,再打开对应源码。表中观察对象是逻辑名称,不保证在所有重载中都是同名局部变量。抽象接口和注解用于阅读契约,不提供可执行方法体断点。

weixin_45476869的博客 164

软件测试用例模板怎么写:从用例设计到执行记录的全套指南

测试用例是测试工作的核心产出,它决定测试覆盖了多少、漏掉了什么。但大多数人的测试用例写得像流水账——只有正常路径,没有异常场景;只有操作步骤,没有预期结果;只有功能测试,没有非功能测试。本文拆解测试用例的标准结构,说明每个字段的含义和写法,给出覆盖功能测试、性能测试、安全测试的完整用例范例,并列出测试用例设计的五个高频遗漏点。

wuwangzhiduoshao的博客 154

大型高复杂度互联网项目管理经验心得

复杂项目,管理的核心不是管人,而是管理依赖和变更简单项目重点是排任务、盯进度;多端多关联系统的大型项目,大部分延期、故障根源都来自依赖失控、变更失控。项目经理首要工作是把看不见的依赖显性化,把随意变更变成受控变更,而不是单纯催开发进度。分批上线不是降低标准,而是拆分风险,小步可控很多人觉得分批上线麻烦,希望攒到一起发布。但集中上线会把所有风险集中在同一个窗口,一旦出问题,排查范围巨大、影响面广。分批发布本质是风险隔离,每一批只承载有限的变更,出问题更容易定位、回滚、止损。

zyx980193917的博客 193

[LLM Wiki理论与实践-09]将OpenWiki融入Coding Agent为你节省Token

针对OpenWiki的整合则将Coding Agent的执行模式升级为**先读知识库、再精准修改代码**。OpenWiki预置概念文档、测试说明、页面清单与更新时间,让Agent快速理解业务意图、定位相关代码与测试、判断信息新旧,减少Token与时间开销,降低理解偏差和跨文件遗漏,使改动更一致、可复现,文档与代码同步维护。

JaydenAI的博客 441
上一篇: 转 第十九章 flash实用技巧 (1)(as3.0)
下一篇: flash as3实用公式
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值