My Email

kingnare@gmail.com

找个锤子-等待review

实验,跟风性质的小游戏. 主要测试了Admob广告, 微信ANE, 本地化 iPhone4在屏幕元素高速移动时有些卡顿, 还是需要进一步优化. iPhone5s,iPad4,iPad air,运行都不错. 可能是硬件比较强悍吧. 没有用到对象池, 因为方块移出屏幕后马上重设位置了. QQ截图20140621090748                   home    

New Game: MazeJumper

利用业余时间, 断断续续的开发, 小游戏算是基本完成了. 本来要做成可以选择角色的, 后来时间不够就搁置了. 角色是静态图, 没用到骨骼. 由Adobe AIR技术开发, 使用了基于Stage3D的Genome2D框架. 包含的ANE: 本地提醒, Alert, 社会化分享(Adobe官方ANE), 内付费购买(Adobe官方ANE), iAd(Adobe官方ANE), GameCenter(Adobe官方ANE) 但正式上线后发现广告和游戏中心罢工了, 目前还在查找原因. 作图占了一半时间, 苦手.很多地方都能看出相当初级的作画功底:   玩法非常简单, 只要选择下一步要跳跃的方块即可.需要注意的是, 角色在跳跃的同时, 地面也会向下移动一个方块的距离, 别选错了. 如果掉到虚无(黑色区域)中, 不用紧张, 立即(动作一定要快)使用自己技能栏中能脱离虚无的技能(位置转换, 传送, 地面生成等), 很快就能转危为安的. 灵活使用方块上面的或自己技能栏的技能可以随意调戏和虐杀其他角色了. 欢迎试玩: 32MazeJumper  

在Windows下生成Apple开发者证书

以前都是在Mac系统下签名的. 这次手边没有Mac系统. 知道Windows 系统下也能生成, 但貌似要麻烦些. 现在没得挑了. 主要过程都在这两个页面中: http://help.adobe.com/zh_CN/as3/iphone/WS144092a96ffef7cc-371badff126abc17b1f-8000.html http://help.adobe.com/zh_CN/as3/iphone/WS144092a96ffef7cc-371badff126abc17b1f-7fff.html 建议使用Safari浏览器, 其他浏览器在生成cer文件时无限菊花. 其实整个过程还是比较快的, 分分钟就搞定了.

Flash Builder 找不到连接的设备

真机调试时遇到个问题:  "找不到连接的设备"                       Google之, 原来是少了个文件sqlite3.dll  (参考文章If you are unable to find attached iOS device on Flash Builder 4.7 Beta 2…) 把这个文件放到eclipse\plugins\com.adobe.flash.compiler_4.7.0.349722\AIRSDK\lib\aot\bin\iOSBin文件夹下即可. 点击刷新, 成功:

Genome2D的一些教程

收集的几个地址,以后还会有更新:
Genome2D作者博客: http://blog.flash-core.com/ 日本的教程: http://www.project-nya.jp/modules/weblog/details.php?blog_id=1739 Genome2D社区活跃成员DMeville: http://dylanmeville.com/?p=1079 DMeville的另一篇: G2DSpaceShooterTutorial.pdf
需要注意的是, 教程里用的G2D版本可能不同,在新版中某些类有增减或修改. 用G2D感觉最爽的是,不用绞尽脑汁去做极限优化(当然不做优化是不好的,但为了优化而破坏程序结构就得不偿失了). G2D和NAPE配合很棒,他们的坐标系可以说是一样的,不需要做过多的转换. 现在最缺的就是文档, 虽然网上有文档, 但具体的说明或简单代码实例基本没有.如果做到像Adobe那样的文档就棒极了.目前看来以作者一人之力是难以达到这样的成果了, 希望作者早日开源, 大家共同编撰文档, 这样G2D社区才能更好的发展. :)  

Genome2D探索:添加鼠标事件

