龙年秀龙..目前效率远超前两个版本。新引擎将和gene合作开发.yeah..
swf
用正则表达式实现搓招
星期二, 27 十二月 2011
这里分享用正则表达式实现搓招逻辑,我们玩街机的时候经常需要设置键盘,以及更改搓招按键。所谓搓招就是设置一个按键输入的序列类似于 【前+下+前:A】 就是我们常用的升龙拳的撮招序列。撮招逻辑有很多种实现方式,正则表达式方式个人感觉是比较灵活的,通俗的。
设计大概如下
我们把所有的按键输入看作是一个stream,然后从stream中去匹配所有撮招规则,一旦有符合的招数产生时便抛出事件,清理stream,继续侦听。对象设计上,我们考虑将这个功能封装成一个可编程的键盘。就像现实中,我们购买的多功能键盘一样可以自己定义功能,这里我们要定义的是一个带撮招功能的键盘。
在创造这个stream之前需要将一些信息单位化。比如撮招中的间隔时间,我们可以把10ms看作是一个字符用*代替,各种按键也转换为字符。这样你的输入流就会变成这样的字符串“F39★★F40★F37★★F40★F37★F38★★★★F40F39★F37★★★F83F68F70”现在,我们便可以用正则表达式来找寻我们需要的招式了。
例如 “right(★){0,3}down(★){0,3}right(★){0,3}attack” 这样一招就表示按键右按下0-3个延迟单位再按键下延迟0-3个单位再按键右0-3个单位再按键attack,匹配的时候需要将up,down,attack转化成按键定义例如F12,F23再进行匹配。 按键定义这样是为了避免字符前后冲突。 right,down是方便用户编写动作的表达。这样,便可以实现正则表达式轻松替换技能配置,和按键间隔时间调整。是不是非常方便?
在molehill2D引擎中利用显卡做拣选
星期五, 2 十二月 2011
最近一直在研究更好的拣选方法。其实,是因为想绕开射线法。总感觉射线法检测流程太繁琐,懒得去弄。之前跟同事@donaldwu在聊到这个拣选的时候他给了我一个很好的思路,即让显卡来帮助拣选。之前有看过Away3D做过这个事情,但是它只是针对单个模型的拣选。这里要分享的是直接得到画面的拣选结果,即所点即所得。重申一下,为什么2D引擎要做设个事情,因为我的2D引擎是支持Z轴的。所以要支持带深度的拣选。
这里的拣选跟之前那篇文章提到的拣选是不一样的,请看完理解。
这个跟屏幕认知过程是一个原理,我们在看到画面的时候已经知道鼠标是否点中了,因为我们知道选中的那个像素是哪个对象的。现在我们要让我们编写的代码也知道这个事实。原理很简单,就是能通过鼠标点中的像素还原对象的引用。
(更多…)
通过渲染结果判断3D拣选的方案
星期日, 20 十一月 2011
很久以前研究away3d的时候,发现away3d是用渲染结果来判断是否拣选到。因为源码看起来比较头晕,也就没怎么深入了。不过,仍然给我留下了深刻印象。
因为一直不想用3d射线的拣选方案,所以,今晚又把渲染拣选方案拿出来动手实践了一下。基本上是探测到本质了。
他的大概思路是将鼠标拣选的位置,渲染到1像素的位图上,然后检测这个像素颜色是否不等于buffer的默认颜色。本质就是渲染画面中被鼠标点中的那个像素,根据颜色值判断是否点中了。
具体实现分下面三步:
step1:
利用相机将鼠标选中的位置偏移到左上角.
step2
渲染当前相机&待检测物件到btimapData,记得context.drawToBitmapData?
step3:
判断像素
三个步骤很简单,代码量很少。但是第一步是需要做一些事情的。
第一步相机挪动的坐标
var
x:Number=e.stageX/Scene.width*2;
var
y:Number=-e.stageY/Scene.height*2*Scene.scale;
Camera.current.position=new
Vector3D(x*(dd[0]*mZ+1),y*(dd[5]*Scene.scale*mZ+1),0);
dd[0]是透视矩阵的scaleX分量,dd[5]是scaleY的分量,要得到实际坐标,一定要乘上当前的z值。
最后谈下这种思路的优缺点,
1、实现思路直观,即显卡渲染结果来检测模型是否拣选。
2、流程简洁/相对于射线拣选法。
3、越复杂的模型,越是它的优势(相对射线法来说,因为计算成本转移给显卡了,实际上是计算成本转移到显卡了)。
4、像素级检测。
这个在某些情况下会是弱点,比如说一个模型中间部分是透明的,但是又希望响应点击,就不行了。
缺点:
1、必须是像素检测
2、务必保证最小次数的拣选渲染。因为显卡到内存这里时间成本比较高,如果一次拣选最后需要渲染好几次才能得到结果的话,会阻断。
利用AMD RenderMonkey学习Shader编程
星期日, 20 十一月 2011
近学习Shader编程了解到RenderMonkey这个Shader编写工具,研究了一下,发现能成为一个很好的Shader学习资源。这里旨在分享如何利用这个工具去学习Shader编程,并非分享Shader编程本身。
RenderMonkey是AMD官方提供的Shader编程工具[下载地址]
web写作太特闷悲催,半天一张图片,不插图了。抱歉。
呐,可以看到左边有VertexShader和PixelShader点击既可以查看源码。然后源码上方Target是Shader版本号,main主函数名称,Disassebly就是显示汇编的,学AGAL的同学其实比较期望能看到汇编源码。
HLSL就是C语言
float4x4 view_proj_matrix: register(c0);
float4 lightPos: register(c4);
这里是声明两个变量view_proj_matrix,lightPos。分别指向一个4*4矩阵和一个Vector3D常量寄存器对应到molehill里面就是Context3D.setConstrantsFromMatrix所给定的常量,Context3D.setConstrantsFromMatrix(0,new Matrix3D,true);
Context3D.setConstrantsFromVector(4,new Vector3D);
第一个是透视矩阵,第二个应该是灯光的位置。
再来看main函数的两个参数,Pos和normal,这个是属于顶点数据传输过来的数据。
一个顶点数据可能是这样x,y,z,x,y,z mohill里面就是
setVertexBufferAt(0,VertexBuffer,n)..这样传入显卡.当然提交数据是VertexBuffer.updateFromVector完成的
最后再看VS_OUTPUT这个结构体里面就定义了Pos,normal,ligtht
最终在VertexShader里面的计算结果会输出这三个内容到Pixelshader继续流程。
vs_1_1
dcl_position v0
dcl_normal v1
dp4 oPos.x, c0, v0
dp4 oPos.y, c1, v0
dp4 oPos.z, c2, v0
dp4 oPos.w, c3, v0
add oT1.xyz, -v0, c4
mov oT0.xyz, v1
查看生成的汇编。。是不是跟AGAL很像。准确的说AGAL是这个的子集。
其中dcl_position是固定的叫声明一个位置,vs_1_1是指定当前ShaderModel适用版本号
PP2D加入文本渲染
星期二, 25 十月 2011
渲染思路很简单,TextField生成图形,BitmapData draw 然后当作Image来更新.
需要处理的是位图Buffer是随着文本框动态更新的,今天从blueshell那淘到两个实用函数
获得任意整数最近的2的n次方的数,非常有用,如果你要动态贴图,这个函数会很有用。
悲愤的是,快回家的时候居然搞出一个bug,调来调去最后是因为UV坐标忘了格式化到0-1了。
明天就能完成TextField了。Flash这点比客户端实现文本爽多了,客户端实现文本,还得自制
一张map表,包含常用字符。
想来想去,3D空间是不怎么需要很动态更新的文本,所以用来显示角色名,UI什么的其实问题都不大了
内存估计有点浪费,等问题出现再说。
molehill实现骨骼贴图动画
星期一, 24 十月 2011
在用molehill实现骨骼贴图之前翻阅了很多资料,在搞清楚原理之后总结了几点实现重点。
1、基于VertexShader
实现骨骼贴图的核心点在于VertexShader能同时处理顶点对应的4根(理论值最多4根)骨骼的影响,每个顶点能同时处理几根骨骼的核心在于常量寄存器vc是可以下标访问的,类似于数组的访问vc[0...n],郁闷的是我刚开始并不知道可以这么访问寄存器,所以,卡了我很久。在翻阅了away3d的Shader生成代码后才发现,并做了测试代码验证。
“m44 vt0, va0, vc[va3.x] \n” +
“mul vt0.xyz, vt0.xyz,va4.x\n”+
“mov vt1,vt0\n”+
“m44 vt0, va0, vc[va3.y] \n” +
“mul vt0.xyz, vt0.xyz,va4.y\n”+
“add vt1,vt1,vt0\n”+
“m44 vt0, va0, vc[va3.z] \n” +
“mul vt0.xyz, vt0.xyz,va4.z\n”+
“add vt1,vt1,vt0\n”…..
上面AGAL部分代码是处理顶点的三根骨骼矩阵,vc是常量寄存器,va是骨骼,用四元数存储四根骨骼序列,核心就这些了。
2、骨骼运动。
骨骼运动相对简单,就是矩阵的叠加,这里需要注意的是矩阵的叠加顺序,需要从子矩阵往父矩阵叠加。
每次update的时序是每根骨骼自己先做运动,然后从子矩阵到父矩阵叠加。
完整的骨骼代码还没实现,等待2D引擎重构完毕后加入这个特性。


进去查看demo