下面再来详细地分析一下,当玩家按下向上方向键时第二人生到底做了些什么呢?又是怎么样地控制人物向前行走的呢?下面的函数就是实现这样的功能:
#001 void agent_push_forward( EKeystate s )
#002 {
#003
if( KEYSTATE_UP == s ) return;
#004
F32 time = gKeyboard->getCurKeyElapsedTime();
#005
S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount());
#006
#007
if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES)
#008
{
#009
gAgent.moveAtNudge(1);
#010
}
#011
else
#012
{
#013
gAgent.moveAt(1);
#014
}
#015 }
上面是向前行走的函数,它调用代理类对象gAgent来更新向前行走的消息,主要调用moveAtNudge和moveAt函数来实现的。这两个函数代码如下:
#001 //-----------------------------------------------------------------------------
#002 // moveAt()
#003 //-----------------------------------------------------------------------------
#004 void LLAgent::moveAt(S32 direction)
#005 {
#006
// age chat timer so it fades more quickly when you are intentionally moving
#007
ageChat();
#008
#009
setKey(direction, mAtKey);
#010
#011
#012
if (direction > 0)
#013
{
#014
setControlFlags(AGENT_CONTROL_AT_POS | AGENT_CONTROL_FAST_AT);
#015
}
#016
else if (direction < 0)
#017
{
#018
setControlFlags(AGENT_CONTROL_AT_NEG | AGENT_CONTROL_FAST_AT);
#019
}
#020
#021
resetView();
#022 }
#023
#024 //-----------------------------------------------------------------------------
#025 // moveAtNudge()
#026 //-----------------------------------------------------------------------------
#027 void LLAgent::moveAtNudge(S32 direction)
#028 {
#029
// age chat timer so it fades more quickly when you are intentionally moving
#030
ageChat();
#031
#032
setKey(direction, mWalkKey);
#033
#034
if (direction > 0)
#035
{
#036
setControlFlags(AGENT_CONTROL_NUDGE_AT_POS);
#037
}
#038
else if (direction < 0)
#039
{
#040
setControlFlags(AGENT_CONTROL_NUDGE_AT_NEG);
#041
}
#042
#043
resetView();
#044 }
在这两个函数里,主要设置了行走的标志位AGENT_CONTROL_NUDGE_AT_POS或AGENT_CONTROL_NUDGE_AT_NEG,第一个标志是向前行走,第二个标志是向后后退。第二人生里把这些标志设置后,就会通过代理类对象LLAgent向服务器发送行走的标志,然后服务器就计算是否可以行走,并返回人物角色的相应位置,这样在客户端里就可以看到人物在移动了。
蔡军生 2008/3/13 QQ:9073204 深圳