当前位置: 首页 > 图文教程 > Flash动画 > ActionScript > ActoinScript教程:小数坐标处理

ActionScript
Flash as常用后缀及意义
AS3教程:Point类计算两点间距离
flash as3利用ContextMenu实现右键响应
Flash AS3教程:Motion类
Flash AS教程:文本类对象知识总结
Flash AS3教程:Random类
Flash AS3教程:Level2D类
Flash AS3教程:ApplySocket类
Flash AS3教程:运算符“?:”
Flash AS3教程:Direction类和Dot类
Flash AS3教程:小游戏开发实战尝试
Flash cs3、Flex与asp、php通信总结(包含数据库)
从基础开始深入学Flash AS3教程(7)(译文)
Flash as3教程:OutDisplay类
从基础开始深入学Flash AS3教程(6)(译文)
Flash简单AS代码实现绚丽曲线视觉特效
用纯Flash Actionscript做的火柴棍小人跑的动画
Flash AS解决中文mp3乱码
Flash加载外部文件创建进度条3种方法
AS的LoaderInfo类控制SWF的大小和播放帧频

ActionScript 中的 ActoinScript教程:小数坐标处理


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 75 ::
收藏到网摘: n/a

Update: 具体项目中,其实可以用扩展Sprite类并建立setter和getter来实现,不再赘述了。

一个头痛了几天的bug终于fixed……我真的是太迟钝了。

最近,遇到这样一个案例,需要以非常缓慢的速度移动某几个物体,而且,这些物体之间还会发生“无损弹性碰撞”(修正主义万恶的高中课本翻译的是“完全弹性碰撞”,我个人觉得Perfect Collision应该为“无损”更易理解吧?)

总之,这些物体的速度(即位移增量)可能灰常灰常小。小到什么程度呢?这么说吧,由于所有的值都是根据动量守恒定律和能量守恒定律(还记得这俩公式的同学你们可以去解放美帝国主义了)算出来的,因为难免出现某一个物体从某一个角度撞击另一个物体之后,两者中某一物体的某一方向(x或者y)上的速度被“中和”掉了。

刚才提到,在计算机语言中,速度即位移增量。ActoinScript的写法则是:

fuckCERNET.x += fuckCERNET.vx; //fuckCERNET is an instance of some dynamic class

当fuckCERNET.vx < 1/20时,Flash则不再渲染。这是根据FlashPlayer万恶的内部机制来实现的。根据我和一些美帝国主义的Flasher讨论,发现,FlashPlayer对物体x、y属性是有保护的:

Implementation public function get x():Number public function set x(value:Number):void

为什么要有这个保护呢,也不难理解:肯定是因为你直接让一个物体移动到0.001的位置上后计算机(FlashPlayer)不知道怎么去显示它:计算机是根据像素组成的,例如我们通常所说的1024×768:即便你的影片再高清再无码,你放到80×60的显示器上还是只能显示4800个点。

虽然“万恶”,但不得不承认FlashPlayer很聪明地回避了这样的问题,甚至,很优雅地通过一个setter来解决了问题,我们可以想象这个setter可能会是:

public function set x(value:Number):void { if (value < 0.05) value = 0; // blah .. blah
}

好的,知道这个之后,就好办了。每次速度改变(即碰撞的时候)做一次“最低值判断”:当速度标量(即不考虑方向)不为0(实际上这种情况很小)但小于0.05时,让速度等于0.05就好,可以用我写的这个函数来修正:

private function fixDecimalFractionPosition(value:Number):Number {
  if (Math.abs(value) < .05) {
    return (value > 0) ? .05 : -.05;
  }
  return value;
}

Still looking for something?