개인공부/DirectX

dx_22일차 Action_MapEditor

코딩기계 2024. 3. 28. 12:58

 

내용:

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분///

/////////////////////////////////////////////