在Havok Project Anarchy 中创建透视效果

先晒晒收到的Havok 活动抱枕

h1h2

进入正题

本人首发于http://www.anarchy.cn/ 本人博客 http://www.dreamfairy.cn 转载请著名出处
很多人都见过 RPG Sample 中的 XRay 透视效果, 像这样

h3

英雄在被铁链遮挡的部位会呈现透视的效果,而不是被遮挡。

这个效果需要2个Pass
即一个用来呈现被遮挡时的表现
一个用来呈现未被遮挡时的表现
继续阅读“在Havok Project Anarchy 中创建透视效果”

在Havok Vision中编写 NavMesh 寻路

这篇教程的前提是已经掌握了如何在PA中创建NavMesh,如果你还不会,请参考官方的教程
http://www.anarchy.cn/portal.php?mod=view&aid=15

首先创建我们的Hero, 寻路的主角
我选择在代码中创建的方式,而创建坐标是在PA中创建一个 名为 Spawn的模型,给它一个 key 比如 9527 . 然后我们在 Vision中通过key 找到它

 VisBaseEntity_cl * pPlayerSpawn = Vision::Game.SearchEntity("9527");
     if(NULL != pPlayerSpawn){
         Vision::Message.Add(1, "Try To CreatePlayer");
         hkvVec3 pos = pPlayerSpawn->GetPosition();
         hkvVec3 rot = pPlayerSpawn->GetOrientation();
         m_playerEntity = SpawnPlayer("Models/Eddy Export/Eddy.MODEL",pos, rot);
         //把出生点隐藏掉
         pPlayerSpawn->SetVisibleBitmask(0);
     }

SpawnPlayer 函数的内如

    VisBaseEntity_cl * tmp = Vision::Game.CreateEntity("VisBaseEntity_cl", position, prefabName);
    if(NULL != tmp){
        tmp->SetOrientation(orientation);
        m_vPos = tmp->GetPosition();
        m_vRot = tmp->GetOrientation();
    }
    return tmp;

有了Hero后,就可以开始创建寻路AI了。
这里有见基础的组件来做

    m_aiSteering = new vHavokAiSteering();
    m_aiSteering->SetRadius(40);
    m_aiSteering->SetDesiredSpeed(400);
    m_aiSteering->SetEntityPivotHeight(0);
    m_aiSteering->SetSensorSize(500);
    m_aiSteering->SetTurnRadius(40);
    m_aiSteering->SetKinematicConstraint(vHavokAiSteering::CONSTRAINT_LINEAR_AND_ANGULAR);
    m_aiSteering->SetMaximalAngularVelocity(4);
    m_aiSteering->SetMaximalAcceleration(2000);
    m_aiSteering->SetMaximalDeceleration(3000);

    m_playerEntity->AddComponent(m_aiSteering);

接下来要做的事情显而易见,就是点击屏幕,然后算出投影到NavMesh上的坐标,然后寻路过去呗
对于lua 来说有个 Sceene:PickPoint. cpp 也有可惜没有 export dll 没事,我们抄写出来就行

like this

hkvVec3 * MyGameManager::PickPoint( float x, float y, float fMaxDist )
{
    hkvVec3 *result = NULL;

    hkvVec3 traceStart = Vision::Camera.GetCurrentCameraPosition();
    hkvVec3 traceDir;
    Vision::Contexts.GetCurrentContext()->GetTraceDirFromScreenPos(x, y, traceDir, fMaxDist);
    hkvVec3 traceEnd = traceStart + traceDir;

    hkVector4 s;
    vHavokConversionUtils::VisVecToPhysVecWorld(traceStart, s);
    hkVector4 e;
    vHavokConversionUtils::VisVecToPhysVecWorld(traceEnd, e);

    hkaiNavMeshQueryMediator::RaycastInput rcInput;
    rcInput.m_from = s;
    rcInput.m_to = e;

    hkaiNavMeshQueryMediator::HitDetails hitInfo;

    const hkaiNavMeshQueryMediator* mediator = vHavokAiModule::GetInstance()->GetAiWorld()->getDynamicQueryMediator();
    hkBool didHit = mediator->castRay( rcInput, hitInfo );

    if (didHit)
    {
        hkVector4 hitPoint;
        hitPoint.setInterpolate4( s, e, hitInfo.m_hitFraction);

        result = new hkvVec3(0);
        vHavokConversionUtils::PhysVecToVisVecWorld(hitPoint, *result);
    }

    return result;
}

最后的最后,在Run函数中检测鼠标是否按下,然后做这样的事情

if(bOnMouseClick){
                    hkvVec3 * goal = PickPoint(posX, posY);
                    if(goal){
                        m_aiSteering->RequestPathTo(*goal);
                    }else{
                        m_aiSteering->CancelPath();
                    }
                }

