接受任务,提交任务,显示任务

玩家里面应该有一个容器,用来存放已接收的任务,

任务NPC里面也应该有一个容器,用来存放开启的任务

接受任务:

1.不同NPC对应不同任务:

任务数据里面应该对应包含NPCID属性。由此实现不同npc对应不同任务(同商店)

2.NPC里面有开启的任务,和没开启的任务:

任务数据应该具有是否开启的属性,满足条件开启任务,否则不开启,NPC里面只显示开启的任务。

3.接受任务后,玩家任务窗口里应当显示当前任务,以及任务进度。完成任务后,任务属性应当变为已完成。

如何实现任务进度?

提交任务:

当当前任务完成时,提交任务成功,并获取相应奖励。

显示任务:

玩家应当包含一个装有已接任务的容器,定义对任务属性的数据更新和渲染(装备和技能是否也是如此?装备和任务系统是否可以都继承某个窗口类,所以玩家里面应该包含装备管理者、技能管理者、任务管理者的成员去进行管理),当按下某个建的时候,gameMgr对任务进行数据更新和渲染。对窗口基类进行数据更新、以及渲染。(battle我是直接归游戏管理者管理了,事实上,让其属于map管理(battl只需要enemy和player数据,map中均可以拿到),这样battle也能够变成一个窗口延伸了。)

任务是商品吗?任务不应当是商品。任务应当单独配表

三、不同任务不同的达成条件:

1.杀怪   2.找npc  3.购买相关物品

四、完成任务后获取相关奖励

1.经验、金币

2.装备

3.开启相应任务

具体实现:

整个任务系统包含三个类:CMission类、MissionMgr类、CMissionNpc类、CRecivedMission类

四个类分别进行:CMission:任务的逻辑处理,如获取奖励,判断任务是否完成等。

CMissionMgr类:创建所有任务、并对其初始化,获取已接任务和已解锁任务分别传给CRecivedMission类和CMissionNpc类。

CMissionNpc类:任务NPC的处理,和商店买卖物品类似的功能,处理任务的接受、提交、对话等

CRecivedMission类:玩家的任务窗口,用于显示已经接受的任务、以及任务描述等

源代码:

CMission类:

#pragma once
#include "Talk.h"
class CMission
{
public:CMission();~CMission();void getReward();int getID(){return m_nID;};void initMission(SMissionDt* data);void showName();void showDescripe();void showSchedule();void updataIsAchieve();CTalk* getTalk(){ return m_pTalk; }CTalk* getFinishTalk(){ return m_pFinishTalk; }int getNpcID(){ return m_nNpcID; };GETTER_SETTER(bool, isAchieve, m_bIsAchieve);GETTER_SETTER(bool, isRecived, m_bIsRecived);GETTER_SETTER(bool, isUnlock, m_bIsUnlocked);
private:int m_nID;int m_nNpcID;char m_szName[32];char m_szDescripe[128];CTalk* m_pTalk;CTalk* m_pFinishTalk;};

MissionMgr类:

#pragma once
#include "Mission.h"
class CMissionMgr
{
public:CMissionMgr();~CMissionMgr();void creatAllMission();vector<CMission*>getUnlockMission();vector<CMission*>getRecivedMission();CMission* getMission(int nID);
private:vector<CMission*>m_vecMissions;
};

CMissionNpc类:

#pragma once
#include "Mission.h"
class CMissionNpc:public CWndBase
{
public:CMissionNpc();~CMissionNpc();void updata();void onRander();void updataMission();void setMissions(int nNpcID);
private:vector<CMission*>m_vecUnlockedMission;int m_nIndex;
};

CRecivedMission类:

#pragma once
#include "Mission.h"
#include "WndBase.h"
class CRecivedMission:public CWndBase
{
public:CRecivedMission();~CRecivedMission();void setMission();void updata();void onRander();
private:vector<CMission*>m_vecRecivedMission;int m_nIndex;
};

CMission类的实现:

