最近无聊写了个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

VisBaseEntity_cl * m_myRole;

然后创建一个模型 like this

  m_myRole = Vision::Game.CreateEntity("VisBaseEntity_cl", hkvVec3(200,0,50), "Models/Eddy Export/Eddy.MODEL");
  VASSERT(m_myRole);
  m_myRole->SetCastShadows(true);

模型是我随便找的。。。
因为原本是自由相机,等下要控制模型移动的,所以最好改成跟随相机
把原来的相机代码注释了,改成如下

//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);

这个时候差不多长这样
pa_demo_step1

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

之后要做的步奏是开启键盘坚挺,然后控制模型移动
首先创建一个函数InitInput放在AfterSceneLoaded的最后,然后创建一个枚举类,用来定义案件名称

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

当对应案件有按下时 GetInputMap()->MapTrigger(KEY_NAME) 的值会不为0
最后我们在 Run 函数中处理键盘监听

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;
}

发表评论

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