About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Apr

    19

     

    Apr

    19

    官方的教程就是简洁,两个箭头就把一切说清楚了。

    Apr

    19

    struct Color
    {
        let red, green, blue:Double

        mutating func someColor()
        {
            //虽然这里什么也没有调用
        }

        init(g:Double)
        {
            red = g
            green = g
            //someColor()//但这里就是错的
            blue = g
            someColor()//隐式的调用self.someColor(),而这个self的储值属性必须是经过初始化的
        }
    }

    Apr

    18

    刚刚又看到一个新玩艺儿 Starling for Haxe,真是有点感叹。

    先是 Egret 一个 HTML5 游戏引擎框架,提供了 TS Conversion,可以将 AS3 项目快速的转换成为 HTML5 项目(只是从代码上的转换,并不是跨平台的编译,据说转换率能达到 90% 以上,然后稍作修改就可以生成 HTML5  项目)。

    然后 StarlingSwf 提供了将 Flash 资源转换为 Egret 资源的 StarlingSwf-Egret 版本以及 Egret 的依赖库。

    接着是最近一直在各 Flash 群里发布各种培训广告的 Layabox(号称能快速的将 Flash 游戏项目转换成 HTML5 项目,具体的工具冒似还没有正式的上线,只是在宣传视频里看到了,估计他们的培训班内部可能已经在使用了)。

    然后又看到了这个新玩艺儿 Starling for Haxe……估计还有其它很多杂七杂八的工具。

    不知是该替 Flash & AS3 高兴还是悲伤。一个明明已经连 Adobe 官方都想要放弃的东西,结果却成了打不死的小强。

    Apr

    17

    Swift 引用类型

    • 0 Comments
    • Swift

    Swift 除了强引用与弱引用(weak 关键字修饰)之外,还有非持有引用(unowned 关键字修饰)。

    Swift 虽然也使用引用计数的方式自动化管理内存,但不采用垃圾回收机制(垃圾回收机制只在空闲时或内存不足时进行“碎片化”的回收)。Swift 的对象如果没有任何引用时会被立即回收,强引用会超造成两个或两个以上的对象循环引用而造成内存泄漏,此时可以使用弱引用或非持有引用。

    非持有引用在内存存活期间会一直有值,不会是 nil,所以不会是非可能值类型;弱引用时使用变量一定是可能值类型,当关联对象在内存清除后,自动设置为 nil。

    可能值链在绑定时所产生的强引用只对当前行代码有效,不会保存到下一行。

    Apr

    17

    mutating 关键字的使用

    • 0 Comments
    • Swift

    默认情况下,Swfit 语言中只有类对象的方法可以直接修改类对象的值类型属性;而结构体和枚举虽然也可以定义自己的方法,但它们的实例方法中不可以修改值类型的属性,如果需要修改就要添加 mutating 关键字。而且需要使用变量引用结构体对象或枚举对象,而不能使用常量(编译会报错)。

    Apr

    16

    MAC OS X 基础入门教程

    • 0 Comments
    • Miscellaneous

    习惯是很难改变的,思维习惯比行为习惯更改难。习惯了 WIN 系统的操作习惯的用户,估计都会很难适应苹果的思维习惯和操作习惯……

    MAC OS X 基础入门教程地址:http://www.swiftv.cn/course/hy9hpryw

    这个适合刚开始接触 MAC 电脑的用户,讲的比较详细,包含了 MAC 机中同时安装 WIN 双系统的说明。

    Apr

    16

    如果没有 MAC 电脑,但又想学习 Swift 语言,可以直接在 http://swiftstub.com/ 输入 Swift 代码测试语法。只需要一个最新版本的网页游戏器,推荐使用 Google Chrome 浏览器。

    缺点是没有代码提示,也不会像 XCode 里的 Playground 能即时显示结果,输出结果必须要使用 println() 函数来打印。

    Apr

    16

    一个入门级的视频教程,讲的非常快,也非常全,适合懒的看书学习的人。

    视频地址:http://www.swiftv.cn/course/hwcuol4d

    Apr

    15

    纯 AS3 将图片转换为 SWF

    • 0 Comments
    • Flash Platform

    比较简单方便的通过纯 AS3 代码将图片转换为 SWF 格式,可以免去 SWFTools 需要通过命令行将 *.jpg / *.png 之类的文件转换成 *.swf。

    package
    {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.JPEGEncoderOptions;
        import flash.display.Loader;
        import flash.display.LoaderInfo;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.FileReference;
        import flash.net.URLRequest;
        import flash.utils.ByteArray;
        import flash.utils.Endian;

        public class Image2Swf extends Sprite
        {
            private var isCompress:Boolean = true;//是否为压缩格式的SWF

            private var loader:Loader;
            private var bitmapData:BitmapData;

            public function Image2Swf()
            {
                loader = new Loader();
                loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
                loader.load(new URLRequest("test.jpg"));
            }

            private function initHandler(e:Event):void
            {
                e.target.removeEventListener(Event.INIT, initHandler);

                var bitmap:Bitmap = e.target.content as Bitmap;

                if(bitmap)
                {
                    bitmapData = bitmap.bitmapData;

                    var byteArray:ByteArray = new ByteArray();

                    bitmapData.encode(bitmapData.rect, new JPEGEncoderOptions(), byteArray)

                    loader = null;
                    loader = new Loader();
                    loader.contentLoaderInfo.addEventListener( Event.COMPLETE, completeHandler );
                    loader.loadBytes(byteArray);        
                }
            }

            private function completeHandler(e:Event):void
            {
                e.target.removeEventListener( Event.COMPLETE, completeHandler );

                if(isCompress)
                {
                    //保存为压缩格式的SWF
                    saveContentToSWF_compress( e );
                }
                else
                {
                    //保存为非压缩格式的SWF
                    saveContentToSWF( e );
                }
                loader.unload();
                loader = null;
                bitmapData.dispose();
                bitmapData = null;
            }

            //压缩格式
            private function saveContentToSWF_compress( e:Event ):void
            {
                var swf_head:ByteArray = new ByteArray();
                    swf_head.endian = Endian.LITTLE_ENDIAN;
                    swf_head.writeBytes((e.target as LoaderInfo).bytes, 08 );
                    swf_head[0] = 0x43; // 'C'; 
                    swf_head.position = 0;

                var swf_body:ByteArray = new ByteArray();
                    swf_body.endian = Endian.LITTLE_ENDIAN;
                    swf_body.writeBytes((e.target as LoaderInfo).bytes, 8 );
                    swf_body.position = 0;
                    swf_body.compress();
                    swf_body.position = 0;

                var swf_ByteArray:ByteArray = new ByteArray();//包含 head 与 body 的二进制

                    swf_ByteArray.writeBytes(swf_head);
                    swf_ByteArray.writeBytes(swf_body);

                var file:FileReference = new FileReference();
                    file.save(swf_ByteArray, "压格式的SWF.swf");//SWF head CWS
            }

            //非压缩格式
            private function saveContentToSWF( e:Event ):void
            {
                var file:FileReference = new FileReference();
                    file.save((e.target as LoaderInfo).bytes, "非压格式的SWF.swf");//SWF head 为FWS
            }
        }
    }