LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭

as3

1850浏览    85参与
下雨的声音

Air 打包 ipa的巨坑

如果根目录含有.DS_Store这个文件,ipa将无法安装。


蜀黍调试了两天,简直莫名其妙!

如果根目录含有.DS_Store这个文件,ipa将无法安装。


蜀黍调试了两天,简直莫名其妙!

flash163

BlitMask

BlitMask(
target:DisplayObject, //遮罩的目标影片
x:Number = 0, //遮罩层x坐标
y:Number = 0, //遮罩层y坐标
width:Number = 100, //遮罩层宽度
height:Number = 100, //遮罩层高度
smoothing:Boolean = false, //遮罩滑动动画
autoUpdate:Boolean = false,//遮罩更新
fillColor:uint = 0x00000000, //遮罩层填色
wrap:Boolean = false)//遮罩是否循环

example1:

TweenLite.to(mc...

BlitMask(
target:DisplayObject, //遮罩的目标影片
x:Number = 0, //遮罩层x坐标
y:Number = 0, //遮罩层y坐标
width:Number = 100, //遮罩层宽度
height:Number = 100, //遮罩层高度
smoothing:Boolean = false, //遮罩滑动动画
autoUpdate:Boolean = false,//遮罩更新
fillColor:uint = 0x00000000, //遮罩层填色
wrap:Boolean = false)//遮罩是否循环

example1:

TweenLite.to(mc, 3, {x:400, onStart:myBlitMask.enableBitmapMode, onUpdate:myBlitMask.update, onComplete:myBlitMask.disableBitmapMode

example2:

myBlitMask.scrollX = 0;
TweenLite.to(myBlitMask, 5, {scrollX:1});

example3:

//create a 200x200 BlitMask positioned at x:20, y:50 to mask our "mc" object and turn smoothing on:
var blitMask:BlitMask = new BlitMask(mc, 20, 50, 200, 200, true);

//position mc at the top left of the BlitMask using the scrollX and scrollY properties
blitMask.scrollX = 0;
blitMask.scrollY = 0;

//tween the scrollY to make mc scroll to the bottom over the course of 3 seconds and then turn off bitmapMode so that mc becomes interactive:
TweenLite.to(blitMask, 3, {scrollY:1, onComplete:blitMask.disableBitmapMode});

//or simply position mc manually and then call update() to sync the display:
mc.x = 350;
blitMask.update();

example4:
var bm:BlitMask = new BlitMask(mc, 0, 0, 300, 200, true);
TweenLite.to(mc, 3, {x:200, onUpdate:bm.update, onComplete:completeHandler});
function completeHandler():void { bm.bitmapMode = false; }

BlitMask.addEventListener(MouseEvent.ROLL_OUT,myevent)
BlitMask.normalizePosition()
BlitMask.bitmapMode=true

下雨的声音

FlashToIOS研究

Adobe宣布终止Flash支持,由于Air技术,其实Flash是做手机游戏、移动应用的非常方便、完整的解决方案。


由此我想到,如果有一天我们玩不到Flash了,是不是可以通过Air技术将Flash游戏移植到iOS上?


移植主要会遇到以下问题:

1.效率问题:通畅flash没有针对移动设备进行优化,利用CPU模式执行起来会卡。GPU模式又存在不支持滤镜的问题

2.显示问题:没有考虑移动设备的显示,会出现字体显示不全等情况

3.键盘问题:移动设备没有键盘

4.分辨率问题:移动设备不会去迁就应用,也不能允许应用窗口执行,应用必须是全屏。

5.加载Bug:有些swf独立运行可以...

Adobe宣布终止Flash支持,由于Air技术,其实Flash是做手机游戏、移动应用的非常方便、完整的解决方案。


由此我想到,如果有一天我们玩不到Flash了,是不是可以通过Air技术将Flash游戏移植到iOS上?


移植主要会遇到以下问题:

1.效率问题:通畅flash没有针对移动设备进行优化,利用CPU模式执行起来会卡。GPU模式又存在不支持滤镜的问题

2.显示问题:没有考虑移动设备的显示,会出现字体显示不全等情况

3.键盘问题:移动设备没有键盘

4.分辨率问题:移动设备不会去迁就应用,也不能允许应用窗口执行,应用必须是全屏。

5.加载Bug:有些swf独立运行可以,加载就会出错,因为加载时一些变量为空,比如loaderInfo.url、ContextMenu,导致非法访问。



以下是我的方案:

1.效率问题:无解,只能躲避

2.显示问题:具体问题具体分析

3.键盘问题:使用虚拟按键、多点触控、手势等代替

4.分辨率问题:利用舞台缩放+中对齐+(背景)完成,或利用舞台缩放+拉伸完成

5.利用ASV修改代码,将其变为无意义的语句。

ID507306952

用有理数逼近平方根

尝试用有理数逼近平方根,且这个方法同样适用于比较精确地笔算平方根

原理:完全平方公式 A=(√A)^2=(x+m)^2=x^2+2mx+m^2

其中A是被开方数,x是我们的估测值,m是误差。

当m很小的时候,可以认为m^2→0,此时m=(A-x^2)/2x

故更加精确的数值x'=x+m=x+(A-x^2)/2x=(A/x+x)/2 即为该方法的原理。

可以证明,在保留一定位数小数的情况下,这种方法获得的数字的稳定值永远大于或等于准确值,但是仍然是相当精确的值。

利用上述公式多次循环可以得到相当准确的值。

这里用Flash AS3写了一个小程序 可以用来模拟该过程...

尝试用有理数逼近平方根,且这个方法同样适用于比较精确地笔算平方根

原理:完全平方公式 A=(√A)^2=(x+m)^2=x^2+2mx+m^2

其中A是被开方数,x是我们的估测值,m是误差。

当m很小的时候,可以认为m^2→0,此时m=(A-x^2)/2x

故更加精确的数值x'=x+m=x+(A-x^2)/2x=(A/x+x)/2 即为该方法的原理。

可以证明,在保留一定位数小数的情况下,这种方法获得的数字的稳定值永远大于或等于准确值,但是仍然是相当精确的值。

利用上述公式多次循环可以得到相当准确的值。

这里用Flash AS3写了一个小程序 可以用来模拟该过程

function cu(A:Number,m:String,uu:Number):void{

trace1("R  : "+Math.sqrt(A));

var f:Array=m.split("/");

var f1:Number=Number(f[0]); 

var f2:Number=Number(f[1]);

var t1:Number,t2:Number;

for(var i:Number=1;i<=uu;i++){

trace1((i<10?"0"+i:i)+": "+f1/f2);

trace1(" ("+f1+"/"+f2+")");

t2=2*f1*f2;

t1=f1*f1+f2*f2*A;

f1=t1;

f2=t2;

}


}

function trace1(s:String):void{

put.appendText(s);

put.appendText("\n");

}

cal.addEventListener("click",function(i:*):void{

put.text="";

cu(Number(q0.text),q1.text,int(q2.text));

});

元件摆放如下
程序运行的结果如下(初始值取3/2)


从而可以知道665857/470832已经是较为精确的值了(12位有效数字)。

以下是一些已经获得的结果(就是使用这个程序获得的)

√2 低精度近似665857/470832(12位有效数字)
 高精度近似768398401/543339720 (至少17位有效数字)
≈1.4142135623730951

√3低精度近似3650401/2107560(12位有效数字)
 高精度近似708158977/408855776  (至少17位有效数字)
≈1.7320508075688772

√5低精度近似4870847/2178309(12位有效数字)  51841/23184 (10位有效数字)
 高精度近似5374978561/2403763488  (至少15位有效数字)
≈2.23606797749979

√7低精度近似62921681/23782160(12位有效数字)
 高精度近似2081028097/786554688  (至少17位有效数字)
≈2.6457513110645907

√11低精度近似6874607/2072772(11位有效数字) 79201/23880(10位有效数字)
 高精度近似12545596801/3782639760 (至少14位有效数字)
≈3.3166247903554

_______________________________splitting_______________________________

以下谈一谈关于这个思路在笔算根号中的运用

1.初始值建议取比较逼近的值,但以简单为宜,如√2取3/2,√3取5/3。

2.保留分数直到第3次计算,第3次计算取6位小数(如上图04);精度不高的场合只需计算2次取2位小数(如上图03)。


大概就是这些,欢迎交流想法

下雨的声音

蛋痛Bug:让Child为null

这是写RainUI时遇到的奇妙BUG,有时候元件的Children列表里有null,起初还以为是AS3的缺陷。今天终于忍不住,用排除法进行调试,最后发现。如果一个显示对象已经在显示列表里,再去胡乱调用addChildAt,就会造成某个child为null的情况。

(然而这依旧是一个BUG)

这是写RainUI时遇到的奇妙BUG,有时候元件的Children列表里有null,起初还以为是AS3的缺陷。今天终于忍不住,用排除法进行调试,最后发现。如果一个显示对象已经在显示列表里,再去胡乱调用addChildAt,就会造成某个child为null的情况。

(然而这依旧是一个BUG)

下雨的声音

StageScaleMode.SHOW_ALL的缺陷

StageScaleMode.SHOW_ALL确实很好用,一行代码避免了适配舞台的问题。但是这个模式下有一个缺陷——开发人员无法获取舞台缩放值和舞台真实宽高。导致在不同的分辨率下任何调用stageWidth和stageHeight都可能出错。


解决方案:

stage.scaleMode = StageScaleMode.NO_SCALE;

stage.align = StageAlign.TOP_LEFT;

记录舞台真实宽高

记录原始宽高

计算宽高缩放比例

视图容器根据比例缩放

StageScaleMode.SHOW_ALL确实很好用,一行代码避免了适配舞台的问题。但是这个模式下有一个缺陷——开发人员无法获取舞台缩放值和舞台真实宽高。导致在不同的分辨率下任何调用stageWidth和stageHeight都可能出错。


解决方案:

stage.scaleMode = StageScaleMode.NO_SCALE;

stage.align = StageAlign.TOP_LEFT;

记录舞台真实宽高

记录原始宽高

计算宽高缩放比例

视图容器根据比例缩放

下雨的声音

D.eval用法札记

变量不需要声明,不需要定义类型

核心用法:D.eval(program, context, thisObject) this为对象提供属性 content 为键值对,提供、存储参数

D.parseFunctions(libCode); 返回带有函数的键值对

D.setOutput(logger); 设置logger出口,logger为函数或者带有name属性的对象

collectUserFunctions 返回前段eval的function值对

parseProgram 返回一段代码声明的键值对

setTextControlOutput ...

变量不需要声明,不需要定义类型

核心用法:D.eval(program, context, thisObject) this为对象提供属性 content 为键值对,提供、存储参数

D.parseFunctions(libCode); 返回带有函数的键值对

D.setOutput(logger); 设置logger出口,logger为函数或者带有name属性的对象

collectUserFunctions 返回前段eval的function值对

parseProgram 返回一段代码声明的键值对

setTextControlOutput 将output设置到文本框


函数参数不可带默认参数

下雨的声音

解决Air for iOS 无法进行 TestFlight 分发的问题

新方案:

直接在app.xml下<iPhone></iPhone>中加入:

 <Entitlements>

<![CDATA[ 

<key>get-task-allow</key>

<false/>

<key>beta-reports-active</key>

<true/>

]]>

</Entitlements>


旧方案:

苹果在新版的xcode编译过程中加入了一个授权文件,在其中添加beta...

新方案:

直接在app.xml下<iPhone></iPhone>中加入:

 <Entitlements>

<![CDATA[ 

<key>get-task-allow</key>

<false/>

<key>beta-reports-active</key>

<true/>

]]>

</Entitlements>


旧方案:

苹果在新版的xcode编译过程中加入了一个授权文件,在其中添加beta测试授权才可使用TestFlight功能。Air默认打包时并未加入beta测试授权,因此手动解决此问题,你需要准备:

* MacOS, Xcode, ApplicationLoader

* iResign(from github)

* 证书和mobileProvision


*打开Xcode ,选择New File -> iPhone OS -> Code Signing -> Entitlements 新建Entitlements.plist。或者手动编写一个(内容自己搜索。。。)。

*在plist中增加【beta-reports-active】字段,值为true。其他字段也要相应调整为和你的应用一致。

*用Air打包AppStore版ipa

*打开iResign,用Entitlements.plist对ipa进行重签

*上传ipa,即可使用TestFlight

下雨的声音

简易赛车的AI写法

wonderfl上有一个神奇的3D赛车游戏,只有短短的500行代码就实现了随机生成赛道数木障碍物,AI对手,视野控制等等功能。今天看了一下它的AI部分的源码,感觉相当秒。这里分享一下。游戏地址:http://wonderfl.net/c/njap

public function getAutoKey(w:World):uint

{

    //上 下 左 右 手刹,默认前进

    var key:uint = 0xF0000;...


wonderfl上有一个神奇的3D赛车游戏,只有短短的500行代码就实现了随机生成赛道数木障碍物,AI对手,视野控制等等功能。今天看了一下它的AI部分的源码,感觉相当秒。这里分享一下。游戏地址:http://wonderfl.net/c/njap

public function getAutoKey(w:World):uint

{

    //上 下 左 右 手刹,默认前进

    var key:uint = 0xF0000;

    //p:车座标,cp:目标点坐标,ofp:需要的位移量

    var p:Point = new Point(qobject.x, qobject.y), cp:Point = w.course[_targetIndex], ofp:Point = cp.subtract(p);

    //目标距离

    var d:Number = Point.distance(p, cp);

    //如果方向正确且快到目标点则更新目标点

    if (d < 10 + speed / 10 * proactiveRate || (cp.x * p.y) - (cp.y * p.x) > 0)

        _targetIndex = ++_targetIndex % w.course.length;

    //夹角公式,如果夹角大于0.12则转弯

    if (Math.acos((ofp.x * _front.x + ofp.y * _front.y) / (ofp.length * _front.length)) > 0.12)

        key |= (ofp.x * _front.y - ofp.y * _front.x > 0) ? 0x00F00 : 0x000F0;

    //前进受阻严重则倒车

    if (!_backMode && speed < 2 && ++_stress > 80)

        _backMode = true;

    //受阻减少则恢复

    else if (_backMode && --_stress <= 0)

        _backMode = false;

    //倒车时前后左右相反

    if (_backMode)

        key ^= 0xFFFF0;

    //弯度、速度、距离满足条件时飘移

    if (speed > 7 && w.tightness[_targetIndex] > 1 && d < 20)

        key |= 0x0000F;

    return key;

}


有时候只用if实现AI已经足够

下雨的声音

用AS3修改末日商旅2存档

末日商旅2仅仅一个30m的小游戏,自由度和系统却非常棒。昨天准备调一下金钱快速通关,但是很奇怪CheatEngine用各种办法都搜索不到内存地址,不知道是不是64位Player造成的。于是决定从SharedObject下手。

1.在C:\Users\Rain\AppData\Roaming\Macromedia\Flash Player\#SharedObjects找到相应的存档文件,用Flash SharedObject File Reader打开,发现核心数据是ByteArray。

2.没办法,反编译游戏文件,发现存档关键处理是:

_loc_10 = new ByteArray...

末日商旅2仅仅一个30m的小游戏,自由度和系统却非常棒。昨天准备调一下金钱快速通关,但是很奇怪CheatEngine用各种办法都搜索不到内存地址,不知道是不是64位Player造成的。于是决定从SharedObject下手。

1.在C:\Users\Rain\AppData\Roaming\Macromedia\Flash Player\#SharedObjects找到相应的存档文件,用Flash SharedObject File Reader打开,发现核心数据是ByteArray。

2.没办法,反编译游戏文件,发现存档关键处理是:

_loc_10 = new ByteArray();

_loc_10.writeObject(_loc_1);

_loc_10.compress("zlib");

return _loc_10;

3.那么处理方法也很简单了:

var so:SharedObject = SharedObject.getLocal("savedData");

var saveBA:ByteArray = so.data.saves[1].save;

saveBA.uncompress();

var save:Object = saveBA.readObject();

save.Caravans[0].money = 99999999;

saveBA.writeObject(save)

saveBA.compress();

so.flush();


2015-06-28更新

准备把之前写的末日商旅2存档修改器加工一下。思路是这样:将sol文件复制到自身SharedObject文件夹,然后用SharedObject.getlocal打开存档,修改存档数据,然后再将文件copy回去。

实际操作中发现,SharedObject文件是不可以改名的。改名之后data将无法阅读。神奇= =

另外,在Air应用开启过程中,不再读取SO文件,所以在玩游戏的时候,修改存档文件是没有意义的。


编辑器地址:http://pan.baidu.com/s/1i3lHllF


下雨的声音

Air开发的游戏和应用

手机上有哪些应用是Air开发的?这个其实不难判断,AirSDK在打包Android应用时,为自动为AppID加上【air.】的前缀。所以可以以此为线索,比如只要搜索【details?id=air.】,就可以搜索出GooglePlay上的Air应用。


机械迷城

经典解谜游戏

RPG进化史 (Haxe)

Papers,Please (Haxe)

IGF2014年度最佳游戏

Photoshop Touch

by Adobe

游戏机被老妈藏起来了

日系脑洞小游戏

slither.io蛇蛇大作战(手机版)...


手机上有哪些应用是Air开发的?这个其实不难判断,AirSDK在打包Android应用时,为自动为AppID加上【air.】的前缀。所以可以以此为线索,比如只要搜索【details?id=air.】,就可以搜索出GooglePlay上的Air应用。


机械迷城

经典解谜游戏

RPG进化史 (Haxe)

Papers,Please (Haxe)

IGF2014年度最佳游戏

Photoshop Touch

by Adobe

游戏机被老妈藏起来了

日系脑洞小游戏

slither.io蛇蛇大作战(手机版)

 

贪吃蛇大作战原版

逃离方块锈色旅馆

 

国产解谜游戏

Zasa:极限烧脑之旅

 

国产解谜游戏,AppStore首页推荐

 

幽灵记忆

解谜游戏,画风不错

血之火焰

CSI:罪案迷踪

育碧

富爸爸现金流游戏

Mockups(原型设计)

口袋忍者

神之折纸

钢铁力量:迷你坦克世界

by CoolFish

魔卡幻想

by iFree Studio

蠢蠢的死法/Dumb Ways to Die

爆红公益短片配套游戏

by Milkman Games

砖形枪/Gunbrick

英雄大作战X

开发者:小熊

小斗士续作

脑力达人

腾讯魔方工作室

TitanSoul(PC)

 

始于Ludum Dare

 
下雨的声音

RainUI开发经验

市面上没有一个令我满意的生产用UI库,于是决定自己开发一个。在参考了MornUI、FeathersUI、MinimalComps之后,给自己的UI库定下了目标:

1.解耦,类可以脱离框架单独使用

2.可以兼容Flash进行可视化编辑

3.自适应

4.可换肤

5.轻量


下面说一下我是怎么解决的:

1.解耦很简单,将每个组件高度独立,唯一依赖是RainUI的一些全局静态接口。

2.在生成组件内容时,自动检测某些显示对象是否存在,如果存在则使用现成对象,否则新建。

3.组件提供了像素和百分比两种数值(以后可能会加上物理尺寸),以及left top bottom right的相对...

市面上没有一个令我满意的生产用UI库,于是决定自己开发一个。在参考了MornUI、FeathersUI、MinimalComps之后,给自己的UI库定下了目标:

1.解耦,类可以脱离框架单独使用

2.可以兼容Flash进行可视化编辑

3.自适应

4.可换肤

5.轻量


下面说一下我是怎么解决的:

1.解耦很简单,将每个组件高度独立,唯一依赖是RainUI的一些全局静态接口。

2.在生成组件内容时,自动检测某些显示对象是否存在,如果存在则使用现成对象,否则新建。

3.组件提供了像素和百分比两种数值(以后可能会加上物理尺寸),以及left top bottom right的相对位置模式。

4.由RainUI根据theme给组件提供皮肤。组件不知道theme的存在


在实际操作中遇到不少问题

1.Flash组件和参数会强行修改参数默认值。

2.Flash并不能实时显示自适应效果。

3.用代码处理元件参数,效率非常低。

4.用xml处理元件参数,需要配合可视化编辑器。

5.可视化编辑器开发麻烦,且并不如Flash来得方便。


这就形成了一个死循环,唯一解开的方案是,开发一个足够好用且优秀的可视化编辑器。。。额,等我再考虑一下吧。

下雨的声音

a,b,c为正整数且a<b<c, a^2+b^2=c^2, a+b+c=1000。求a,b,c的值

由题目可分析得:C<500,因此第一层从500开始递归,这样有个好处,【500到C的距离】肯定小于【0到A的距离】。

如果思路比较清楚的话会写成这样:

private function calc():void
{
        for (var k:int = 499; k > 0; k--)
                for (var j:int =...

由题目可分析得:C<500,因此第一层从500开始递归,这样有个好处,【500到C的距离】肯定小于【0到A的距离】。

如果思路比较清楚的话会写成这样:

private function calc():void
{
        for (var k:int = 499; k > 0; k--)
                for (var j:int = k - 1; j > (1000-k-j); j--)
                {
                        var i:int = 1000 - i - j;
                        if (i * i + j * j == k * k)
                        {
                                trace(i, j, k);
                                return;
                        }
                }
}

有童鞋直接把三元方程组降元后写出了更高效率的公式:

private function calc():void

    for(a = 333; a > 0; a --)

     {

             b = (500000- 1000* a) / (1000- a);

             c = 1000- a - b;

             if(a * a + b * b == c * c)

             {

                     trace(a,b,c);

                     return;

             }

     }

}

像这种算法题,核心思想就是:人可以受累,让计算机尽量少算。

mingyeyishi

自定义上下文菜单

从 InteractiveObject 类进行继承的每个对象可以具有唯一的上下文菜单,用户在 SWF 文件内右键单击时将显示该菜单。默认情况下,菜单中包含几个命令,其中包括“前进” 、“后退” 、 “打印”、 “品质”和 “缩放” 。除了“设置”和“关于”命令外,您可以从菜单中删除所有其它默认命令。如果将 Stage 属性 showDefaultContextMenu 设置为 false,则会从上下文菜单中删除这些命令。要为特定显示对象创建自定义的上下文菜单,请创建 ContextMenu 类的一个新实例,调用hideBuiltInItems() 方法,并将该实例分配给该 DisplayObject...

从 InteractiveObject 类进行继承的每个对象可以具有唯一的上下文菜单,用户在 SWF 文件内右键单击时将显示该菜单。默认情况下,菜单中包含几个命令,其中包括“前进” 、“后退” 、 “打印”、 “品质”和 “缩放” 。除了“设置”和“关于”命令外,您可以从菜单中删除所有其它默认命令。如果将 Stage 属性 showDefaultContextMenu 设置为 false,则会从上下文菜单中删除这些命令。要为特定显示对象创建自定义的上下文菜单,请创建 ContextMenu 类的一个新实例,调用hideBuiltInItems() 方法,并将该实例分配给该 DisplayObject 实例的 contextMenu 属性。下面的示例为一个动态绘制的正方形提供了一个上下文菜单命令,用于将其更改为随机颜色:

var square:Sprite = new Sprite();
square.graphics.beginFill(0x000000);
square.graphics.drawRect(0,0,100,100);
square.graphics.endFill();
square.x = 10;
square.y = 10;
addChild(square);
var menuItem:ContextMenuItem = new ContextMenuItem("Change Color");
menuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,changeColor);
var customContextMenu:ContextMenu = new ContextMenu();
customContextMenu.hideBuiltInItems();
customContextMenu.customItems.push(menuItem);
square.contextMenu = customContextMenu;
function changeColor(event:ContextMenuEvent):void
{
square.transform.colorTransform = getRandomColor();
}
function getRandomColor():ColorTransform
{
return new ColorTransform(Math.random(), Math.random(),Math.random(),1,(Math.random() * 512) - 255,(Math.random() * 512) -255,(Math.random() * 512) - 255, 0);
}


下雨的声音

跨平台自适应AVG引擎——RainAvgEngine

经过不断的折(mo)腾(yu),RainAvgEngine终于完成。同时利用该引擎编写的手机版《逃出青龙山》也完成。撒花~~~

[图片]
引擎基本思路:

1.只保留最基本功能:显示人像、图片和文字,震动淡入淡出,播放音乐音效,存档读取,变量存取。

2.自动加载资源和脚本。(这个方案并不优秀,只是很偷懒,以后会修改。)

3.代码化的脚本,脚本功能易扩展。


源码地址:

https://github.com/rainssong/RainAvgEngine

经过不断的折(mo)腾(yu),RainAvgEngine终于完成。同时利用该引擎编写的手机版《逃出青龙山》也完成。撒花~~~


引擎基本思路:

1.只保留最基本功能:显示人像、图片和文字,震动淡入淡出,播放音乐音效,存档读取,变量存取。

2.自动加载资源和脚本。(这个方案并不优秀,只是很偷懒,以后会修改。)

3.代码化的脚本,脚本功能易扩展。


源码地址:

https://github.com/rainssong/RainAvgEngine

下雨的声音

kinect拳击游戏demo

Kinect做体育类游戏还是很不错的,最近做了一个拳击游戏的Demo,实现以下交互:进攻(出右拳),防御(双手护头),躲闪(走位),还加一个吃了药的电脑。(密码:kinect)


大家可以看一看演示视频。


这里简单讲一下开发技巧: 

首先你要搭建好Kinect开发环境(KinectWindows+KinectSDK+airkinect-2-core-mssdk.ane)

然后对于进攻的判定,获取user.rightHand.position.worldRelative.z,如果两帧之间差值小于-0.1,说明玩家右拳正在伸出去

对于防守的判定:只要双手的y坐标高于脖子user...

Kinect做体育类游戏还是很不错的,最近做了一个拳击游戏的Demo,实现以下交互:进攻(出右拳),防御(双手护头),躲闪(走位),还加一个吃了药的电脑。(密码:kinect)


大家可以看一看演示视频。


这里简单讲一下开发技巧: 

首先你要搭建好Kinect开发环境(KinectWindows+KinectSDK+airkinect-2-core-mssdk.ane)

然后对于进攻的判定,获取user.rightHand.position.worldRelative.z,如果两帧之间差值小于-0.1,说明玩家右拳正在伸出去

对于防守的判定:只要双手的y坐标高于脖子user.neck.position.worldRelative.y,就进行防守

对于走位的判定:获取身体的x坐标进行判定即可
为了使进攻流畅,还要增加一个操作池,用于保存出拳的次数达到连击的功能。

搞Kinect开发的小盆宇不多加上游戏本身没什么复杂性,就不开放源码了(主要是懒)。


下雨的声音

flash开发的各种坑

标题:flash开发的各种坑 

分类: AS3

日期: 2014-10-27 10:43

原文地址: http://blog.sina.com.cn/s/blog_59fc39980101ffho.html


1.有时候,SWC中MovieClip第一帧的代码不会执行。解决方案:放第二帧。 

2.用switch语句的时候,括号里的如果是表达式可能会无法正确识别,应该写成单一的变量

3.少数情况下,对SharedObject对象的data使用||=可能会不执行(并带来一系列问题)。

4.9切片+滤镜+GPU渲染+iOS实机,不响应鼠标事件。具体原因不明...

标题:flash开发的各种坑 

分类: AS3

日期: 2014-10-27 10:43

原文地址: http://blog.sina.com.cn/s/blog_59fc39980101ffho.html


1.有时候,SWC中MovieClip第一帧的代码不会执行。解决方案:放第二帧。 

2.用switch语句的时候,括号里的如果是表达式可能会无法正确识别,应该写成单一的变量

3.少数情况下,对SharedObject对象的data使用||=可能会不执行(并带来一系列问题)。

4.9切片+滤镜+GPU渲染+iOS实机,不响应鼠标事件。具体原因不明

5.在声明类变量或常量的时候尽量避免创建new非基础对象,此时程序初始化并未完成,很多甚至类还是Null;

6.StageVideo+Away3D+原生视图+iOS,Away3D无法显示,原因不明。

7.文本显示xml内容渲染不正常(丢失一部分文字)。原因猜测:程序初始化压力太大。解决方法:延迟新建视图。

8.视频编码H.264或者音频编码AAC格式的视频无法在iOS端正常播放

9.位图不显示:位图格式不兼容造成,手动转换为位图可解

10.自定义类不要和顶级类重名,否则会死得不明不白

11.type parameters with a non-parameterized type。对非类型类进行了类型定义,原因是Flash编译器不支持Array.<Number>这样的类型定义。

12.元件宽高上百万。原因:从AI复制过来的矢量元素存在宽高不准问题,解决方案:重建或转为位图。


下雨的声音

让ane支持android-x86的快速方法

标题:让ane支持android-x86的快速方法 

分类: AS3

日期: 2014-06-06 18:44

原文地址: http://blog.sina.com.cn/s/blog_59fc39980101irhr.html


1.用rar打开ane,找到extension.xml并打开 

2.复制《Android-ARM》字段,重命名为《Android-x86》

3.找到Android-ARM文件夹

4.复制并重命名为Android-x86


这样有两个好处:

1.无需原文件

2.无需重新打包ANE


标题:让ane支持android-x86的快速方法 

分类: AS3

日期: 2014-06-06 18:44

原文地址: http://blog.sina.com.cn/s/blog_59fc39980101irhr.html


1.用rar打开ane,找到extension.xml并打开 

2.复制《Android-ARM》字段,重命名为《Android-x86》

3.找到Android-ARM文件夹

4.复制并重命名为Android-x86


这样有两个好处:

1.无需原文件

2.无需重新打包ANE


下雨的声音

AS3里的日期

标题:AS3里的日期 

分类: AS3

日期: 2014-05-23 02:08

原文地址: http://blog.sina.com.cn/s/blog_59fc39980101ie6r.html


这么乱七八糟的命名有意义吗?

toDateStringFri May 23 2014

toLocaleDateStringFri May 23 2014

toLocaleStringFri May 23 2014 02:02:00 AM

toLocaleTimeString02:02:00 AM

toStringFri May 23 02:02:00 GMT+0800...

标题:AS3里的日期 

分类: AS3

日期: 2014-05-23 02:08

原文地址: http://blog.sina.com.cn/s/blog_59fc39980101ie6r.html


这么乱七八糟的命名有意义吗?

toDateStringFri May 23 2014

toLocaleDateStringFri May 23 2014

toLocaleStringFri May 23 2014 02:02:00 AM

toLocaleTimeString02:02:00 AM

toStringFri May 23 02:02:00 GMT+0800 2014

toTimeString02:02:00 GMT+0800

toUTCStringThu May 22 18:02:00 2014 UTC


LOFTER

让兴趣,更有趣

简单随性的记录
丰富多彩的内容
让生活更加充实

下载移动端
关注最新消息