最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

在 Flash Pro 的舞台上直接配置运动对象的属性以及加减速运动算法的研究

  • 2011-08-05
  • 本文字数:1673 字

    阅读完需:约 5 分钟

有一段时间没有写技术文章了,今天我要介绍两个技巧。一个是如何利用 Flash Pro 的舞台直接配置运动对象的属性,这个技巧在我多年的工作中经常用到,可以非常的方便直观地定义元件在舞台上的运动效果;另一个是如何用三角函数来自定义一个先加速后减速的运动轨迹算法。

有关 Flash 舞台

Flash 里的舞台是一个平面直角坐标系,每一个显示对象(如 MovieClip)内部都有一个舞台,容纳着这个对象的所有子显示对象。子对象在舞台上的位置、缩放、旋转度等属性可以直接用鼠标拖拽定义,其定义的结果会给显示对象的类属性赋值(如 x,y,scaleX, scaleY, rotation)。但是,我们在做开发的时候往往不会将需要控制的对象直接放在舞台上,取而代之的是根据应用程序的需要,在适当的时机使用构造函数创建一个对象,再通过代码来初始化这个对象的属性并把它加载到舞台上。这样创建的对象,它的一切行为都要通过代码来实现,其属性和运动数据也都要从配置文件中来解析获得。我今天介绍的就是如何通过 Flash 舞台来代替配置文件,为动态创建的显示对象提供显示属性的方法。

Reference 对象

如上图的三个小人,“影子”、“参照物”、“傀儡”…用很多词可以形容这样一个对象,它被直接放在舞台上,但是最终不会被显示出来,它的使命就是给最终需要显示的对象提供位置、缩放和旋转度等属性数据。嗯,我更多的时候叫它 Mapping 或者 Reference 对象。总之,我们可以直接通过鼠标来拖拽修改它的属性,然后在代码中把它们的位置、缩放和旋转度动态解析出来,赋给一个会在舞台上呈现的显示对象。既直观又方便。

上面的这个小人,她在三点间来回做先加后减的变速运动,下面来介绍一下相关的算法原理。

三角函数加速减速运动算法

写过运动轨迹的朋友都知道,缓动运动中最简单的是减速运动,可以用下面的代码来实现:

复制代码
x += (targetX - x)/5;
y += (targetY - y)/5;

在每一帧中调用一遍上面的代码,可以让 x 和 y 的值无限接近于 targetX 和 targetY,而且接近的速度越来越慢。这种算法比较适合周期比较短的切换效果。

对于更流畅的运动,比如先加速后减速运动,也可以通过设定瞬时速度和加速度的方式来实现,但是这样做的一个弊端是很难精准的控制运动物体的运动轨迹,无法实现在希望的时间内让物体从点 A 运动到点 B。很多朋友用过 Tweener,TweenLite 或者 TweenMax,这类运动渲染器可以创建一个非常精准的变速运动效果,可以对运动轨迹更好的控制。但是,对于移动开发来说,使用 Tweener 就意味着增加了一条渲染线程,不利于我们对 Timer 和 EnterFrame 的集中渲染。今天我要介绍一个自定义的先加速后直线减速运动算法,并且实现对运动时间和轨迹的精准控制。

在下面这个直角坐标系里,横轴表示时间,纵轴表示位移改变量,曲线上任意点的斜率与速度成正比。在定义域为 0 到 90 的范围内,曲线方程为 f(x) = (1-cos(x))/2,速率方程也就是导数方程是 f’(x) = sin(x)/2,这是一个增函数,说明运动物体在做加速运动;在定义域为 90 到 180 的范围内,曲线方程为 f(x) = (1+ sin(x+90))/2,速率方程也就是导数方程是 f’(x) = -sin(x)/2,这是一个减函数,说明运动物体在做减速运动。从两个部分的导数方程可以看出速率的曲线符合三角函数曲线特征,而且在加速和减速阶段的增量相互对称。

图 2.先加速后减速运动的位移增量曲线方程(自变量为时间)

这样,一个变速运动的方程就可以分解为两个部分,用 ActionScript 代码实现就是这样的:

