最近在用 js 的时候出现这样的问题:

var a="6073";
var b = parseInt(a);
 b*0.01 //60.730000000000004
b/100 //60.73
为什么乘以0.01和除以100,得到的结果是不一样的呢,这里用"6073"会出现这样的问题,其他数值好像没有这样的问题,但是一定满足某个条件,出现这样的情况。

希望能找到原因,解决之。

查找中……

如果您知道,请您提点下我

9ky3ll_uypwmh5

打算用 gmail 发送邮件,里面带了个附件,zip 格式压缩的,这个附件包含有 bat 执行文件。

gmail 给出这样的提示,并且不给发送,后来改用 rar 压缩,发送成功。

自己的邮箱,居然因为这样而不能发送,太人性化了,也不太方便,呵呵

最近看到 TualatriX 的博客上有了这篇文章,让人看着霎时恼火,

我决定转过来也支持下,“谭卓事件”,绝对是 “蓄意谋杀”,应该还他一个公道。

转内容如下:

为什么如此美丽的杭州却这样的 “和谐”?

杭州的和谐程度,似乎与该地的电子商务、互联网普及度一样高。和谐程度丝毫不比全国其他城市要差,从 5.1 颁布的 “实名制上网” 就可见一斑。

这次富家子弟飚车撞死人的事件越来越滑稽了,首先是交警说车只开了 70 码,是否是飚车还需要鉴定。然后就是杭州市所有媒体接到禁令,禁止进行后续报道,也就是被 “和谐” 了。

实际上这背后的勾结我们普通百姓比谁都清楚,政府越这样掩人耳目,不就越说明问题吗?

所以,作为一个在杭州读书、生活和工作的人,我不能禁声,我要置顶这篇文章,直到这件事情圆满解决为止。

详情可见:

在东昌路上无意看到,不知道什么意思?

上海市政有难?

200905061225_0751

经一好友提点:原来是一家公司的名称。太搞笑了!

最近关注 flash 游戏设计,发现了这个系列的文章,觉得还可以,适合新手学习和参考。

所以把它翻译过来(不是原原本本,根据意思做了很大变化),希望入门有帮助,我也在入门,呵呵

欢迎转载,请注明出处(包括译者和作者)

原文:Designing the structure of a Flash game - AS3 version

作者层级写过: Designing the structure of a Flash game ,这篇文章是针对在 flash 里的动作里直接写到,现在这个 as3 版本,者采用了 class(类)的形式。更有面向对象的感觉,原来就感觉是面向过程的。

刚开始使用类来代替,如果你不熟悉面向对象,就感觉很不直观;但是如果你熟悉后,你完全将这个用作你以后开发游戏的模板。

在这个游戏中,我们使用了 4 个屏幕切换(后面简称:切屏):splash (开始屏),info(如何玩),game itself(游戏本身)和 game over(游戏结束)…… 并且你还可以根据需求非常简单的添加其他屏。

首先给游戏做一个规划:

as3dia

在图片中你能看到游戏的 4 屏,并且指出了每个按钮的屏幕切换方向。如,在 splash(开始)屏你可以跳转到 info(介绍)屏,但是你不能直接跳转到 game over(游戏结束)屏。

主函数 the_game (因此文件命名为 the_game.as),把其他对象和类被列在库中,根据红色的顺序进行引用。

查看链接列(元件的链接属性,常识,不多作解释),非常清楚的显示出其他需要的四个 as 文件:game_over.as,how_to_play.as,splash.as 和 the_game_itself.as。

让我们看看详细的实现(blog 主题原因,代码呈现有点问题):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package {
    import flash.display.Sprite;
    public class the_game extends Sprite {
        public var splash_screen:splash;
        public var play_screen:the_game_itself;
        public var game_over_screen:game_over;
        public var how_to_play_screen:how_to_play;
        public function the_game() {
            show_splash();
        }
        public function show_splash() {
            splash_screen = new splash(this);
            if (how_to_play_screen) {
                removeChild(how_to_play_screen);
                how_to_play_screen = null;
            }
            addChild(splash_screen);
        }
        public function show_how_to_play() {
            how_to_play_screen = new how_to_play(this);
            removeChild(splash_screen);
            splash_screen = null;
            addChild(how_to_play_screen);
        }
        public function show_game_over() {
            game_over_screen = new game_over(this);
            removeChild(play_screen);
            play_screen = null;
            addChild(game_over_screen);

} public function play_the_game() { play_screen = new the_game_itself(this);
if (splash_screen) { removeChild(splash_screen);
splash_screen = null;
} if (how_to_play_screen) { removeChild(how_to_play_screen);
how_to_play_screen = null;
} if (game_over_screen) { removeChild(game_over_screen);
game_over_screen = null;
} addChild(play_screen);
} } }

