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

一、装备物品时,人物属性要进行相应的更改:

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

equipment类:

if (KEY_DOWN(VK_RETURN))
	{
		wearEquiepment(m_vecEquiement[m_nIndex]);
		m_vecEquiement.erase(m_vecEquiement.begin() + m_nIndex);
		//每当装备更新时,才给玩家增加属性,增加属性前,应当先给玩家属性设为初值
		g_GameMgr->getgameMap()->getplayer()->playerAttributeToInit();
		for (int i = 0; i < 4;i++)
		{
			if (m_arrEquiemetns[i]!=nullptr)
			{
				m_arrEquiemetns[i]->useItem();
			}
		}
	}

玩家:

void CPlayer::playerAttributeToInit()
{
	m_nMaxHp = 100;
	m_nMaxMp = 100;
	m_nAtc = 100;
	m_nDef = 100;
}

二:穿戴装备:

装备类里面定义两个成员变量:CIteam* m_arrEquiemetns[4]; vector<CIteam*>m_vecEquiement;数组用来存放身上穿的装备,vector容器用来存放所有买下来的装备。其中数组索引为0,1,2,3分别存放着武器、盾牌、铠甲、鞋子装备。穿戴装备时,将该item指针变量从容器中移除,给相对应的数组赋值为该指针变量所指向的item对象地址。具体实现代码如下:

对数组进行赋值:

void CEquimpent::wearEquiepment(CIteam* item)
{
	if (item->getitemType()==E_ITEM_WEAPON)
	{
		tookOfEquiepment(m_arrEquiemetns[0]);
		m_arrEquiemetns[0] = item;
	}
	else if (item->getitemType()==E_ITEM_SHIELD)
	{
		tookOfEquiepment(m_arrEquiemetns[1]);
		m_arrEquiemetns[1] = item;
	}
	else if (item->getitemType() == E_ITEM_ARMOUR)
	{
		tookOfEquiepment(m_arrEquiemetns[2]);
		m_arrEquiemetns[2] = item;
	}
	else if (item->getitemType() == E_ITEM_SHOES)
	{
		tookOfEquiepment(m_arrEquiemetns[3]);
		m_arrEquiemetns[3] = item;
	}
}

选定相对应的装备,穿装备: 

if (KEY_DOWN(VK_RETURN))
	{
		wearEquiepment(m_vecEquiement[m_nIndex]);
		m_vecEquiement.erase(m_vecEquiement.begin() + m_nIndex);
		//每当装备更新时,才给玩家增加属性,增加属性前,应当先给玩家属性设为初值
		g_GameMgr->getgameMap()->getplayer()->playerAttributeToInit();
		for (int i = 0; i < 4;i++)
		{
			if (m_arrEquiemetns[i]!=nullptr)
			{
				m_arrEquiemetns[i]->useItem();
			}
		}
	}

在穿装备前,如果相应位置已经有装备了,应当先把装备脱下来:及压入存放所有装备的容器中

void CEquimpent::tookOfEquiepment(CIteam* item)
{
	if (item!=nullptr)
	{
		m_vecEquiement.push_back(item);
	}
}

三、 进入装备界面、装备界面控制渲染以及选定装备:

方法同商店一样,不再赘述

四:所有代码:

头文件:

#pragma once
class CEquimpent
{
public:
	CEquimpent();
	void wearEquiepment(CIteam* item);
	void addEquiepment(SIteamDt* itemDt);
	void tookOfEquiepment(CIteam* item);
	void updata();
	void onRander();
	void showEquiement(int nIndex);
	~CEquimpent();
private:
	CIteam* m_arrEquiemetns[4];
	vector<CIteam*>m_vecEquiement;
	int m_nIndex;
};

源文件:

#include "stdafx.h"
#include "Equimpent.h"


CEquimpent::CEquimpent()
{
	memset(m_arrEquiemetns, 0, sizeof(m_arrEquiemetns));
}


CEquimpent::~CEquimpent()
{
	for (int i = 0; i < 4;i++)
	{
		SAFE_DELET(m_arrEquiemetns[i]);
	}
	for (int i = 0; i < m_vecEquiement.size();i++)
	{
		SAFE_DELET(m_vecEquiement[i]);
	}
	m_vecEquiement.clear();
}