复制代码
// 改变时间增量
moveProgress += 2;
var pos:Number;
if(moveProgress<90){
// 定义常量 CONVERT 为 Math.PI/180,减小计算量
pos = (1 - Math.cos(moveProgress * CONVERT))/2;
}else{
pos = (1 + Math.sin((moveProgress-90) * CONVERT))/2;
}
//orx 为运动起点的 x 值,dx 为运动终点的 x 值与起点 x 值的差。pos 为单位时间内的运动增量
act.x = orx + dx * pos;
act.y = ory + dy * pos;
act.scaleX = orsx + dsx * pos;
act.scaleY = orsy + dsy * pos;
if(moveProgress >=180){
/* 运动停止 */
}

源文件下载

actress.zip (600kb)

查看原文:在 Flash Pro 的舞台上直接配置运动对象的属性以及加减速运动算法的研究

2011-08-05 05:251177

评论

发布
暂无评论
发现更多内容

模块三作业

Leo

外包学生管理系统架构

浪飞

手把手教学电瓶车进电梯检测、多类别车辆追踪、异常行为检测产业级应用

百度大脑

我提交了一个 pr,竟然是为了吃

AlwaysBeta

GitHub 开源 程序员 生活 程序员人生

中国 PostgreSQL 分会加入龙蜥社区,携手共建基础软件开源新生态

OpenAnolis小助手

postgresql Linux 开源

Go学习笔记——复合数据类型

为自己带盐

Go 学习笔记 2月月更

Flink 新一代流计算和容错——阶段总结和展望

Apache Flink

大数据 flink 开源 编程 实时计算

向工程腐化开炮 | manifest治理

阿里巴巴终端技术

App 客户端开发 腐化治理 manifest

基于Qt设计的学生考勤系统

DS小龙哥

2月月更

web前端开发Nodejs的C++ 拓展开发_前端培训

@零度

node.js 前端开发

低代码实现探索(三十三)前端脚本公式

零道云-混合式低代码平台

MongoDB 数据实时同步利器-Tapdata Cloud 免费上手指南

MongoDB中文社区

mongodb

互联网应用开发如何搭上AI的快车?来厦门开发者Meetup一探究竟

百度大脑

MongoDB在信息资源共享建设的应用实践

MongoDB中文社区

mongodb

ESLint-源码分析

Tone荣

前端 eslint

全面解析湖仓一体与大数据演进历程|内含技术工具选型策略

云智慧AIOps社区

数据库 大数据 数据湖 Clickhouse 大数据运维

等保2.0政策之物联网安全扩展要求包括哪四个?

行云管家

云计算 物联网 等保 等保2.0 扩展要求

「架构实战营」模块三作业 外包学生管理系统架构设计

hxb

「架构实战营」

掉入成功的深渊

Shinta

震坤行工业超市研发效能提升之路

阿里云云效

云计算 阿里云 DevOps 云原生 研发

微服务从代码到k8s部署应有尽有系列(三、鉴权)

万俊峰Kevin

微服务 web开发 鉴权 go-zero Go 语言

堡垒机哪家好?贵不贵?作用是什么?

行云管家

堡垒机 等级保护 过等保 等保2.0

学生管理系统 - 详细设计方案

tom

重学架构之外包学生管理系统架构设计文档

陈华英

架构实战营

云计算架构设计6大原则,你遵循了吗?

博文视点Broadview

如何更好的使用TypeScript

Tone荣

前端 js ts js 转 ts

外包学生管理系统架构设计文档

「架构实战营」

G1 面向服务端(多CPU)应用的垃圾回收器

蜜糖的代码注释

Java 垃圾回收器 2月月更

原生JavaScript灵魂拷问,你能答上多少(一)

战场小包

JavaScript 前端 2月月更

java培训:Netty的内存管理

@零度

Java Netty

网易数帆大数据场景下的DataOps实践

网易数帆

大数据 数据治理 DataOps

在Flash Pro的舞台上直接配置运动对象的属性以及加减速运动算法的研究_Java_James Li_InfoQ精选文章