原文:http://bbs.wefdc.com/thread-1492-1-1.html 书接上文, 我们继续在startApp方法中加入两行代码:
node.mouseEnabled = true; node.onMouseClick.add(nodeMouseClick);
首先启用鼠标监听功能, 然后添加鼠标单击事件 注意, G2D的事件和AS3的事件是有区别的. G2D采用的是Singal事件流机制. 想更多了解这种机制的, 可以点击此链接 接下来我们完成事件监听函数:
private functionnodeMouseClick(signal:GMouseSignal):void { node.transform.setColor(Math.random(),Math.random(),Math.random(),1); }
这个函数的参数是G2D内置的GMouseSignal类 我们在这个函数中实现的效果是更改物体的色彩.保留透明度不变, 随机修改RGB这3个数值. P.S. 这次我们使用了最新的G2D的Genome2D.0.9.1.1121.swc, 注意有改动的地方是: //G2D上下文配置 var config:GContextConfig = new GContextConfig(new Rectangle(0,0,960,640)); GContextConfig类初始化时传Rectangle的参数,设定舞台. 全部代码如下:
package
{
    import com.genome2d.components.GCamera;
    import com.genome2d.components.renderables.GSprite;
    import com.genome2d.context.GContextConfig;
    import com.genome2d.core.GNode;
    import com.genome2d.core.Genome2D;
    import com.genome2d.g2d;
    import com.genome2d.signals.GMouseSignal;
    import com.genome2d.textures.GTexture;
    import com.genome2d.textures.GTextureBase;
    import com.genome2d.textures.GTextureFilteringType;
    import com.genome2d.textures.factories.GTextureFactory;

    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import flash.system.Capabilities;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.ui.Multitouch;
    import flash.ui.MultitouchInputMode;

    [SWF(frameRate="60", width="960", height="640", quality="LOW", backgroundColor="0xFFFFFF")]
    public class STUDY_G2D_AS extends Sprite
    {
        /**
         * 主容器
         */        
        private var content:GNode;

        public function STUDY_G2D_AS()
        {
            super();

            this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
        }

        /**
         * Event.ADDED_TO_STAGE事件 
         * @param event
         * 
         */        
        protected function addedToStageHandler(event:Event):void
        {
            this.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
            stage.align = StageAlign.TOP_LEFT; 
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.LOW;
            g2dInit();
        }

        /**
         * 配置G2D
         * 
         */        
        private function g2dInit():void
        {
            //设置默认纹理过滤
            GTextureBase.defaultFilteringType = GTextureFilteringType.NEAREST;
            //注册G2D初始化事件
            Genome2D.getInstance().onInitialized.addOnce(onGenomeInitialized);
            //注册G2D失败事件
            Genome2D.getInstance().onFailed.addOnce(onGenomeFailed);
            //G2D上下文配置
            var config:GContextConfig = new GContextConfig(new Rectangle(0,0,960,640));
            //显示应用运行状态
            config.enableStats = true;
            //抗锯齿
            config.antiAliasing = 0;
            //初始化G2D
            Genome2D.getInstance().init(stage, config);
            //多点支持模式
            Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

        }

        /**
         * 初始化失败
         * 
         */        
        private function onGenomeFailed():void
        {
            var dtf:TextFormat = new TextFormat("Arial", 12);
            dtf.align = TextFormatAlign.CENTER;
            dtf.bold = true;
            dtf.color = 0xFFFFFF;

            var failed:TextField = new TextField();
            failed.defaultTextFormat = dtf;
            failed.width = stage.stageWidth;
            failed.height = 30;
            failed.y = (stage.stageHeight-30)/2;
            failed.text = "Genome2D initialization failed device doesn't support Stage3D renderer.";
            addChild(failed);
        }

        /**
         * 初始化成功
         * 
         */        
        private function onGenomeInitialized():void
        {
            content = new GNode("content");
            Genome2D.getInstance().root.addChild(content);
            regeditCamera();
            startApp();
        }

        /**
         * 注册摄像机
         * 添加一个红色方块节点
         * 
         */        
        private function regeditCamera():void
        {
            var camera:GCamera = content.addComponent(GCamera) as GCamera;
            camera.mask = 1;
            camera.index = 0;
        }

        private var node:GNode;
        private var degree:int=0;
        private const n:Number = Math.PI/180;

        private function startApp():void
        {
            node = new GNode();
            var texture:GTexture = GTextureFactory.createFromColor("white", 0xFFFFFF, 100, 100);
            var sp:GSprite = node.addComponent(GSprite) as GSprite;
            sp.setTexture(texture);
            content.addChild(node);

            node.mouseEnabled = true;
            node.onMouseClick.add(nodeMouseClick);

            Genome2D.getInstance().onPreUpdate.add(starUpdateHandler);
        }

        private function nodeMouseClick(signal:GMouseSignal):void
        {
            node.transform.setColor(Math.random(),Math.random(),Math.random(),1);
        }

        private function starUpdateHandler(deltaTime:Number):void
        {
            degree++;
            node.transform.rotation = n*degree;
        }

    }
}
效果如下: STUDY_G2D_AS_2

