DaYong's profile小园香径BlogLists Tools Help

Blog


    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

    去山顶裸奔

           北京,给人的最直白的印象莫过于它的庞杂、粗糙和凌乱(也许呆久了,你会喜欢上这粗糙后的文化氛围,那另当别论)。所幸我工作和生活的地方在西山脚下,周末的时候可以去山上透透气。
     
          爬山的乐趣就在于一边大口呼吸新鲜空气一边气喘如牛,而且大汗淋漓无所顾忌。到了山顶,有突出悬崖的巨石。站在上面,山风掀起衣服,索性脱掉。仰面躺下,在今天这个灰色的天气里还是依稀可以看到天的蓝,真是不可思议。再过一会,甚至能感觉自己在随着身下的这块巨石在旋转,咳,此刻就算是以为自己是宇宙的中心也没错了。