프로젝트 

Inventory / Item 변경 + ItemTable 생성

 

ItemTable

게임에서 사용할 아이템의 효과를 미리 설정해두는 목적으로 생성

스케일이 큰 게임이라면 따로 파일에 적어 파싱을 하지만 미니 프로젝트인 만큼 솔루션 안에서 정의했다.

//================= cpp ==================

#include "pch.h"
#include "ItemTable.h"
#include "Item.h"

void ItemTable::Init()
{
	// 아이템 "붕대" 추가
	Item* Bandage = new Item();
	Bandage->GetItemInfo().name = "붕대";
	Bandage->GetItemInfo().price = 50;
	Bandage->GetItemInfo().effectType = ItemEffectType::Heal;
	Bandage->GetItemInfo().effectValue = 50;
	table["붕대"] = Bandage;
	delete Bandage;

	// 아이템 "아드레날린" 추가
	Item* Adrenaline = new Item();
	Adrenaline->GetItemInfo().name = "아드레날린";
	Adrenaline->GetItemInfo().price = 150;
	Adrenaline->GetItemInfo().effectType = ItemEffectType::AttackUp;
	Adrenaline->GetItemInfo().effectValue = 10;
	table["아드레날린"] = Adrenaline;
	delete Adrenaline;
}

Item* ItemTable::GetItem(string itemName) const
{
	for (const auto& pair : table)
	{
		if (pair.first == itemName)
		{
			return pair.second;
		}
	}
	return nullptr;
}

//================= header ==================

Item

아이템 생성자에서 받는 파라미터가 많아 가독성이 떨어지는 점도 있고 다른 부분에서 받아 쓰기에도 편하게 아이템 수량을 제외하고 구조체로 묶었다.

#pragma once

using namespace std;

// 아이템 효과 타입
enum class ItemEffectType
{
	None,
	Heal,		// 체력회복
	AttackUp	// 공격력 증가
};

struct ItemInfo
{
	string name = "";	// 아이템 이름
	int price = 0;			// 아이템 가격
	ItemEffectType effectType = ItemEffectType::None;	// 아이템 효과 타입
	int effectValue = 0;	// 효과 수치		

};

class Item
{
private:
	
	ItemInfo info;
	int itemCount;		// 수량

public:
	Item();	// 생성자

	// Getter
	ItemInfo& GetItemInfo();
	int GetiItemCount() const;

	// Setter
	void SetItemInfo(const ItemInfo& InInfo);
	void SetsItemCount(const int& ItemCount_);

	void AddItemCount(int amount);	// 아이템 수량 증가
	void ReduceItemCount(int amount);	// 아이템 수량 증가
};

Inventory

아이템 테이블을 생성함에 따라 인벤토리에서 아이템을 추가하는 로직을 변경하고 UI에서 띄우기 편하게 보유 아이템 목록을 vector<string> 타입에 저장하고 반환하는 함수 생성

// =================== cpp ====================

#include "pch.h"
#include "Inventory.h"
#include "ItemTable.h"

Inventory::Inventory() : capacity(6)
{
	items.reserve(capacity);	// 인벤토리 최대용량 초기화
}

Inventory::~Inventory()
{
}

vector<shared_ptr<Item>> Inventory::GetInventory() const
{
	return items;
}

vector<string> Inventory::GetItemList()
{
	vector<string> nameList;
	int i = 0; 
	for (const auto& data : items)
	{
		nameList[i] = data->GetItemInfo().name;
		i++;
	}
	
	return nameList;
}

void Inventory::AddItem(Item* Item_, const int& itemCount_)
{
	string itemName_ = Item_->GetItemInfo().name;

	// 인벤토리 남은 자리 확인
	if (items.size() >= capacity)
	{
		return;
	}
	
	// 동일 아이템 확인
	for (const auto& item_ : items)
	{
		if (item_->GetItemInfo().name == itemName_)
		{
			// 개수 만큼 추가
			item_->AddItemCount(itemCount_);
			break;
		}
	}
	
	// 아이템 추가
	items.push_back(shared_ptr<Item>(Item_));
}

void Inventory::RemoveItem(const string& itemName_, const int& itemCount_)
{
	for (auto inventorySlot = items.begin(); inventorySlot != items.end(); )
	{
		auto& item_ = *inventorySlot; // item_ 타입 : shared_ptr<Item>&

		if (item_->GetItemInfo().name == itemName_)
		{
			// 개수 만큼 감소
			item_->ReduceItemCount(itemCount_);
			if (item_->GetiItemCount() <= 0)
			{
				inventorySlot = items.erase(inventorySlot);
			}
		}
	}
}

// =================== header ====================

#pragma once
#include <map>
#include "Item.h"
using namespace std;

class Item;

class Inventory
{
private:
	vector<shared_ptr<Item>> items;		// 인벤토리 저장소
	int capacity; // 인벤토리 용량

public:
	Inventory();	// 생성자
	~Inventory();	// 소멸자

	vector<shared_ptr<Item>> GetInventory() const;	// Getter

	vector<string> GetItemList();	// 아이템 리스트

	void AddItem(Item* Item_, const int& itemCount_);	// 인벤토리에 아이템 추가
	void RemoveItem(const string& itemName_, const int& itemCount_);	// 인벤토리에 있는 아이템 삭제
};

오늘의 한줄평

팀내에 잘하시는 분이 계셔서 코드를 짜고 방향성을 잡아 주셔서 코드를 짜는 것에 길을 찾아주셔서 좋고 그것을 경험으로  더 나은 코딩을 할 수 있게되어 좋았다.

+ Recent posts