详细步骤说明:

行 4-7: 使用相应的类声明游戏切屏的对象。

行 8-10: 这是主要函数,simply 调用一个显示 splash 屏的函数。

行 11: 这样一个函数: show_splash。

行 12: 函数的核心:我将为第 4 行声明的 splash_screen 变量 new 一个对象。注意这里的参数:我要求它记住是哪个类调用了它,在这里 this 其实就是 the_game 类。

行 13: 检查场景上是否已经有 how_to_play_screen 屏。这里有可能是从 info 屏切换到 splash 屏的。

行 14: 如果是,我需要在场景上移除这一屏……

行 15: 设置变量为 null,这个非常重要因为 removeChild 只是在场景上移除 sprite,而内存中依然存在的。

行 17: 最后,我将 splash 屏放置到场景上。

其他剩下的也都是相同的操作,分配变量、添加并移除相应的 sprite,直到结束为止。

现在让我们看看 splash.as 中 splash 类的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
    import flash.display.Sprite;
    import flash.display.SimpleButton;
    import flash.events.MouseEvent;
    public class splash extends Sprite {
        public var main_class:the_game;
        public function splash(passed_class:the_game) {
            main_class = passed_class;
            play_button.addEventListener(MouseEvent.CLICK, on_play_button_clicked);
            how_to_button.addEventListener(MouseEvent.CLICK, on_how_to_button_clicked);
        }
        public function on_play_button_clicked(event:MouseEvent) {
            main_class.play_the_game();
        }
        public function on_how_to_button_clicked(event:MouseEvent) {
            main_class.show_how_to_play();
        }
    }
}
行 6:声明the_game类型的变量main_class(主类)

行 7: 主要函数,查看 the_game 类型的参数 passed_class: 这函数的传递可以在 the_game.as 的第 12 行可以找到

行 8: 记住调用的此类的原始类

行 8-9:附加两个按钮的监听,当玩家按 "play" 或 "how to play" 按钮时触发。

行 12: 当玩家点击 play 按钮时,函数被执行

行 13: 这个文件的核心:我在主类中调用 play_the_game () 函数。我们能知道主类哪里来,就需要感谢 main_class 变量了。

这里的函数执行就和前面 show_splash 的解释一样,添加和移除相应的 sprite 并调用其他的类。

其他类也和这个是类似的,所以不做过多注释。

how_to_play.as

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
    import flash.display.Sprite;
    import flash.display.SimpleButton;
    import flash.events.MouseEvent;
    public class how_to_play extends Sprite {
        public var main_class:the_game;
        public function how_to_play(passed_class:the_game) {
            main_class = passed_class;
            play_button.addEventListener(MouseEvent.CLICK, on_play_button_clicked);
            back_button.addEventListener(MouseEvent.CLICK, on_back_button_clicked);
        }
        public function on_play_button_clicked(event:MouseEvent) {
            main_class.play_the_game();
        }
        public function on_back_button_clicked(event:MouseEvent) {
            main_class.show_splash();
        }
    }
}
the_game_itself.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package {
    import flash.display.Sprite;
    import flash.display.SimpleButton;
    import flash.events.MouseEvent;
    public class the_game_itself extends Sprite {
        public var main_class:the_game;
        public function the_game_itself(passed_class:the_game) {
            main_class = passed_class;
            die_button.addEventListener(MouseEvent.CLICK, on_die_button_clicked);
        }
        public function on_die_button_clicked(event:MouseEvent) {
            main_class.show_game_over();
        }
    }
}
game_over.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package {
    import flash.display.Sprite;
    import flash.display.SimpleButton;
    import flash.events.MouseEvent;
    public class the_game_itself extends Sprite {
        public var main_class:the_game;
        public function the_game_itself(passed_class:the_game) {
            main_class = passed_class;
            die_button.addEventListener(MouseEvent.CLICK, on_die_button_clicked);
        }
        public function on_die_button_clicked(event:MouseEvent) {
            main_class.show_game_over();
        }
    }
}
最后你将看到:

下载源代码 .