Genome2D探索:建立一个简单的Genome2D应用

原文:http://bbs.wefdc.com/thread-718-1-1.html 现在2D加速框架越来越多了, 目前比较火的, 资料最多的还是Starling. 最终我选择了Genome2D(以下简写为G2D),不为别的, 就为他的效率. 这次我们使用Flash Builder 4.6, 以建立一个IPHONE应用为例, 介绍下G2D框架的使用方法. 1.建立AS移动应用: 1.png 2.填写项目名称, 选择SDK版本为AIR 3.3 Beta1 2.png 3.点击下一步,选择平台为Apple iOS 3.png 4.点击下一步, 选择G2D的SWC文件. 4.png 5.选择0.9.1, 这个是此教程编写时最新版本 5.png 6. 点击完成后, 按F11键, 在弹出的对话框中(如下图所示), 选择on desktop及Apple iPhone4选项 6.png 7.打开STUDY_G2D-app.xml配置文件, 修改以下配置, renderMode这个一定要选择direct, 否则无法使用Stage3D, 当然G2D也无法使用了. 7.png 上面就是程序配置过程. 接下来进行代码编写
package
{
    import com.genome2d.components.GCamera;
    import com.genome2d.components.renderables.GSprite;
    import com.genome2d.context.GContextConfig;
    import com.genome2d.core.GNode;
    import com.genome2d.core.Genome2D;
    import com.genome2d.g2d;
    import com.genome2d.textures.GTexture;
    import com.genome2d.textures.GTextureBase;
    import com.genome2d.textures.GTextureFilteringType;
    import com.genome2d.textures.factories.GTextureFactory;

    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.StageOrientationEvent;
    import flash.system.Capabilities;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.ui.Multitouch;
    import flash.ui.MultitouchInputMode;

    [SWF(frameRate="60", width="960", height="640", quality="LOW", backgroundColor="0x000000")]
    public class STUDY_G2D extends Sprite
    {
        /**
         * 主容器
         */        
        private var content:GNode;

        public function STUDY_G2D()
        {
            super();

            this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
        }

        /**
         * Event.ADDED_TO_STAGE事件 
         * @param event
         * 
         */        
        protected function addedToStageHandler(event:Event):void
        {
            stage.align = StageAlign.TOP_LEFT; 
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.LOW;
            g2dInit();
        }

        /**
         * 配置G2D
         * 
         */        
        private function g2dInit():void
        {
            //设置默认纹理过滤
            GTextureBase.defaultFilteringType = GTextureFilteringType.NEAREST;
            //注册G2D初始化事件
            Genome2D.getInstance().onInitialized.addOnce(onGenomeInitialized);
            //注册G2D失败事件
            Genome2D.getInstance().onFailed.addOnce(onGenomeFailed);
            //G2D上下文配置
            var config:GContextConfig = new GContextConfig();
            //显示应用运行状态
            config.enableStats = true;
            //抗锯齿
            config.antiAliasing = 0;
            //初始化G2D
            Genome2D.getInstance().init(stage, config);
            //多点支持模式
            Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

        }

        /**
         * 初始化失败
         * 
         */        
        private function onGenomeFailed():void
        {
            var dtf:TextFormat = new TextFormat("Arial", 12);
            dtf.align = TextFormatAlign.CENTER;
            dtf.bold = true;
            dtf.color = 0xFFFFFF;

            var failed:TextField = new TextField();
            failed.defaultTextFormat = dtf;
            failed.width = stage.stageWidth;
            failed.height = 30;
            failed.y = (stage.stageHeight-30)/2;
            failed.text = "Genome2D initialization failed device doesn't support Stage3D renderer.";
            addChild(failed);
        }

        /**
         * 初始化成功
         * 
         */        
        private function onGenomeInitialized():void
        {
            content = new GNode("content");
            Genome2D.getInstance().root.addChild(content);
            regeditCamera();
            startApp();
        }

        /**
         * 注册摄像机
         * 
         */        
        private function regeditCamera():void
        {
            var camera:GCamera = content.addComponent(GCamera) as GCamera;
            camera.mask = 1;
            camera.index = 0;
        }
        // 加入一个45度角的红色方块
        private function startApp():void
        {
            var node:GNode = new GNode();
            node.transform.rotation = 45*Math.PI/180;
//创建红色方块纹理
            var texture:GTexture = GTextureFactory.createFromColor("red", 0xFF0000, 100, 100);
            var sp:GSprite = node.addComponent(GSprite) as GSprite;
            sp.setTexture(texture);
            content.addChild(node);
        }

    }
}
大家看着很长, 其实没多少步骤. 首先注册Event.ADDED_TO_STAGE事件, 在此事件处理方法中设置舞台属性; 接下来初始化G2D, 设置G2D的属性以及注册G2D初始化事件; 在G2D初始化事件中新建一个根节点(GNode), 并加到G2D的root中; 注册并添加一个摄像机; 接下来就可以向根节点中加入各种需要3D加速的2D图像了. 关于GTextureBase.defaultFilteringType 纹理滤镜, 可以参考 纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering这篇文章理解纹理滤镜. 按F11运行, 效果如下: 8.png