void CEquimpent::updata()
{
	if (KEY_DOWN(VK_DOWN))
	{
		m_nIndex++;
		if (m_nIndex>m_vecEquiement.size()-1)
		{
			m_nIndex = 0;
		}
	}
	else if (KEY_DOWN(VK_DOWN))
	{
		m_nIndex--;
		if (m_nIndex < 0)
		{
			m_nIndex = m_vecEquiement.size() - 1;
		}
	}
	if (KEY_DOWN(VK_RETURN))
	{
		wearEquiepment(m_vecEquiement[m_nIndex]);
		m_vecEquiement.erase(m_vecEquiement.begin() + m_nIndex);
		//每当装备更新时,才给玩家增加属性,增加属性前,应当先给玩家属性设为初值
		g_GameMgr->getgameMap()->getplayer()->playerAttributeToInit();
		for (int i = 0; i < 4;i++)
		{
			if (m_arrEquiemetns[i]!=nullptr)
			{
				m_arrEquiemetns[i]->useItem();
			}
		}
	}
	if (KEY_DOWN(VK_ESCAPE))
	{
		g_GameMgr->setgameState(E_GAME_MAP);
	}
}

void CEquimpent::onRander()
{
	cout << "攻击力:" << "\t" << g_GameMgr->getgameMap()->getplayer()->getATC() << endl;
	cout << "防御:" << "\t" << g_GameMgr->getgameMap()->getplayer()->getDEF() << endl;
	cout << "血量:" << "\t" << g_GameMgr->getgameMap()->getplayer()->getHP() << endl;
	cout << "蓝量:" << "\t" << g_GameMgr->getgameMap()->getplayer()->getMP() << endl;
	cout << "--------------------可穿戴装备-----------------------------" << endl;
// 	cout << "武器:" << "\t";
// 	showEquiement(0);
// 	cout << "盾牌:" << "\t";
// 	showEquiement(1);
// 	cout << "铠甲:" << "\t";
// 	showEquiement(2);
// 	cout << "鞋子:" << "\t";
// 	showEquiement(3);
	for (int i = 0; i < m_vecEquiement.size();i++)
	{
		if (i == m_nIndex)
		{
			cout << "->";
		}
		else
		{ 
			cout << "  "; 
		}
		cout << m_vecEquiement[i]->getszName() << "\t" << m_vecEquiement[i]->getszPIC() << endl;
	}
	cout << "--------------------当前穿戴装备-----------------------------" << endl;
	cout << "武器" << "\t"; showEquiement(0);
	cout << "盾牌" << "\t"; showEquiement(1);
	cout << "铠甲" << "\t"; showEquiement(2);
	cout << "鞋子" << "\t"; showEquiement(3);
}

void CEquimpent::wearEquiepment(CIteam* item)
{
	if (item->getitemType()==E_ITEM_WEAPON)
	{
		tookOfEquiepment(m_arrEquiemetns[0]);
		m_arrEquiemetns[0] = item;
	}
	else if (item->getitemType()==E_ITEM_SHIELD)
	{
		tookOfEquiepment(m_arrEquiemetns[1]);
		m_arrEquiemetns[1] = item;
	}
	else if (item->getitemType() == E_ITEM_ARMOUR)
	{
		tookOfEquiepment(m_arrEquiemetns[2]);
		m_arrEquiemetns[2] = item;
	}
	else if (item->getitemType() == E_ITEM_SHOES)
	{
		tookOfEquiepment(m_arrEquiemetns[3]);
		m_arrEquiemetns[3] = item;
	}
}

void CEquimpent::showEquiement(int nIndex)
{
	if (m_arrEquiemetns[nIndex]==nullptr)
	{
		cout << "请佩戴相关装备" << endl;
	}
	else
	{
		cout << m_arrEquiemetns[nIndex]->getszName() << "\t" << m_arrEquiemetns[nIndex]->getszPIC() << endl;
	}
}

void CEquimpent::addEquiepment(SIteamDt* itemDt)
{
	CIteam* item = new CIteam;
	item->initItem(itemDt);
	m_vecEquiement.push_back(item);
}

void CEquimpent::tookOfEquiepment(CIteam* item)
{
	if (item!=nullptr)
	{
		m_vecEquiement.push_back(item);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41791653/article/details/81910056
今日推荐