具体实现思路:
CTalk类继承窗口基类,里面封装了updata()和onRander()方法,里面包含了结构体SArrTalk* m_pArrTalk,用来存对话数据。
CTalk类控制对话的进行,以及数据的渲染。而对话的内容则存在相应的文件之中,如NPC的对话存在NPC的配置表之中,哪个类需要对话,就让这个类包含CTalk类的对象,由此完成对话。
CTalk类的代码:
头文件
#pragma once
struct SArrTalk
{
SArrTalk()
{
memset(arrTalk, 0, sizeof(arrTalk));
}
char arrTalk[10][128];
};
class CTalk:public CWndBase
{
public:
//void initTalk(SArrTalk* pArrTalk, int nTalkLines);
void updata();
void onRander();
void setTalkLines(int nTalkLines);
SArrTalk* getArrTalk(){ return m_pArrTalk; };
CTalk();
~CTalk();
GETTER_SETTER(bool, IsTalked, m_bIsTalked);
private:
int m_nIndex;//当前对话索引
int m_nTalkLines;//对话条数
SArrTalk* m_pArrTalk;
};
源文件:
#include "stdafx.h"
#include "Talk.h"
CTalk::CTalk()
{
m_nIndex = 0;
m_bIsTalked = false;
m_pArrTalk = new SArrTalk;
}
CTalk::~CTalk()
{
}
//void CTalk::initTalk(SArrTalk* pArrTalk, int nTalkLines)
//{
// //加载整个对话
// memcpy(m_arrTalk, pArrTalk->arrTalk, sizeof(pArrTalk->arrTalk));
// m_nTalkLines = nTalkLines;
//}
void CTalk::updata()
{
if (m_nIndex==m_nTalkLines)
{
g_GameMgr->recoverWnd();
m_bIsTalked = true;
}
if (KEY_DOWN(VK_SPACE))
{
m_nIndex++;
}
}
void CTalk::onRander()
{
cout << m_pArrTalk->arrTalk[m_nIndex]<< endl;
}
void CTalk::setTalkLines(int nTalkLines)
{
m_nTalkLines = nTalkLines;
}
此外:因为存放对话内容的二维数组在作为参数传递时非常麻烦(C++只允许返回值为一个值,不允许返回二维数组),所以用一个结构体存放对话的内容,CTalk类里面包含了这个结构体的对象。
CTalk使用的例子(CMission类):
public:
CTalk* getTalk(){ return m_pTalk; }//CMission类中包含了CTalk类的对象。
CTalk* getFinishTalk(){ return m_pFinishTalk; }
private:
CTalk* m_pTalk;
CTalk* m_pFinishTalk;
因为任务有两段对话——接任务时的对话,提交任务时的对话,所以在CMission中声明了两个CTalk的成员。
在任务初始化的时候,一并把对话的内容也初始化
void CMission::initMission(SMissionDt* data)
{
m_nID = data->nID;
m_nNpcID = data->nNpcID;
m_bIsRecived = data->bIsRecive;
m_bIsUnlocked = data->bIsUnlocked;
memcpy(m_szName, data->szName, sizeof(data->szName));
memcpy(m_szDescripe, data->szDescripe, sizeof(data->szDescripe));
//接收任务时的对话
m_pTalk->setTalkLines(data->nTalkLines);
memcpy(m_pTalk->getArrTalk()->arrTalk, data->arrTalk, sizeof(data->arrTalk));
//提交任务时的对话
m_pFinishTalk->setTalkLines(data->nFinishTalkLines);
memcpy(m_pFinishTalk->getArrTalk()->arrTalk, data->arrFinishTalkLines, sizeof(data->arrFinishTalkLines));
}
任务的配置表中写入了任务对话信息: