C++控制台RPG游戏:对话系统

具体实现思路:

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

 任务的配置表中写入了任务对话信息:

猜你喜欢

转载自blog.csdn.net/qq_41791653/article/details/82287771