| DaYong's profile小园香径BlogLists | Help |
|
09 July 一个简单RPG的任务系统的实现 最近接手了一个简单的单线多分支的RPG开发,与现在流行的MMORPG玩法类似,它也有一套任务系统。游戏里的任务,不但丰富了游戏乐趣,也是重要的道具和经验来源。那么,该怎么用程序来实现呢?
查资料,发现一般网络游戏的任务是通过脚本实现的。我做的这个游戏也采用了脚本技术,不过为了手机游戏容量有限的考量,没有采用lua等现有的成熟的脚本系统,而只是自己简单实现了一下脚本的语法分析和消息驱动,嗯,够用就好了。有了这层准备,就可以把一个任务分解成一系列触发事件的脚本。比如,有个任务是给某个npc送信,首先和一个npc对话,触发这个npc的脚本,接受送信的任务,然后玩家在地图中漫游,碰到接收信的npc后,触发这个npc收信的脚本,任务完成。从中可以看出,任务是分一定步骤的,我们只要给每个步骤设一个状态变量,如一个int型,0表示未完成,1表示完成,-1表示失败等即可。对状态变量的修改,也让脚本来做。
废话不说了,看代码实现:
//任务结构体
struct stTask { int id; //任务编号 int nStepCount; //完成任务需要的步骤 int* pStepStatus; //步骤状态链表 其值0:未完成;1:已完成 uint16 next_s_id; //若步骤全部完成,驱动下一个脚本的id boolean bDone; //是否完成 }; 我用的一个结构体来定义任务,因为步骤数的不确定,所以我用的动态数组int* pStepStatus,在触发任务的脚本中来指定步骤数nStepCount,然后动态生成nStepCount*sizeof(int)大小的pStepStatus,并初始化为0。然后用一个链表来保存当前游戏中的任务:
CList<stTask> m_ltTasks;
最后,在脚本事件里标记和检测任务的完成情况:
……
while( pTask = m_ltTasks.GetItem() )
{
if( pTask->id == TaskId
&& !pTask->bDone //未完成 && Param < pTask->nStepCount ) { pTask->pStepStatus[Param] = 1; for( int j = 0; j < pTask->nStepCount; ++j )
{ if( pTask->pStepStatus[j] == 0 ) //还有没完成的步骤 { return; } } if ( pTask->next_s_id > 0 )
{ //任务完成,触发任务完成后的脚本
ChangeFrameState( GAME_STATE_MESSAGE, pTask->next_s_id ); } pTask->bDone = TRUE; //任务完成
} }
……
基本的实现就是这样,权做抛砖引玉吧。它的不够完美的地方,已经在我做任务存档的时候体现出来了。
参考文章:网络游戏任务系统的构想,在此深表感谢。 08 July 去山顶裸奔 北京,给人的最直白的印象莫过于它的庞杂、粗糙和凌乱(也许呆久了,你会喜欢上这粗糙后的文化氛围,那另当别论)。所幸我工作和生活的地方在西山脚下,周末的时候可以去山上透透气。
爬山的乐趣就在于一边大口呼吸新鲜空气一边气喘如牛,而且大汗淋漓无所顾忌。到了山顶,有突出悬崖的巨石。站在上面,山风掀起衣服,索性脱掉。仰面躺下,在今天这个灰色的天气里还是依稀可以看到天的蓝,真是不可思议。再过一会,甚至能感觉自己在随着身下的这块巨石在旋转,咳,此刻就算是以为自己是宇宙的中心也没错了。
|
|
|