这个时候如果你想说,我看不到鼠标咋办? 很好办,自己画一个

void MyGameManager::DrawCursor(float posX, float posY)
{
    Vision::Game.DrawSingleLine2D(posX,posY,posX + 10, posY + 5, V_RGBA_GREEN);
    Vision::Game.DrawSingleLine2D(posX,posY,posX + 5, posY + 10, V_RGBA_GREEN);
    Vision::Game.DrawSingleLine2D(posX + 10,posY + 5,posX + 5, posY + 10, V_RGBA_GREEN);

    Vision::Message.Print(1,200,500,"Mouse Pos X %f Y %f", posX, posY);
}

最后如果你又问,我的Hero在寻路的时候不会转向怎么办,也好办,写个Hkt 或者,用代码来动态算
在 Run 函数中加入如下

                if(m_aiSteering->HasPath()){
                    hkvVec3 lastPos = m_vPos;
                    hkvVec3 nowPos = m_playerEntity->GetPosition();
                    float dx = lastPos.x - nowPos.x;
                    float dy = lastPos.y - nowPos.y;
                    float degree = hkvMath::atan2Deg(dy,dx) - 90;
                    m_vRot = hkvVec3(degree,0,0);
                    m_eState = ROLE_RUN;
                }
                                m_playerEntity->SetOrientation(m_vRot);

如果你问我Hkt 怎么做转向? 改日再说吧,我要睡觉啦。

Havok Vision Project Anarchy 创建项目的二三事

最近开始深入开发C++ 的 Havok Vision, 遇到许多许多的坑,整个互联网上居然都没有前人列出来,于是我决定把遇到的坑都填上,造福你们这些看到本文章的有缘人

1.从project anarchy生成项目的时候,如果要使用ScaleForm ,请务必勾选 Enable ScaleForm Support
2.如果运行demo, 遇到无法加载 vHavokAI.Plugin 或者 vHavokBehavior.Plugin 那是因为模板文件没有把这个文件拷贝的项目的运行目录下,需要到你 vForge.exe 运行目录下找到这2个文件,然后拷贝到你项目的生成目录下
3.一旦使用了 vHavokAI 相关API 就会报错,找不到函数实现的错误, 比如使用的 vHavokAIModule 等模块, 那么需要编译一下它的依赖lib. 这个项目在类似这样的目录下 HavokVisionSDKWorkspaceWin32_VS2012_win7_DX9HavokVision_Editor_Win32_VS2012_win7_DX9.sln 找到你项目依赖的lib平台 dx9,dx11 x32 x64 等,把它们生成一下
4.如果做完第3点后,仍然报错,在使用AI相关的项目上做如下设置 项目->属性->C/C++->预处理器->预处理器定义 加上一个宏 VHAVOKAIMODULE_IMPORTS 即可 Behavior有问题的话,同理

etc…

最近无聊写了个Havok Demo,顺便发出来好了

话说Havok 自从 project anarchy 出来后,就没看到任何教程=。=, 社区也几乎没人。
切官网文档都是Lua的。 我写个C++的Demo 真是困难耶. 不过慢慢找到诀窍了。

by the way
百度BCS 貌似图标全部失效了, 之前的Flash档Demo貌似加密无法解析了, 空间貌似访问的速度好慢。。。 时候全部换掉了 =。=

然后上个截图 < 西游记之大圣归来>
monkeyking

看完表示很值票价,同时期评分最高有木有,大家快去看。

好,进入正题~
继续阅读“最近无聊写了个Havok Demo,顺便发出来好了”

Loog time no see~

很久,很久,很久没有写博客,好像都有半年的样子了 😀
一直都在忙项目的说~
好歹游戏游戏上线了,目前正在公测beta阶段
KindomsCHarge
相关主页在FB上啦 https://www.facebook.com/kingdomscharge

我表示一个人完成所有技能表示心理好虚~一共170+个技能。
顺带提供一下apk网盘地址吧~
http://pan.baidu.com/s/1c0m4eo4

在Spine中翻转骨骼动画播放 AS3 与 Cocos2dx

之前一直在用 cocos2dx 的 cocosStudio 自带的骨骼动画
但是为了由于Spine支持网格动画,于是手头的项目都转到支持Spine的骨骼的说。

最近想做一个动画倒播的功能,在之前的 cocosStudio 中,可以通过 API, gotoAndStop(frame) 来实现倒播
到了 Spine 里,貌似就没有这个功能啦

嘛~研究了一下,貌似改起来难度不高。。 自己的本本没装各种编程软件。。。(游戏本嘛) 只有Flash Profession CC, 于是就拿 AS3版本来改改先啦。