#include "stdafx.h"
#include "Mission.h"CMission::CMission()
{m_nID = 0;m_nNpcID = 0;m_bIsRecived = false;m_bIsUnlocked = false;memset(m_szName, 0, sizeof(m_szName));memset(m_szDescripe, 0, sizeof(m_szDescripe));m_bIsAchieve=false;m_pTalk = new CTalk;m_pFinishTalk = new CTalk;
}CMission::~CMission()
{
}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));
}void CMission::showName()
{cout << m_szName;
}void CMission::showDescripe()
{cout << m_szDescripe;
}void CMission::updataIsAchieve()
{CPlayer* player = g_GameMgr->getGameMap()->getplayer();switch (m_nID){case 6001:if (2 <= player->getKillEnemyNum(4001)){m_bIsAchieve = true;}break;case 6002:if (2 <= player->getKillEnemyNum(4002)){m_bIsAchieve = true;}break;case 6003:if (2 <= player->getKillEnemyNum(4003)){m_bIsAchieve = true;}break;case 6004:if (10 <= player->getPackage()->getItemNum(3004)){m_bIsAchieve = true;}break;case 6005://当背包里面有回信的时候,完成任务。if (player->getPackage()->getItemNum(3013)>0){m_bIsAchieve = true;}break;case  6006:if (player->getPackage()->getItemNum(3014) > 0){m_bIsAchieve = true;}break;default:break;}
}void CMission::getReward(){CPlayer* player = g_GameMgr->getGameMap()->getplayer();switch (m_nID){case 6001:player->addExp(100);player->changeMoney(5000);player->getEquitment()->addEquiepment(g_DataMgr->getIteamDtMgr()->getByID(3001));break;case 6002:player->addExp(100);player->changeMoney(5000);break;case 6003:player->addExp(100);player->changeMoney(5000);break;case 6004:player->addExp(100);player->changeMoney(5000);break;case 6005:player->addExp(100);player->changeMoney(400);//解锁新的任务g_GameMgr->getMissionMgr()->getMission(6006)->setisUnlock(true);//任务物品消失g_GameMgr->getGameMap()->getplayer()->getPackage()->deleteItem(3013);男人移动//g_GameMgr->getGameMap()->getNpcMgr()->moveNpc(2007,1003, 5, 10);/*男人消失*/g_GameMgr->getGameMap()->getNpcMgr()->deleteNpc(2007);break;case 6006:player->addExp(100);player->changeMoney(5000);player->getPackage()->addItem(g_DataMgr->getIteamDtMgr()->getByID(3006));break;default:break;}}void CMission::showSchedule(){CPlayer* player = g_GameMgr->getGameMap()->getplayer();switch (m_nID){case 6001:cout << player->getKillEnemyNum(4001)<<"/2";break;case 6002:cout << player->getKillEnemyNum(4002)<< "/2";break;case 6003:cout << player->getKillEnemyNum(4003)<< "/2";break;case 6004:cout << player->getPackage()->getItemNum(3004)<< "/10";break;case 6005:cout << "  杰克马上要奔赴战场了,找到珍妮,并把这封信交给她";break;case 6006:cout << "  在漫长的日子里,珍妮愈发的思念杰克,她让我务必把这封信交到杰克手中";break;default:break;}}

CMissionMgr类的实现:

#include "stdafx.h"
#include "MissionMgr.h"CMissionMgr::CMissionMgr()
{creatAllMission();
}CMissionMgr::~CMissionMgr()
{
}void CMissionMgr::creatAllMission()
{for (int i = 0; i < 6;i++){SMissionDt* pData = g_DataMgr->getMissionDtMgr()->getByID(6001 + i);CMission* pMission = new CMission;pMission->initMission(pData);m_vecMissions.push_back(pMission);}
}vector<CMission*> CMissionMgr::getUnlockMission()
{vector<CMission*>vecUnlockMission;for (int i = 0; i < m_vecMissions.size();i++){if (m_vecMissions[i]->getisUnlock()==true){vecUnlockMission.push_back(m_vecMissions[i]);}}return vecUnlockMission;
}vector<CMission*> CMissionMgr::getRecivedMission()
{vector<CMission*>vecRecivedMission;for (int i = 0; i < m_vecMissions.size();i++){if (m_vecMissions[i]->getisRecived()==true){vecRecivedMission.push_back(m_vecMissions[i]);}}return vecRecivedMission;
}CMission* CMissionMgr::getMission(int nID)
{for (int i = 0; i < m_vecMissions.size();i++){if (nID==m_vecMissions[i]->getID()){return m_vecMissions[i];}}return nullptr;
}

CReceivedMission类:

#include "stdafx.h"
#include "RecivedMission.h"CRecivedMission::CRecivedMission()
{
}CRecivedMission::~CRecivedMission()
{
}void CRecivedMission::updata()
{if (KEY_DOWN(VK_UP)){m_nIndex--;if (m_nIndex < 0){m_nIndex = m_vecRecivedMission.size() - 1;}}else if (KEY_DOWN(VK_DOWN)){m_nIndex++;if (m_nIndex >m_vecRecivedMission.size() - 1){m_nIndex = 0;}}if (KEY_DOWN(VK_ESCAPE)){g_GameMgr->recoverWnd();}
}void CRecivedMission::onRander()
{for (int i = 0; i < m_vecRecivedMission.size(); i++){if (i == m_nIndex){cout << "->";}else{cout << "  ";}m_vecRecivedMission[i]->showName();if (i == m_nIndex){cout << "\t";m_vecRecivedMission[i]->showDescripe();m_vecRecivedMission[i]->showSchedule();}cout << endl;}
}void CRecivedMission::setMission()
{m_vecRecivedMission=g_GameMgr->getMissionMgr()->getRecivedMission();//调用MissionMgr的获取接口,每次进入任务界面时,更新任务数据
}

CMissionNpc类:

#include "stdafx.h"
#include "MissionNpc.h"CMissionNpc::CMissionNpc()
{m_nIndex = 0;
}CMissionNpc::~CMissionNpc()
{
}void CMissionNpc::setMissions(int nNpcID)
{//每次进入前要把之前的任务清除m_vecUnlockedMission.clear();vector<CMission*> vecUnlockedMission = g_GameMgr->getMissionMgr()->getUnlockMission();for (int i = 0; i < vecUnlockedMission.size();i++){if (vecUnlockedMission[i]->getNpcID()==nNpcID){m_vecUnlockedMission.push_back(vecUnlockedMission[i]);}}}void CMissionNpc::updata()
{if (KEY_DOWN(VK_UP)){m_nIndex--;if (m_nIndex < 0){m_nIndex = m_vecUnlockedMission.size() - 1;}}else if (KEY_DOWN(VK_DOWN)){m_nIndex++;if (m_nIndex >m_vecUnlockedMission.size() - 1){m_nIndex = 0;}}if (KEY_DOWN(VK_ESCAPE)){g_GameMgr->recoverWnd();}if (KEY_DOWN(VK_RETURN)){updataMission();}
}void CMissionNpc::onRander()
{for (int i = 0; i < m_vecUnlockedMission.size();i++){if (i==m_nIndex){cout << "->";}else{cout << "  ";}m_vecUnlockedMission[i]->showName();if (i==m_nIndex){cout << "\t";m_vecUnlockedMission[i]->showDescripe();}cout << endl;}
}void CMissionNpc::updataMission()
{if (!m_vecUnlockedMission.empty()){//如果当前任务已经接受.if (m_vecUnlockedMission[m_nIndex]->getisRecived()){//更新任务状态m_vecUnlockedMission[m_nIndex]->updataIsAchieve();if (m_vecUnlockedMission[m_nIndex]->getisAchieve()){if (!m_vecUnlockedMission[m_nIndex]->getFinishTalk()->getIsTalked()){//进行完成任务时候的对话g_GameMgr->changWnd(m_vecUnlockedMission[m_nIndex]->getFinishTalk());}else{m_vecUnlockedMission[m_nIndex]->getReward();//将任务从待接任务中移除。SAFE_DELET(m_vecUnlockedMission[m_nIndex]);m_vecUnlockedMission.erase(m_vecUnlockedMission.begin() + m_nIndex);//回到地图g_GameMgr->recoverWnd();}}else{cout << "请去完成任务再来获取奖励" << endl;}}//如果当前任务并未接受else{//男人的任务if (m_vecUnlockedMission[m_nIndex]->getID() == 6005){g_GameMgr->getGameMap()->getplayer()->getPackage()->addItem(g_DataMgr->getIteamDtMgr()->getByID(3012));}//女人的任务else if (m_vecUnlockedMission[m_nIndex]->getID() == 6006){g_GameMgr->getGameMap()->getplayer()->getPackage()->addItem(g_DataMgr->getIteamDtMgr()->getByID(3014));}//按下return键位,接受当前任务,将该任务是否被接受设置为被接受,将当前任务目标置零,是否完成置为falsem_vecUnlockedMission[m_nIndex]->setisRecived(true);g_GameMgr->getGameMap()->getplayer()->setKillEnemyNumToZero(m_vecUnlockedMission[m_nIndex]->getID());m_vecUnlockedMission[m_nIndex]->setisAchieve(false);//进行接受任务时候的对话if (!m_vecUnlockedMission[m_nIndex]->getTalk()->getIsTalked()){g_GameMgr->changWnd(m_vecUnlockedMission[m_nIndex]->getTalk());}///*回到地图界面*///g_GameMgr->recoverWnd();}}
}

待改进:

任务分为:对话任务,杀怪任务,购买物品任务。

杀怪任务和购买物品可以写成同一种任务:判断玩家背包中是否有足够的相对应的物品(红药水数量、杀某种怪掉落的物品数量),从而判断任务是否完成。对话任务也可以判断玩家背包中是否拥有某一种物品,来判断是否完成任务。所以任务类的任务是否完成可以封装成一个函数,通过传入需要完成任务的物品ID和需要的数量,来判断是否完成。这样,任务的数据就可以配备在表中,而不是我现在这样写死的方式。

C++控制台RPG游戏具体实现思路: 任务系统相关推荐

  1. 控制台RPG游戏具体实现思路:商店功能

    商店功能 一.进入商店: 当条件满足时,游戏状态改为E_GAMESTATE_SHOP,将玩家坐标还原(否则,玩家坐标与商店坐标重合,将一直重复进入商店).处理逻辑写在地图的碰撞中,关键代码: //玩家 ...

  2. C++控制台RPG游戏具体实现思路:装备栏功能

    一.装备物品时,人物属性要进行相应的更改: player类里面写一个playerAttributeToInit()函数,用于将玩家当前属性置为没有穿戴任何装备时的属性,每次进行装备更新时,调用物品里面 ...

  3. C++控制台RPG游戏(序)

    C++控制台RPG游戏(序) 最近打算自学C++,为了给自己个目标就想用C++复刻下自己学C#时写的控制台游戏.打算在CSDN更新下制作过程,当个记录.不会用到高级技巧,目前想到的主要只有屏幕显示刷新 ...

  4. 【C++第一个Demo】---控制台RPG游戏3【登陆菜单树】

    [登陆系统--树结构] 1 首先我这里设计,由一个基类MainMenu构建树结构,并实现控制台上菜单之间的切换和返回操作 1 #ifndef _UI_BASE_H_ 2 #define _UI_BAS ...

  5. 【C++第一个Demo】---控制台RPG游戏4【角色系统】

    [角色基类] 1 #ifndef _ROLE_H_ 2 #define _ROLE_H_ 3 4 #include<list> 5 #include<vector> 6 #in ...

  6. python控制台小游戏_学习编程的好方法——控制台游戏

    本文难度:★☆☆☆☆ 题图:控制台RPG游戏--诛仙剑 by 呆呆的码农 一.前言 在我大知乎,有以下基本日常问题:如何学习C语言? 如何学习C++? 如何学习Python? 如何学习XXXX语言? ...

  7. C/C++——文字RPG游戏:MINERPG

    更新版本 更新内容 新机制:护盾,回合外反击,限定技能: 战士:新增限定技能无尽之血: 法师:相位转移调整:嗜法重做:风暴盾.暴风雪.心灵震爆.法力燃烧调整:删除技能附魔武器:冰枪术重做:新增技能法力 ...

  8. C#之控制台RPG类魔塔游戏

    C#简介 C#作为巨硬推出的纯面向对象语言,曾经期待其与Java抗衡,哪知道生不逢时,早早退出了霸主之位的争夺,但这不能掩盖C#是一个极度简洁优美的语言,开发效率甚至在某些方面优于Java(但是缺乏生 ...

  9. 《黑暗之光》RPG游戏案例学习(8)——第四章 游戏任务系统

    游戏任务系统 任务界面 任务的接受与完成 (1)点击NPC时,出现任务描述 (2)接受任务后,出现任务提示 (3)完成任务后,提交获取奖励 其他设计 添加按钮音效 鼠标指针管理系统 参考: RPG游戏 ...

最新文章

  1. C#委托及事件 详解(讲得比较透彻)
  2. SpringBoot中将thymeleaf升级到3.0或以上版本
  3. PID控制方法及C语言其实现
  4. systemd教程推荐
  5. URAL1519 Formula 1 —— 插头DP
  6. monotouch在ipad中的实例应用--显示图像和文字
  7. Java 汉字转拼音 Scala 汉字转拼音
  8. Python学习笔记(四十)— 内置模块(9)HTMLParser
  9. 如何通过销售发票和日记帐事务信息进行销售交货与退货信息分析
  10. 怎样做地推,转化率提高20倍?
  11. PECL PEAR php扩展模块的简便安装方式
  12. Spring Boot菜鸟示例——Hello World
  13. 中国无线耳机行业市场供需与战略研究报告
  14. PLC对步进电机的快速精确定位控制
  15. 创始人、CEO、总裁和董事长到底谁更大?
  16. upload-labs刷关记录
  17. 按某一列统计重复数据,并获取对应行数据
  18. 南走1公里东走1公里北走1公里回原点
  19. 在Discuz论坛安装出现乱码时
  20. html艺术字在线制作,HTML网页设计中的字体设计

热门文章

  1. MybatisPlus学习〖三〗crud接口实现
  2. android 全景拼接软件,DetuStitch(全景拼接软件)
  3. 伦敦国王学院计算机申请要求,2020年伦敦国王学院高级计算机专业研究生申请条件及世界排名|学费介绍...
  4. html内嵌子页面并配合CGI进行页面更新
  5. 为什么我玩游戏那么卡?
  6. 《铸梦之路》帧同步卡牌放置手游(斗罗大陆武魂觉醒、上古王冠)
  7. python 找零问题 动态规划
  8. mysql 5.6 免安装版_mysql 5.6.15的免安装版 安装
  9. z变换判断稳定性和因果性_判断因果性.PPT
  10. outlook 签名_Outlook 2007中的电子邮件签名礼节-适当的Flair