通过AIR Native Extension在AIR应用中加入iAd广告(二) —— Flash Pro篇

通过AIR Native Extension在AIR应用中加入iAd广告(一) —— Flash Builder篇 已经介绍了如果在Flash Builder上使用iAd扩展.今天讲讲如何使用Flash Pro发布程序. 1. 新建AIR for iOS项目; 2. 将上文提到的iAd_signed.ane重命名为iAd_signed.swc; 3. 打开高级ActionScript 3.0设置, 切换到"库路径"面板.把第2步修改的SWC文件添加到类库中; 4. 展开iAd_signed.swc前面的箭头, 双击"链接类型"为"外部"; 5. 编写舞台类  
package 
{

	import flash.display.MovieClip;
	import flash.events.Event;
	import com.adobe.nativeExtensions.AdBanner;
	import com.adobe.nativeExtensions.AdBannerEvent;
	import com.adobe.nativeExtensions.AdBannerPosition;

	public class Main extends MovieClip
	{

		public function Main()
		{
			trace("Init...");
			this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
		}

		private function onAddedToStage(event:Event):void
		{
			this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
			initAD();
		}

		private function initAD():void
		{
			AdBanner.adView.startShowingAds(AdBannerPosition.TOP, true);
			AdBanner.adView.addEventListener(AdBannerEvent.AD_LOADED, adLoaded);
			AdBanner.adView.addEventListener(AdBannerEvent.AD_LOADING_FAILED, adFailed);
			AdBanner.adView.addEventListener(AdBannerEvent.USER_INTERACTION_STARTING, adStart);
			AdBanner.adView.addEventListener(AdBannerEvent.USER_INTERACTION_FINISHED, adFinished);
		}

		private function adLoaded(event:AdBannerEvent):void
		{
			trace("Ad Loaded");
			AdBanner.adView.visible = true;
			trace("leaving: " + event.leaving);
		}

		private function adFailed(event:AdBannerEvent):void
		{
			trace("Loaded Failded: " + event.errorCode);
			AdBanner.adView.visible = false;
		}

		private function adStart(event:AdBannerEvent):void
		{
			trace("Starting");
			trace(stage.orientation);
		}

		private function adFinished(event:AdBannerEvent):void
		{
			trace("Finished");
			trace(stage.orientation);
		}

	}
}
6. CTRL+ENTER编译, 会有个VerifyError: Error #1014: Class com.adobe.nativeExtensions::AdBannerEvent could not be found错误. 不用理会.继续下步. 7. 新建ane文件夹, 将iAd_signed.ane复制进去 8. 进行AIR for iOS设置 9. 将Flash CS生成的t-app.xml复制一份并命名为new-t.xml, 打开new-t.xml, 加入
 <extensions> <extensionID>com.adobe.iad</extensionID> </extensions>
