一、装备物品时,人物属性要进行相应的更改:
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);
}
}