话说Spine也是蛮搞的,C++ 版本要合并 Spine C 和 Spine cocos2dx. 而 Flash版本要合并 Spine flash 和 Spine Starling. 而且还没有完整API,丰富的范例(就2个。。还没体现所有功能)

就拿AS3的版本举例好了,最后说下C++中对应的关系就行了
继续阅读“在Spine中翻转骨骼动画播放 AS3 与 Cocos2dx”

cocos2d-x-2.x APK 打包问题汇总

很久没有发全技术文章了。。。
今天折腾了几个小时,终于编译成功一个复杂的cocos2d-x-2.x 项目了。。其中遇到的坑数都数不过来。

1.资源目录中不能包含中文路径,否则打包失败

2.XML配置表中不能包含全角符号,否则加载失败

3.在部分低端手机上,SpriteSheet 的大小达不到 2048 * 2048 会导致闪退

由于项目使用了rapidxml, 而 rapidxml 又调用了 Boost 所以这里要编译boost的相关库
boost_system 和 boost_iostreams

Boost相关问题

4.Boost的HPP文件,不需要加入 Android.mk 中,这是一个类似于.h文件一样的东西,不需要填

5.Boost的库需要用NDK打包成库
1)下载最新的Boost 1.55 http://iweb.dl.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.zip
2)使用cygwin 编译 bootstrap.sh 生成 b2.exe, bjam.exe
3)修改 /tools/build/v2/user-config.jam 内容如下

继续阅读“cocos2d-x-2.x APK 打包问题汇总”

The Legend of Heroes:Sen No Kiseki. stage all clear!

终于把闪之轨迹通关了~

话说闪轨的梗真的好多。

比如校舍第七层的最终BOSS场景,就是Fate Stay Night 中 Archer的无限剑制呀

kiseiki1

最终BOSS的高达战,又满满的 异度装甲 的即视感。。。十几年前的游戏了。。

闪轨

kiseiki2

异度装甲

最后的最后,今天想把 CCSpriteWithFilter 放到手机上测试的时候,发现不设置滤镜的话,默认根本不显示。。 然后是 GodRay滤镜会直接把程序弄崩溃了。。

GodRay的问题我在PC上测试本来是木有问题的,看来手机上的OpenglES 更加严格的说。。。 抱歉之前一直都没有真机测试的说了。

在实际过程中发现
手机上的OpenglES 是强类型的, 不同类型运算比如int / float 会崩溃。
uniform 设置初始值会崩溃
给float 赋值时末尾带f会崩溃
等等。。。
看来以后要多注意这方面的差别了。

好了,今天给修复了。
https://github.com/dreamfairy/cocos2dx-2.x-filters/
GodRay 在我的小霸王手机上测试大概20帧的样子,实际上可以通过修改采样数来提高帧数的说

真机截屏,华为荣耀3(前几天差点给摔碎了 :p )
godrayhw

GodRay APK (小米手机勿下,会闪退)
http://pan.baidu.com/s/1CPmuq

后会无期 and 在git上更新了水纹滤镜

周末去看了韩寒的 《后会无期》。。真TM文艺。。。 我心目中的大仁哥的形象完全毁了,变成蠢萌了。。。 不过还好票价靠谱,只有40元,不像邓超的《分手大师》那么坑爹的要80.
电影给我的感觉是 人们生活中的每一个过客,有一天也许就那么突然消失了,确实有许多伤感呀。。、
不过电影的结局也给人一样的感觉。。突然的结束了。

这周无所事事,顺便把之前捕鱼达人的扭曲shader移植到我的扩展类里了叫 CCWaveFilter.

之前的索引地址:
http://www.dreamfairy.cn/blog/index.php/2013/08/26/migration-apply-wave-filter-in-cocos2d-x-from-agal.html

git地址 : https://github.com/dreamfairy/cocos2dx-2.x-filters/tree/master/class

再丢个预览图吧~
jdfw

每周都想喷一次触控。 shader 的 uniform 拜托您别一直该了行吗。。。当年2.1.3您改了一次,现在2.2.4 您又改。。
顺便吐槽下。做 CCS版的大爷,劳烦您提前退休吧,别做死了。

弹幕系统基本完成啦~

原本计划2周的,没想到一周就基本搞定了。
发几张截图的说

全屏转风车
danmu1

黑洞 吸引视界内的弹幕
danmu2

激光
danmu3

可编程的弹幕系统,可以生成各种弹幕花纹图案等….

btw,前几天入了闪轨。。300大洋,又败家了。。。

QQ20140712224340

end
看完邓超的 《分手大师》后我觉得。。画面太美,我根本不敢看,尤其是你洗澡的时候丢肥皂的那个眼神…