10. 用ADT打包工具打包.
adt.bat -package -target ipa-app-store -provisioning-profile t.mobileprovision -storetype pkcs12 -keystore t.p12 -storepass 1234 t.ipa new-t.xml t.swf -extdir ane 打包为发行版本 -package -target ipa-app-store 指定provisioning文件 -provisioning-profile t.mobileprovision 指定证书文件 -storetype pkcs12 -keystore t.p12 指定证书密码 -storepass 1234 导出文件名 t.ipa 配置文件 new-t.xml 第6步编译的SWF文件 t.swf 指定扩展的路径(第7步新建的文件夹) -extdir ane
11. 连接设备, 安装打包好的ipa文件测试   程序源代码,证书(密码1234): 点击此处下载

通过AIR Native Extension在AIR应用中加入iAd广告(一) —— Flash Builder篇

  目前通过Adobe AIR发布iOS应用的案例已经很多了. 随着AIR runtime及AIR SDK的不断升级,AIR App for iOS在iDevice运行流畅度大大提高.感谢Adobe带给大家这么好的技术和工具. 在苹果商店中, 可直接发布付费应用获得收益, 也可免费发放并通过广告得到分成. 但AIR不支持原生iAd广告组件.这时只能通过ANE(Air Native Extension)调用苹果原生API. 官方ANE插件站推荐了iOS iAd Native Extension for Adobe AIR插件. 最近无意中在Google Code找到iad-air-ios,重要的是, 它是免费的 :) 下面通过Flash Builder 4.6介绍下使用方法. 1. 打开FB4.6, 新建ActionSript Mobile Project, 本例中使用iAdTest为项目名.去掉黑梅和安卓的选项, 只勾选iOS系统:   2. 前往iad-air-ios, 下载最新的插件 iAdPrefixed.zip 并解压. 3.打开iAdTest项目属性,选择ActionScript Build Path, 切换到Native Extensions, 选择第2步解压的ANE文件并添加到项目.   4. 敲入主程序代码:
package
{
    import com.adobe.nativeExtensions.AdBanner;
    import com.adobe.nativeExtensions.AdBannerEvent;
    import com.adobe.nativeExtensions.AdBannerPosition;

    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;

    public class iAdTest extends Sprite
    {
        public function iAdTest()
        {
            super();

            this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
        }

        protected function addedToStageHandler(event:Event):void
        {
            this.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            initAD();
        }

        private function initAD():void
        {
            AdBanner.adView.startShowingAds(AdBannerPosition.TOP, false);  
            AdBanner.adView.addEventListener(AdBannerEvent.AD_LOADED, adLoaded);  
            AdBanner.adView.addEventListener(AdBannerEvent.AD_LOADING_FAILED, adFailed)
            AdBanner.adView.addEventListener(AdBannerEvent.USER_INTERACTION_STARTING, adStart);  
            AdBanner.adView.addEventListener(AdBannerEvent.USER_INTERACTION_FINISHED, adFinished); 
        }

        private function adLoaded(event:AdBannerEvent):void
        {
            trace("Ad Loaded");         
            AdBanner.adView.visible = true;         
            trace("leaving: " + event.leaving); 
        }

        private function adFailed(event:AdBannerEvent):void
        {
            trace("Loaded Failded: " + event.errorCode);
            AdBanner.adView.visible = false;
        }

        private function adStart(event:AdBannerEvent):void
        {
            trace("Starting");
            trace(stage.orientation);
        }

        private function adFinished(event:AdBannerEvent):void
        {
            trace("Finished");
            trace(stage.orientation);
        }
    }
}
5.为配合从网络下载的证书, 要打开iAdTest-app.xml修改id: <!-- A universally unique application identifier. Must be unique across all AIR applications.     Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required.--> <id>com.gamevil.zenonia2</id> 6.发布程序   6. 选择证书(网络下载的测试证书)   7. 如果没有意外情况发生, 等待数分钟便可发布完成. 连接iPhone(已越狱),将生成的iAdTest.ipa安装并运行,稍等片刻就可以看到左边的界面了. 运行截图:   程序源代码,证书(密码1234): 点击此处下载  
Page 1 of 24123451020...Last »