最近更新 Toggle Comment Threads | 键盘快捷键

  • sunhongyulei 7:07 am on August 23, 2011 固定链接 | 回复
    Tags: javascript, node.js, V8   

    如何安装Node.js 

    最近我们的PHP游戏服务器由于用户量过多造成严重阻塞,数据丢失造成了很严重的后果。

    而后我看到淘宝前端工程师写的一篇关于Node.js怎么处理阻塞的[http://www.infoq.com/cn/articles/why-recommend-nodejs],结果是利用的js事件回调机制,难道php没有这种机制?

    但这篇文章是说的我热血沸腾啊,先记录个怎么安装Node吧。。。

    (More …)

     
    • sunhongyulei 7:22 上午 on 8月 23, 2011 固定链接 | 回复

      cd node
      ./configure的时候cygwin出错了…
      [main] python 6140 C:\cygwin\bin\python.exe: *** fatal error – unable to remap
      具体的解决方法如下:

      开始菜单输入CMD打开命令行输入:

      C:/cygwin/bin/ash rebaseall -v

      或者按如下操作:

      开始菜单输入CMD打开命令行

      进入到Cygwin的bin路径下,执行ash命令,或者直接run这个命令;

      在ash提示符后面运行/bin/rebaseall,注意要输入完整,如果只输入rebaseall,会提示找不到这个命令,而且这个命令只能在ash下面执行,不能在Cygwin下面执行。

      现在打开Cygwin,一切恢复正常。

  • sunhongyulei 2:44 am on June 24, 2011 固定链接 | 回复
    Tags: Flash, JSFL   

    jsfl入门讲解 

    JSFL指Flash  JavaScript,是JavaScript脚本文件,是用来扩展Flash IDE的重要工具。学会它、熟练使用它之后你会惊讶的发现,哇,原来可以这么高效率的做Flash啊!下面我们来看一看怎么使用JSFL:

    不知道各位朋友有没有使用过Flash IDE中的“历史记录面板”?如果没有用过的话,赶紧Ctrl+F10调出来看一看吧,因为本文的内容将从它身上开始。

    在Flash IDE中(本人使用Flash CS3 Professional)按下R键(矩形绘制工具的快捷键),在舞台上拖动鼠标绘制出一个矩形。观察“历史记录面板”,你会发现面板中添加了一个名为“矩形”的动作。选中“矩形”动作,“历史记录面板”右下角那个磁盘图标按钮将被激活,点击该按钮保存命令为“DrawRect”。接下来,删除刚刚在舞台上绘制的那个矩形,然后选择Flash菜单栏的“命令”菜单,你会发现弹出菜单中多了一个名为“DrawRect”的选项,点击“DrawRect”选项看看效果吧。

    (More …)

     
  • sunhongyulei 6:48 am on June 14, 2011 固定链接 | 回复
    Tags: 重构, 混淆   

    如何写出无法维护的代码 

    刚买了一本书《重构-改善既有代码的设计》还没看完,碰巧又看到一篇如何搞烂代码的文章。

    这篇文章的原文在这里(http://mindprod.com/jgloss/unmain.html)。

    If builders built buildings the way programmers write programs, then the first
    woodpecker that came along would destroy civilization.
    (如果建筑师盖房子就像程序员写程序一样,那么,第一只到来的啄木鸟就能毁掉我们的文明)

    ~ Gerald Weinberg (born: 1933-10-27 age: 77) Weinberg’s Second Law

    相当有趣,你可以把他当反面教材,也可以把他当混淆方法,或者你只是显摆自己的代码很高深…

    (More …)

     
  • sunhongyulei 10:02 am on May 30, 2011 固定链接 | 回复
    Tags: alchemy,   

    Alchemy配置详解 

    咆哮一下…

    配了我一天的Alchemy的环境啊,尼玛,炼金术伤不起啊………

    1 下载 Cygwin

    可以打开这个网址http://www.cygwin.cn/site/install/

    2 到 Select Package这时,需要选择以下3个东西

    1 到 Archive 下面去选择安装 zip 包

    2 到 Devel 下面去选择安装 gcc-g++ 包

    3 到 Perl 目录,选择完全安装 (Install)

    (More …)

     
    • 子青 3:55 上午 on 8月 22, 2011 固定链接 | 回复

      还不错,你可以再看下SOURCE是做什么用的,以后很多执行命令就可以放在那里执行一次就可以 了。

  • sunhongyulei 8:49 am on May 23, 2011 固定链接 | 回复
    Tags: , matrix3D   

    执行复杂的3D转换 

    使用 Matrix3D 类可以转换坐标空间内的 3D 点,也可以将 3D 点从一个坐标空间映射到另一个坐标空间。

    不需要理解矩阵运算就可以使用 Matrix3D 类。大多数常见的转换操作都可以通过该类的方法进行处理。您不必担心如何显式设置或计算矩阵中每个元素的值。

    将显示对象的z属性设置为数值后,可以使用该显示对象的 Transform 对象的 Matrix3D 属性来检索显示对象的转换矩阵:

    var leafMatrix:Matrix3D = this.transform.matrix3D;

    您可以用 Matrix3D 对象的方法对显示对象执行平移、旋转、缩放和透视投影。

    使用 Vector3D 类及其x、y和z属性可管理 3D 点。该类还可以表示具有方向和大小的物理空间矢量。通过 Vector3D 类的方法,可以执行有关空间矢量的常见计算,例如加法、点积和叉积计算。

    注: Vector3D 类与 ActionScript Vector 类无关。Vector3D 类包含的属性和方法用于定义和操作 3D 点,而 Vector 类则支持类型对象数组。

    创建 Matrix3D 对象

    有三种主要的创建或检索Matrix3D对象的方式:

    1. 使用Matrix3D()构造函数方法实例化新的矩阵。Matrix3D()构造函数使用包含 16 个数值的Vector对象,并将每个值分别放入一个矩阵单元格中。例如:
      var rotateMatrix:Matrix3D = new Matrix3D(1,0,0,1, 0,1,0,1, 0,0,1,1, 0,0,0,1);
    2. 设置显示对象的z属性的值。然后,从该对象的transform.matrix3D属性检索转换矩阵。
    3. 通过获取根显示对象的perspectiveProjection.matrix3D属性的值,检索用于控制舞台上 3D 对象的显示的 Matrix3D 对象。

    应用多种 3D 转换

    通过 Matrix3D 对象,可以一次应用多种 3D 转换。例如,如果要旋转、缩放然后移动立方体,可以对立方体的每个点分别应用这三种转换。但是,还有一种高效得多的方法,即在一个 Matrix3D 对象中预先计算多种转换,然后对每个点执行一次矩阵转换。

    注: 矩阵转换的应用顺序非常重要。矩阵运算的顺序是不能交换的。例如,先应用旋转再应用平移与先应用平移再应用旋转,二者的结果是不同的。

    下面的示例演示执行多种 3D 转换的两种方式。

    package { 
        import flash.display.Sprite;     
        import flash.display.Shape; 
        import flash.display.Graphics; 
        import flash.geom.*; 
    
    public class Matrix3DTransformsExample extends Sprite 
        { 
            private var rect1:Shape; 
            private var rect2:Shape; 
    
    public function Matrix3DTransformsExample():void 
            { 
                var pp:PerspectiveProjection = this.transform.perspectiveProjection; 
                pp.projectionCenter = new Point(275,200); 
                this.transform.perspectiveProjection = pp; 
    
                rect1 = new Shape(); 
                rect1.x = -70; 
                rect1.y = -40; 
                rect1.z = 0; 
                rect1.graphics.beginFill(0xFF8800); 
                rect1.graphics.drawRect(0,0,50,80); 
                rect1.graphics.endFill(); 
                addChild(rect1); 
    
                rect2 = new Shape(); 
                rect2.x = 20; 
                rect2.y = -40; 
                rect2.z = 0; 
                rect2.graphics.beginFill(0xFF0088); 
                rect2.graphics.drawRect(0,0,50,80); 
                rect2.graphics.endFill(); 
                addChild(rect2); 
    
                doTransforms(); 
            } 
    
            private function doTransforms():void 
            { 
                rect1.rotationX = 15; 
                rect1.scaleX = 1.2; 
                rect1.x += 100; 
                rect1.y += 50; 
                rect1.rotationZ = 10; 
    
                var matrix:Matrix3D = rect2.transform.matrix3D; 
                matrix.appendRotation(15, Vector3D.X_AXIS); 
                matrix.appendScale(1.2, 1, 1); 
                matrix.appendTranslation(100, 50, 0); 
                matrix.appendRotation(10, Vector3D.Z_AXIS); 
                rect2.transform.matrix3D = matrix; 
            } 
        } 
    }

    在doTransforms()方法中,第一个代码块使用 DisplayObject 属性更改矩形形状的旋转、缩放和位置。第二个代码块使用 Matrix3D 类的方法执行相同的转换。

    使用Matrix3D方法的主要优点在于,所有计算都是在矩阵中提前执行的,然后这些计算只需对显示对象应用一次(前提是设置了显示对象的transform.matrix3D属性)。通过设置 DisplayObject 属性可使源代码更易于阅读。但是,每次设置旋转和缩放属性后,会导致进行大量计算并更改显示对象的多个属性。

    如果您的代码要多次对显示对象应用相同的复杂转换,应将 Matrix3D 对象保存为变量,然后反复应用该变量。

    使用 Matrix3D 对象重新排序显示

    如前所述,显示列表中显示对象的层叠顺序确定了对象的显示顺序,这些对象的相对 z 轴值对显示顺序没有影响。如果您的动画将显示对象的属性转换为一种与显示列表中的顺序不同的顺序,则观察者看到的显示对象层叠顺序与 z 轴层叠顺序不一致。因此,在视觉上应当远离观察者的对象可能反而会靠近观察者。

    为确保 3D 显示对象的层叠顺序对应于对象的相对深度,请使用如下方法:

    1. 使用 Transform 对象的getRelativeMatrix3D()方法获取子级 3D 显示对象的相对z 轴值。
    2. 使用removeChild()方法从显示列表中删除对象。
    3. 根据显示对象的相对 z 轴值对显示对象进行排序。
    4. 使用addChild()方法以相反顺序将子对象添加到显示列表中。

    这种重新排序方法可确保您的对象按照各自的相对 z 轴值进行显示。

    下面的代码将 3D 框的六面设置为正确的显示顺序。这段代码对经过旋转的框的各面进行重新排序:

    public var faces:Array; . . . 
    
    public function ReorderChildren() 
    {     
        for(var ind:uint = 0; ind < 6; ind++) 
        { 
            faces[ind].z = faces[ind].child.transform.getRelativeMatrix3D(root).position.z; 
            this.removeChild(faces[ind].child); 
        } 
        faces.sortOn("z", Array.NUMERIC | Array.DESCENDING); 
        for (ind = 0; ind < 6; ind++) 
        { 
            this.addChild(faces[ind].child); 
        } 
    }

    若要获取此范例的应用程序文件,请参阅 http://www.adobe.com/go/learn_programmingAS3samples_flash_cn。在 Samples/ReorderByZ 文件夹中可以找到这些应用程序文件。

     
  • sunhongyulei 8:40 am on May 23, 2011 固定链接 | 回复
    Tags:   

    将 3D 对象投影到 2D 视图上 

    flash.geom包中的 PerspectiveProjection 类提供了一种简单在 3D 空间中移动显示对象时应用基本透视的简单方式。

    如果未显式创建 3D 空间的透视投影,3D 引擎将使用默认的 PerspectiveProjection 对象,该对象存在于根上并会传播到其所有子项上。

    用于定义 PerspectiveProjection 对象如何显示 3D 空间的三个属性是:

    • fieldOfView
    • projectionCenter
    • focalLength

    修改fieldOfView的值会导致自动修改focalLength的值,反之亦然,因为这两个属性相互依赖。

    如果给定fieldOfView值,用于计算focalLength的值的公式为:

    focalLength = stageWidth/2 * (cos(fieldOfView/2) / sin(fieldOfView/2)

    通常,您需要显式修改fieldOfView属性。

    视野

    通过操作 PerspectiveProjection 类的fieldOfView属性,可以使逐渐靠近观察者的 3D 显示对象变大,而使逐渐远离观察者的对象变小。

    fieldOfView属性指定一个介于 0 到 180 度的角度,该角度确定透视投影的强度。该值越大,沿 z 轴移动的显示对象的扭曲程度就越大。如果fieldOfView值较小,则缩放程度较低,使对象看起来在空间中只是稍稍后移。如果fieldOfView值较大,则会导致较大的扭曲,并显示为较大的移动。如果达到最大值 179.9999… 度,则会出现极端的鱼眼摄像头镜头效果。fieldOfView的最大值为 179.9999…,最小值为 0.00001…。精确的 0 和 180 值是非法值。

    投影中心

    projectionCenter属性表示透视投影的消失点。该属性作为相对于舞台左上角默认注册点 (0,0) 的偏移量。

    当对象逐渐远离观察者时,该对象将朝消失点倾斜直到最终消失。想象一下无限长的走廊。当朝走廊远处看时,两边的墙壁将聚合到走廊远处的消失点。

    如果消失点位于舞台的中心,则走廊将消失于该中心点。projectionCenter属性的默认值是舞台的中心。例如,如果希望元素出现在舞台的左边,而 3D 区域出现在右边,可将projectionCenter设置为舞台右边的点,使之成为 3D 查看区域的消失点。

    焦距

    focalLength属性表示视点原点 (0,0,0) 与显示对象在 z 轴上的位置之间的距离。

    较长的焦距相当于视野较窄、对象间距离经过压缩的摄远镜头。较短的焦距相当于广角镜头,可获得较宽的视野和较大的扭曲。中等的焦距相当于肉眼所见的效果。

    通常,当显示对象移动时,focalLength属性会在透视转换过程中动态重新进行计算,不过您可以显式设置该属性。

    默认透视投影值

    在根上创建的默认 PerspectiveProjection 对象具有以下值:

    • fieldOfView:55
    • perspectiveCenter:stagewidth/2, stageHeight/2
    • focalLength:stageWidth/ 2 * ( cos(fieldOfView/2) / sin(fieldOfView/2) )

    如果您没有创建自己的 PerspectiveProjection 对象,则默认使用这些值。

    如果要自行修改projectionCenter和fieldOfView属性,则可以实例化您自己的 PerspectiveProjection 对象。在这种情况下,新建对象的默认值如下(假设默认舞台大小为 500 x 500):

    • fieldOfView:55
    • perspectiveCenter:250,250
    • focalLength: 480.24554443359375
     
  • sunhongyulei 9:08 am on May 9, 2011 固定链接 | 回复
    Tags:   

    如何减小SWF文件的大小 

    1.关闭编译器的调式功能

    2.检查依赖链接(Examming linker dependencies)

    3.避免初始化没有使用的类(avoiding initializing unused classes)

    1.关闭编译器的调式功能

    默认情况下mxmlc编译器的debug选项是false,但是compc组件编译器的debug选项默认情况下却是true,在用compc编译 SWC的时候一定要把debug选项设为false,否则的话一些与debug相关的功能和代码会被编译进SWC文件中,从而增加了SWC中SWF文件的 大小

    2.检查依赖链接(Examming linker dependencies)

    有时候我们会遇到这种情况:在使Flex项目模块化的过程中,我们会在主模块SWF中加载项目需要的其他子模块SWF,而子模块SWF中使用了一些 在主模块中已经加载也就是定义的类。打个比方说,主模块SWF大小为100k,加载的子模块的SWF大小为60K,但是大约有30k大小左右的在主模块中 定义的类被编译进了子模块中。子模块在编译的时候需要主模块中的类,但是你知道子模块仅仅只被主模块加载,所以没有必要让子模块的SWF中也编译那些在主 模块中定义的字节码。 也许你的主模块加载不止一个子模块,而这些子模块都使用和共享了主模块中的类,当我们不把这30k左右的字节码编译进每一个子模块中时,我们的项目SWF 文件就会变小很多。那么在AS3中如何不把这些在主模块中定义的类编译进子模块中呢?AS3中mxmlc编译器有一个link-report编译选项,当 mxmlc编译完成的时候会把编译进SWF文件中所有类列表的信息保存在link-report选项指定的XML文件中,一般命名为 report.xml。在编译子模块的时候,我们可以把在编译主模块时产生的report.xml文件给mxmlc编译器的load-externs编译 选项,从而使在编译子模块的时候可以不把在report.xml文件中子模块依赖的类编译进子模块的SWF文件中。关于mxmlc编译器的link- report和load-externs选项的更详细信息可参考Adobe的相关文档。

    3.避免初始化没有使用的类(avoiding initializing unused classes)

    最常见的避免没有必要的类引用的方法包括不要初始化没有使用的类和使用getQualifiedClassName()方法执行类型检查。下面的函 数检查是否一个显示对象是按钮控件,这个例子迫使编译器把Button编译进SWF文件中,即使该显示对象不是一个按钮控件而且整个程序没有使用按钮控 件。

    public function checkChildType():void {
        var child:DisplayObject = getChildAt(0);
        var childIsButton:Boolean = child is spark.components.Button;
     s = "child is spark.components.Button: " + childIsButton.toString();
    }
    
    然而,你可以用getQualifiedClassName()方法来完成同样的任务,Button类也不会被强迫
    编译进SWF中。下面的函数使用getQualifiedClassName()来完成和上面函数同样的功能。
    public function checkChildType():void {
      var child:DisplayObject = vg1.getChildAt(0);
      var childClassName:String = getQualifiedClassName(child);
      var childIsButton:Boolean = childClassName == "spark.components::Button"
      s = "child class name = Button (" + childIsButton + ")";
      t = "child is " + childClassName;
    }
    
    其它关于减小SWF文件大小的方法,还有很多例如动态加载外部资源(图片,国际化资源),
    模块化等等,在此就不一一赘述了。
    相关链接如下:
    http://www.bit-101.com/blog/?p=941
    http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf67110-7ff4.html#WS2db454920e96a9e51e63e3d11c0bf67110-7ff2
    http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7fcc.html
    
    
     
  • sunhongyulei 7:14 am on May 9, 2011 固定链接 | 回复
    Tags: , Math   

    ActionScript3.0 Math类 

    在flash中,Math类是一个非常常用的类,通过数学计算,可以实现很多非常美妙的效果,我们在这里从最基础的学起,补一补数学知识.

    我们先来看看flash中提供的Math类吧:

    Math.abs()          计算绝对值。
    Math.acos()        计算反余弦值。
    Math.asin()        计算反正弦值。
    Math.atan() 计算反正切值。
    Math.atan2()         计算从 x 坐标轴到点的角度。
    Math.ceil()        将数字向上舍入为最接近的整数。
    Math.cos()        计算余弦值。
    Math.exp() 计算指数值。
    Math.floor()        将数字向下舍入为最接近的整数。
    Math.log()        计算自然对数。
    Math.max() 返回两个整数中较大的一个。
    Math.min() 返回两个整数中较小的一个。
    Math.pow() 计算 x 的 y 次方。
    Math.random() 返回一个 0.0 与 1.0 之间的伪随机数。
    Math.round() 四舍五入为最接近的整数。
    Math.sin() 计算正弦值。
    Math.sqrt() 计算平方根。
    Math.tan() 计算正切值。
    下面我们就这18个基本的函数,进行具体的说明~!

    (More …)

     
  • sunhongyulei 8:59 am on April 29, 2011 固定链接 | 回复
    Tags: , bindable,   

    Flex学习系列教程一[数据绑定基础] 

    来源于Riameeting

    相信只要开发过Flex应用程序的读者都已经使用过数据绑定(Data Binding),数据绑定是Flex非常重要的特性之一,它就像一种魔法一样,能快速让你将应用程序中两个不同的部份通过数据绑定联系起来,大大提高了 开发的效率,这也是让Flex如此流行的特性之一。大多时候我们并不需要了解数据绑定背后的机制,然而,随着在Flex应用程序规模不断增大,数据绑定特 性也被开发人员使用得越来越多,其带来的问题也逐渐显现出来,正因为它像魔法一样,使用起来非常简单,因而很多开发人员并未去深入了解数据绑定背后的工作 机制,致使在应用中使用不合理,这样不仅会给应用程序带来性能上的问题,也会使得程序难以维护,甚至可能带来不可预料的Bug,很难跟踪处理。

    本节首先会简要介绍数据绑定的基本概念及其常见应用,然后带领大家深入“幕后”,剖析”魔法”倒底是怎样产生的,最后在最佳实践部分给大家介绍一下在实际运用数据绑定时常犯的错误及纠正方案。

    (More …)

     
c
Compose new post
j
Next post/Next comment
k
Previous post/Previous comment
r
回复
e
编辑
o
Show/Hide comments
t
返回顶部
l
Go to login
h
Show/Hide help
shift + esc
取消