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

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

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

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

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

好,进入正题~

网络上创建pa档的教程都是运行 run_once.bat 但是在 2014.1 版本之后根本没这个东西,创建的方式实际是使用 vGameSolutionCreator 创建的,在这里
paCreateMenu

选择想要生产的项目类型点 Generate 即可,如果需要 ScaleForm 做UI,下面记得 打钩
pa_helper

按F5编译后,就可以启动Demo
差不是长这样

pa first view

第一个Demo 我们就创建个模型,然后控制它移动好了。
先申明这成员变量Like this
[cc language=”c++”]
VisBaseEntity_cl * m_myRole;
[/cc]
然后创建一个模型 like this
[cc language=”c++”]
m_myRole = Vision::Game.CreateEntity(“VisBaseEntity_cl”, hkvVec3(200,0,50), “Models/Eddy Export/Eddy.MODEL”);
VASSERT(m_myRole);
m_myRole->SetCastShadows(true);
[/cc]

模型是我随便找的。。。
因为原本是自由相机,等下要控制模型移动的,所以最好改成跟随相机
把原来的相机代码注释了,改成如下
[cc languge=”c++”]
//Vision::Game.CreateEntity(“VFreeCamera”, hkvVec3(0.0f, 0.0f, 170.0f));

//在private 下申明
VOrbitCamera * m_orbitCamera;

//代码
m_orbitCamera = new VOrbitCamera();
m_orbitCamera->InitialYaw = -90.0f;
m_orbitCamera->RelativeLookAtHeight = 1.0f;
m_orbitCamera->Follow = true; //跟随
m_orbitCamera->FollowFixed = true; //锁定自由视角
m_orbitCamera->Collides = false;
m_orbitCamera->DepthOfField = false;
m_orbitCamera->Zoom = false;
m_orbitCamera->InvertControls = true;
m_orbitCamera->MoveSmoothness = 0.3f;
m_orbitCamera->MinimalDistance = 100.0f;
m_orbitCamera->MaximalDistance = 1000.0f;

//创建相机后,要挂在模型身上,跟随模型
m_myRole->AddComponent(m_orbitCamera);
[/cc]

这个时候差不多长这样
pa_demo_step1

至于地上的灯光,我写着玩的,请无视

之后要做的步奏是开启键盘坚挺,然后控制模型移动
首先创建一个函数InitInput放在AfterSceneLoaded的最后,然后创建一个枚举类,用来定义案件名称
[cc language=”c++”]
enum HAVOKAI_CONTROL
{
HAVOKAI_SHOW_MENU = VAPP_INPUT_CONTROL_LAST_ELEMENT + 1,
ROLE_MOVE_FORWARD,
ROLE_MOVE_BACK,
ROLE_TURN_LEFT,
ROLE_TURN_RIGHT
};

void MyGameApp::InitInput()
{
#if defined(SUPPORTS_KEYBOARD)
GetInputMap()->MapTrigger(ROLE_MOVE_FORWARD, V_KEYBOARD, CT_KB_UP);
GetInputMap()->MapTrigger(ROLE_MOVE_BACK, V_KEYBOARD, CT_KB_DOWN);
GetInputMap()->MapTrigger(ROLE_TURN_LEFT, V_KEYBOARD, CT_KB_LEFT);
GetInputMap()->MapTrigger(ROLE_TURN_RIGHT, V_KEYBOARD, CT_KB_RIGHT);
#endif
[/cc]

当对应案件有按下时 GetInputMap()->MapTrigger(KEY_NAME) 的值会不为0
最后我们在 Run 函数中处理键盘监听
[cc language=”c++”]
bool MyGameApp::Run()
{
if(m_myRole){
hkvMat4 mat = m_myRole->GetWorldMatrix();
hkvVec4 dir = mat.getColumn(1);
const float fTime = Vision::GetTimer()->GetTimeDifference();

const bool bMoveForward = GetInputMap()->GetTrigger(ROLE_MOVE_FORWARD) != 0;
const bool bMoveBack = GetInputMap()->GetTrigger(ROLE_MOVE_BACK) != 0;
const bool bTurnLeft = GetInputMap()->GetTrigger(ROLE_TURN_LEFT) != 0;
const bool bTurnRight = GetInputMap()->GetTrigger(ROLE_TURN_RIGHT) != 0;

m_eState = ROLE_IDLE;

if(bMoveForward || bMoveBack){
dir *= (fTime * (bMoveForward ? -m_fMoveSpeed : m_fMoveSpeed));
m_vPos += hkvVec3(dir.x,dir.y,dir.z);

m_eState = ROLE_RUN;
}

if(bTurnLeft || bTurnRight){
float forwardDist = fTime * (bTurnLeft ? m_fMoveSpeed : -m_fMoveSpeed) / 4.0f;
m_vRot.x += forwardDist;
m_eState = ROLE_RUN;
}

m_myRole->SetOrientation(m_vRot);
m_myRole->SetPosition(m_vPos);
}

return true;
}
[/cc]

发表评论

电子邮件地址不会被公开。 必填项已用*标注