dx_22일차 Action_MapEditor
내용:
1.IMGUI 활용
맵에디터
mapeditorScene.h
class MapEditorScene : public Scene
{
private:
const int CELL_WIDTH = 124;
const int CELL_HEIGHT = 20;
public:
MapEditorScene();
~MapEditorScene();
void Update() override;
void Render() override;
void PostRender() override;
private:
void EditBG();
void EditTexture(Quad* quad, string key);
void SaveBG();
void LoadBG();
private:
Quad* background;
Quad* sampleTile;
};
.cpp
#include "Framework.h"
#include "MapEditorScene.h"
MapEditorScene::MapEditorScene()
{
background = new Quad(L"Resources/Textures/BG/bg.png");
background->SetLocalPosition(CENTER);
background->SetTag("BG");
LoadBG();
sampleTile = new Quad(L"Resources/Textures/BG/Floor.png");
}
MapEditorScene::~MapEditorScene()
{
FloorManager::Delete();
}
void MapEditorScene::Update()
{
int x = (int)mousePos.x / CELL_WIDTH;
int y = (int)mousePos.y / CELL_HEIGHT;
Vector2 halfSize = Vector2(CELL_WIDTH * 0.5f, CELL_HEIGHT * 0.5f);
Vector2 pos = Vector2(x, y) * Vector2(CELL_WIDTH, CELL_HEIGHT) + halfSize;
sampleTile->SetLocalPosition(pos);
if (!ImGui::GetIO().WantCaptureMouse && KEY->Down(VK_LBUTTON))
{
FloorManager::Get()->Add(pos, sampleTile->GetMaterial()->GetTexture()->GetFile());
}
}
void MapEditorScene::Render()
{
FloorManager::Get()->Render();
}
void MapEditorScene::PostRender()
{
EditBG();
EditTexture(sampleTile, "Tile");
}
void MapEditorScene::EditBG()
{
EditTexture(background, "BG");
background->RenderUI();
if (ImGui::Button("Save BG"))
{
SaveBG();
}
}
void MapEditorScene::EditTexture(Quad* quad, string key)
{
if (ImGui::Button(key.c_str()))
DIALOG->OpenDialog(key, key, ".png,.jpg");
if (DIALOG->Display(key))
{
if (DIALOG->IsOk())
{
string path = "Resources/Textures/BG/";
string file = DIALOG->GetCurrentFileName();
quad->SetTexture(ToWString(path + file));
}
DIALOG->Close();
}
}
void MapEditorScene::SaveBG()
{
background->Save();
BinaryWriter* writer = new BinaryWriter("Resources/TextData/Shooting/BG.data");
writer->WString(background->GetMaterial()->GetTexture()->GetFile());
delete writer;
}
void MapEditorScene::LoadBG()
{
background->Load();
BinaryReader* reader = new BinaryReader("Resources/TextData/Shooting/BG.data");
if (reader->IsFailed())
{
delete reader;
return;
}
background->SetTexture(reader->WString());
delete reader;
}
2. 타일 저장
int x = (int)mousePos.x / CELL_WIDTH;
int y = (int)mousePos.y / CELL_HEIGHT;
Vector2 halfSize = Vector2(CELL_WIDTH * 0.5f, CELL_HEIGHT * 0.5f);
Vector2 pos = Vector2(x, y) * Vector2(CELL_WIDTH, CELL_HEIGHT) + halfSize;
sampleTile->SetLocalPosition(pos);
3.타일에디팅시스템
Map폴더->Floor, FloorManager생성
Floor
#pragma once
class Floor : public Quad
{
public:
Floor(wstring file);
~Floor();
void Update() override;
void Render() override;
RectCollider* GetCollider() { return collider; }
private:
RectCollider* collider;
};
cpp
#include "Framework.h"
Floor::Floor(wstring file)
: Quad(file, false)
{
collider = new RectCollider(size);
collider->SetParent(this);
}
Floor::~Floor()
{
delete collider;
}
void Floor::Update()
{
UpdateWorld();
collider->UpdateWorld();
}
void Floor::Render()
{
Quad::Render();
collider->Render();
}
Floor를 관리하는 매니저 생성
#pragma once
class FloorManager : public Singleton<FloorManager>
{
private:
friend class Singleton;
FloorManager();
~FloorManager();
public:
void Update();
void Render();
void Add(const Vector2& pos, wstring textureFile);
private:
vector<Floor*> floors;
};
cpp
#include "Framework.h"
FloorManager::FloorManager()
{
}
FloorManager::~FloorManager()
{
for (Floor* floor : floors)
delete floor;
}
void FloorManager::Update()
{
}
void FloorManager::Render()
{
for (Floor* floor : floors)
floor->Render();
ImGui::Text(to_string(floors.size()).c_str());
}
void FloorManager::Add(const Vector2& pos, wstring textureFile)
{
for (Floor* floor : floors)
{
if (floor->GetCollider()->IsPointCollision(pos))
{
return;
}
}
Floor* floor = new Floor(textureFile);
floor->SetLocalPosition(pos);
floor->Update();
floors.push_back(floor);
}
과제 :
우클릭하면 타일 지우기
에디팅 한 맵 세이브, 로드하기
타일 지우기 (lierator를 사용해서 검색하고 마우스와 충돌한다면 삭제)
void FloorManager::DeleteFloor()
{
for (Floor* floor : floors)
{
if (floor->GetCollider()->IsPointCollision(mousePos))
{
vector<Floor*>::iterator iter = find(floors.begin(), floors.end(), floor);
if (iter != floors.end())
{
floors.erase(iter);
}
return;
}
}
}
타일 세이브 로드
void FloorManager::SaveFloor()
{
BinaryWriter* writer = new BinaryWriter("Resources/TextData/Shooting/Floor.data");
//앞의 수업에서 진행한 인벤토리의 아이템 세이브와 같이 아이템의 숫자만큼, 즉 타일의 숫자만큼 저장해야한다.
writer->UInt(floors.size());
for (Floor* floor : floors)
{
//위치값을 받아주려고 transform에 있는 save를 해주려했는데 진행이안됌
// 이유를 생각해보니 이중으로 파일이 있기때문에라고 생각됨
// 로드쪽에서 터지는걸봤을때,세이브파일이 생성되지 않은것을 생각했을때 일일이 저장해줘야한다고 생각했다.
// floor->Save();
writer->WString(floor->GetMaterial()->GetTexture()->GetFile());
writer->Float(floor->GetGlobalPosition().x);
writer->Float(floor->GetGlobalPosition().y);
}
delete writer;
}
void FloorManager::LoadFloor()
{
BinaryReader* reader = new BinaryReader("Resources/TextData/Shooting/Floor.data");
if (reader->IsFailed())
{
delete reader;
return;
}
UInt size = reader->UInt();
//로드시켜줄때 reserve, resize를 통해 메모리가 유수 되는것을 막아주자!
floors.reserve(size);
FOR(size)
{
Floor* floor = new Floor(reader->WString());
Vector2 position;
position.x = reader->Float();
position.y = reader->Float();
floor->SetLocalPosition(position);
//업데이트를 시켜주지않으면 왼쪽아래에 위치가 고정되서 업데이트로 위치를 불러와줘야한다.(collider 또한 마찬가지)
floor->Update();
floors.push_back(floor);
//floor->Load();
}
delete reader;
}
오늘 할일: 0327 / 0328 수업복습 (4시간) (완)
0328 단기과제 끝내고 (1시간) (완)
코테 0단계 10개 ->1시간 (완)
장기과제:
++ 스타트씬넣기-> 다음에 시간날때 넣자!
0. 인게임 씬 넣고 uimanager넣고 uimanager의 버튼을 누르면 몬스터가 spawn이 되도록 설정하자.
1. 배경넣고 player, enemy진영 설정 enemy는 일정량의 돈이 지나면 소환
2. 일단 소환
3. player의 시간이 지날때마다 돈이 증가 -> 일정량의 돈 & 몬스터슬롯 버튼을 클릭하면 소환
다끝나면
///////////////////////////////////////////////
//코테 1단계 3개 ->30분 ///
//코테 2단계 1개 ->20분///
/////////////////////////////////////////////