这是第一篇,有空继续第 2 篇。

在网络上找到很多关于 AS3 实践优化的资料,自己整理下(自己还没有验证过,有时间再写测试代码):

  1. new Array () 和 new Object () 比直接用 [] 和 {} 慢 3 倍的效率:
    var a = [];
    var b = {};
    代替
    var a =new Array();
    var b = new Object;
  2. 数组的索引用整数: list[int(0)]比直接用list[0]快。
  3. Array 的创建是消耗是非常大的,所以不要这样做,尽可能重复利用,更新数组相对性能小很多:
    var vanityCollection01 : Array = new Array();
    var vanityCollection02 : Array = new Array();
    var vanityCollection03 : Array = new Array();
    var vanityCollection04 : Array = new Array();
  4. 更快的数组拷贝:
    var copy : Array = sourceArray.concat();
  5. 用 {} 的匿名对象创建比 new 快:
    var o : * = {firstName:"John",lastName:"Smith",age:45 };
    NOT:
    var p : Person = new Person();
    p.firstName = "John";
    p.lastName = "Smith";
    p.age = 45;
  6. 静态函数应用,不需要创建对象实例:
    StringUtils.trim( "text with space at end " );
    类定义:
    package
    {
         public final class StringUtils
             {
              public static function trim( s : String ) : String
              {
                   var trimmed : String;
                   // implementation... 
                   return trimmed;
               }
          }
    }
  7. 在应用程序中,常量定义是无法修改的:
    public const APPLICATION_PUBLISHER : String = "Kannopy, Inc.";
  8. 不想被继承的类,可以用 final 来修饰:
    public final class StringUtils
  9. package 级别的函数和变量,不需要类和对象实例,直接调用(这些好像还没怎么用到):
    createSnapShot( arg );
    不需要:
    someObjectInstance.createSnapShot( arg );
    SomeClass.createSnapShot( arg );
    类定义:
    package
    {
         // imports…; 
         public function createSnapShot(target:IBitmapDrawable) : Bitmap
         {
              // implementation… 
          }
    }
  10. if 和 switch 的效率是一样的,:
    if ( condition )
    {
         // handle condition 
    } 

switch ( condition )
{ case "A":
// logic to handle case A break;

case "B":
// logic to handle case B break;
}

<li>AVM中用int比Number在执行循环速度要快:
(var i: int = 0; i < n; i++) NOT for (var i: Number = 0; i < n; i++)
  • uint 要少用,比较慢:
    var footerHex : uint = 0x00ccff;
    for (;i<n2;i++) Vector3D(array[int(i*2)]).x = 2;
    不要用(因为会自动转为 Number 的):
    for (;i<n2;i++) Vector3D(array[i*2]).x = 2;
  • 不要用 int 来赋值小数:
    var decimal : Number  = 14.654;
    不要用(因为会自动转为 Number 的):
    var decimal : int  = 14.654;
  • 用乘法来代替除法:5000/1000=>5000*0.001:
  • 不要在循环内执行相同的运算:
    for (..){a*180/Math.PI;}
    声明: toRadians = a*180/Math.PI; 放置到循环外面
    for (var i=0;i< myArray.lengh;i++){ }
    应该采用:
    var len : int = myArray.lengh;
    for (var i=0;i<len;i++){}
  • 使用完事件监听需要 remove 掉
    removeEventListener( Event.COMPLETE, onComplete );
  • 使用 delete 释放内存
    delete someObject;
  • 使用正则表达式验证,使用字符串搜索
    // postal code validation example using regular expressions 
    private var regEx:RegExp = /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/i;
    private function validatePostal( event : Event ) : void
    {
         if( regEx.test( zipTextInput.text ) )
         {
              // handle invalid input case 
          }
    } 
  • // search a string using String methods var string : String = "Search me"; var searchIndex : int = string.indexOf( "me" ); var search : String = string.substring( searchIndex, searchIndex + 2 );

    <li>重用对象特别是(DisplayObjects, URLLoader),保持内存使用平稳,因为创建这些对象会使得cpu和内存占用加大,可能导致画面不流畅。</li>
    <li>使用delete释放内存
    
    delete someObject;

    继续补充中……

    昨天和几个同事去吃饭,无意间这路旁发现这个招牌.

    这店老板的文化程度着实高,我们一行人对这三个字全不认识.

    200904131757_052

    集体的力量查到:犇 bēn; 羴 shān; 鱻  xiān

    0%