이번에는 게임 플레이가 종료 된 후에 나오는 결과 화면에 대해 알아보자.
사실 이 Scene 진짜 별거 없다.
이때까지 나왔던 객체들의 위치만 조정해서 보여주는 방식이 전부다.
이 씬에서는 player의 능력치와 보유한 무기와 아이템을 보여주는 기능과 다음과 같은 기능을 제공한다.
- 재시작을 누를 시 웨이브 다시 시작
- 새로운 달리기를 누를 시 캐릭터 선택화면 부터 다시 시작
- 메인 메뉴로 돌아가기
결과화면은 플레이어의 체력이 0에 도달하면 달리기 패배 문구와 함께 해당 화면이 나오게 된다.
CScene_Run_End
#pragma once
#include "CScene.h"
#include "Direct2DMgr.h"
class CPanelUI;
class CScene_Run_End :
public CScene
{
private:
ScrollArea m_scrollArea; //구조체 정의는 Direct2DMgr에
vector<CObject*> m_scrollContent; //스크롤 영역에 정의할 객체들
public:
virtual void update();
//virtual void finalupdate();
virtual void render(ID2D1HwndRenderTarget* _pRender);
public:
void CreateScrollArea();
void UpdateScrollPosition(float deltaY);
void RenderScrollArea(ID2D1HwndRenderTarget* _pRender);
ScrollArea& GetScrollArea() { return m_scrollArea; }
public:
virtual void Enter(); //해당 Scene에 진입 시 호출.
virtual void Exit(); //해당 Scene에 탈출 시 호출.
public:
void CreateMainPanel();
void CreateInfoPanel(CPanelUI *_backPanel);
void CreateItemInfoPanel(CPanelUI* _backPanel);
void CreateWeaponInfoPanel(CPanelUI* _backPanel);
void CreateBackGround(Direct2DMgr* _pD2DMgr, Vec2 _vResolution);
void CreateReRunBtn();
void CreateNewRunBtn();
void CreateReturnMainMenuBtn();
void CreateWaveInfoTextPanel(int _wave);
void CreateWaveInfoNumberPanel(wchar_t* buffer, size_t bufferSize, int _wave);
public:
CScene_Run_End();
~CScene_Run_End();
};
#include "pch.h"
#include "CScene_Run_End.h"
#include "CCore.h"
#include "Direct2DMgr.h"
#include "CSceneMgr.h"
#include "ItemMgr.h"
#include "CWaveMgr.h"
#include "CObject.h"
#include "CSpriteUI.h"
#include "CTextUI.h"
#include "CBtnUI.h"
#include "CUI.h"
#include "CWeapon.h"
#include "CPanelUI.h"
#include "CScene.h"
#include "CPlayer.h"
CScene_Run_End::CScene_Run_End()
{
}
CScene_Run_End::~CScene_Run_End()
{
}
void CScene_Run_End::update()
{
CScene::update();
}
void CScene_Run_End::render(ID2D1HwndRenderTarget* _pRender)
{
CScene::render(_pRender);
RenderScrollArea(_pRender);
}
void CScene_Run_End::Enter()
{
wchar_t buffer[20];
size_t bufferSize = sizeof(buffer) / sizeof(wchar_t);
Vec2 vResolution = CCore::GetInstance()->GetResolution();
Direct2DMgr* pD2DMgr = Direct2DMgr::GetInstance();
CWaveMgr* waveMgr = CWaveMgr::GetInstance();
/////////////////뒷 배경 오브젝트/////////////////
CreateBackGround(pD2DMgr, vResolution);
/////////////////뒷 배경 오브젝트/////////////////
//////////////////뒷 판떼기///////////////////////
CreateMainPanel();
//////////////////뒷 판떼기///////////////////////
/////////////////재시작 버튼//////////////////////
//244,506
CreateReRunBtn();
/////////////////재시작 버튼//////////////////////
/////////////////새로달리기 버튼//////////////////
CreateNewRunBtn();
/////////////////새로달리기 버튼//////////////////
/////////////////메인메뉴로 돌아가기 버튼/////////
CreateReturnMainMenuBtn();
/////////////////메인메뉴로 돌아가기 버튼/////////
////////////상단 실패or성공 - 격돌지대 text ui////////////////////
int wave = waveMgr->GetLevel();
CreateWaveInfoTextPanel(wave);
////////////상단 실패or성공 - 격돌지대 text ui////////////////////
//////////////////웨이브 정보/////////////////////////////////////
CreateWaveInfoNumberPanel(buffer, bufferSize, wave);
//////////////////웨이브 정보/////////////////////////////////////
}
void CScene_Run_End::Exit()
{
Safe_Delete_Vec(m_scrollContent);
DeleteAll();
}
void CScene_Run_End::CreateMainPanel()
{
Vec2 vResolution = CCore::GetInstance()->GetResolution();
//뒷 판떼기
CPanelUI* backPanel = new CPanelUI;
backPanel->SetObjType(GROUP_TYPE::DEFAULT);
backPanel->SetPos(vResolution / 2.f);
backPanel->SetColor(ColorNormalize(0, 0, 0), ColorNormalize(0, 0, 0));
backPanel->SetNormalAlpha(0.5f);
backPanel->SetMouseOnAlpha(0.5f);
backPanel->SetScale(Vec2(882.f, 428.f));
AddObject(backPanel, GROUP_TYPE::DEFAULT);
//정보창
CreateInfoPanel(backPanel);
//무기
CreateWeaponInfoPanel(backPanel);
//아이템
CreateItemInfoPanel(backPanel);
}
void CScene_Run_End::CreateInfoPanel(CPanelUI* _backPanel)
{
Vec2 vResolution = CCore::GetInstance()->GetResolution();
Direct2DMgr* pD2DMgr = Direct2DMgr::GetInstance();
CWaveMgr* waveMgr = CWaveMgr::GetInstance();
wchar_t buffer[20];
//플레이어 Info 출력.
const playerParameter playerInfo = static_cast<CPlayer*>(CSceneMgr::GetInstance()->GetPlayer())->GetPlayerInfo();
//////////////////우측 능력치 보여주는 곳///////////////////////
//CPanelUI* parameterPanel = new CPanelUI;
CPanelUI* parameterPanel = _backPanel->AddChild<CPanelUI>(Vec2(-_backPanel->GetScale().x / 2.f + 100.f + 20.f, 0.f));
parameterPanel->SetName(L"parameterPanel");
parameterPanel->SetObjType(GROUP_TYPE::IMAGE);
//parameterPanel->SetPos(_panelPos);
parameterPanel->SetColor(ColorNormalize(0, 0, 0), ColorNormalize(0, 0, 0));
parameterPanel->SetScale(Vec2(200.f, 300.f));
//AddObject(parameterPanel, GROUP_TYPE::IMAGE);
//////////////////우측 능력치 보여주는 곳///////////////////////
////////////우측 능력치 보여주는 곳////////////////////
CSpriteUI* abilityText = parameterPanel->AddChild<CSpriteUI>(Vec2(0.f, -130.f));
abilityText->SetName(L"abilityText");
abilityText->SetObjType(GROUP_TYPE::UI);
abilityText->SetScale(Vec2(196.f, 26.f));
abilityText->CreateTextUI(L"능력치", -(abilityText->GetScale() / 2.f), (abilityText->GetScale() / 2.f)
, 22, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////우측 능력치 보여주는 곳////////////////////
////////////현재 레벨 ////////////////////
CPanelUI* statLevelPanel = parameterPanel->AddChild<CPanelUI>(Vec2(0.f ,-80.f));
statLevelPanel->SetScale(Vec2(180.f, 15.f));
statLevelPanel->SetColor(D2D1::ColorF(0, 0, 0, 0), D2D1::ColorF(0, 0, 0, 0));
//레벨 아이콘
CSpriteUI* nowLevelIcon = statLevelPanel->AddChild<CSpriteUI>(Vec2(-statLevelPanel->GetScale().x / 2.f + 10.f , 0.f));
nowLevelIcon->SetName(L"nowLevelIcon");
nowLevelIcon->SetObjType(GROUP_TYPE::UI);
nowLevelIcon->AddImage(pD2DMgr->GetStoredBitmap(L"brotato_icon"));
nowLevelIcon->SetScale(Vec2(15.f, 15.f));
//현재레벨 text
CSpriteUI* nowLevelText = statLevelPanel->AddChild<CSpriteUI>(Vec2(0.f, 0.f));
nowLevelText->SetName(L"nowLevelText");
nowLevelText->SetObjType(GROUP_TYPE::UI);
nowLevelText->SetScale(Vec2(110.f, 35.f));
swprintf_s(buffer, L"현재 레벨");
nowLevelText->CreateTextUI(buffer, -(nowLevelText->GetScale() / 2.f), (nowLevelText->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
nowLevelText->GetTextUI()->SetHorizontal(1);
//현재레벨 숫자
CSpriteUI* nowLevelCount = statLevelPanel->AddChild<CSpriteUI>(Vec2(statLevelPanel->GetScale().x / 2.f - 10.f, 0.f));
nowLevelCount->SetName(L"nowLevelCount");
nowLevelCount->SetObjType(GROUP_TYPE::UI);
nowLevelCount->SetScale(Vec2(35.f, 35.f));
swprintf_s(buffer, L"%d", playerInfo.m_iLevel);
nowLevelCount->CreateTextUI(buffer, -(nowLevelCount->GetScale() / 2.f), (nowLevelCount->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////현재 레벨 ////////////////////
////////////최대 HP ////////////////////
CPanelUI* statMaxHpPanel = parameterPanel->AddChild<CPanelUI>(Vec2(0.f, -55.f));
statMaxHpPanel->SetScale(Vec2(180.f, 15.f));
statMaxHpPanel->SetColor(D2D1::ColorF(0, 0, 0, 0), D2D1::ColorF(0, 0, 0, 0));
//현재 최대hp 아이콘
CSpriteUI* maxHPIcon = statMaxHpPanel->AddChild<CSpriteUI>(Vec2(-statMaxHpPanel->GetScale().x / 2.f + 10.f , 0.f));
maxHPIcon->SetName(L"maxHPIcon");
maxHPIcon->SetObjType(GROUP_TYPE::UI);
maxHPIcon->AddImage(pD2DMgr->GetStoredBitmap(L"max_hp"));
maxHPIcon->SetScale(Vec2(15.f, 15.f));
//현재 최대hp text
CSpriteUI* maxHPText = statMaxHpPanel->AddChild<CSpriteUI>(Vec2(0.f,0.f));
maxHPText->SetName(L"maxHPText");
maxHPText->SetObjType(GROUP_TYPE::UI);
maxHPText->SetScale(Vec2(110.f, 35.f));
swprintf_s(buffer, L"최대 HP");
maxHPText->CreateTextUI(buffer, -(maxHPText->GetScale() / 2.f), (maxHPText->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
maxHPText->GetTextUI()->SetHorizontal(1);
//현재 최대hp 숫자
CSpriteUI* maxHPCount = statMaxHpPanel->AddChild<CSpriteUI>(Vec2(statMaxHpPanel->GetScale().x / 2.f - 10.f, 0.f));
maxHPCount->SetName(L"maxHPCount");
maxHPCount->SetObjType(GROUP_TYPE::UI);
maxHPCount->SetScale(Vec2(35.f, 35.f));
swprintf_s(buffer, L"%d", playerInfo.m_iMaxHP);
maxHPCount->CreateTextUI(buffer, -(maxHPCount->GetScale() / 2.f), (maxHPCount->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////최대 HP ////////////////////
////////////데미지 % ////////////////////
CPanelUI* statDamagePanel = parameterPanel->AddChild<CPanelUI>(Vec2(0.f, -30.f));
statDamagePanel->SetScale(Vec2(180.f, 15.f));
statDamagePanel->SetColor(D2D1::ColorF(0, 0, 0, 0), D2D1::ColorF(0, 0, 0, 0));
//
CSpriteUI* FinalDMGIcon = statDamagePanel->AddChild<CSpriteUI>(Vec2(-statDamagePanel->GetScale().x / 2.f + 10.f, 0.f));
FinalDMGIcon->SetName(L"FinalDMGIcon");
FinalDMGIcon->SetObjType(GROUP_TYPE::UI);
FinalDMGIcon->AddImage(pD2DMgr->GetStoredBitmap(L"percent_damage"));
FinalDMGIcon->SetScale(Vec2(15.f, 15.f));
//
CSpriteUI* FinalDMGText = statDamagePanel->AddChild<CSpriteUI>(Vec2(0.f,0.f));
FinalDMGText->SetName(L"FinalDMGText");
FinalDMGText->SetObjType(GROUP_TYPE::UI);
FinalDMGText->SetScale(Vec2(110.f, 35.f));
swprintf_s(buffer, L"%% 데미지");
FinalDMGText->CreateTextUI(buffer, -(FinalDMGText->GetScale() / 2.f), (FinalDMGText->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
FinalDMGText->GetTextUI()->SetHorizontal(1);
//
CSpriteUI* FinalDMGCount = statDamagePanel->AddChild<CSpriteUI>(Vec2(statDamagePanel->GetScale().x / 2.f - 10.f, 0.f));
FinalDMGCount->SetName(L"FinalDMGCount");
FinalDMGCount->SetObjType(GROUP_TYPE::UI);
FinalDMGCount->SetScale(Vec2(35.f, 35.f));
swprintf_s(buffer, L"%d", static_cast<int>(playerInfo.m_fDamageCoef));
FinalDMGCount->CreateTextUI(buffer, -(FinalDMGCount->GetScale() / 2.f), (FinalDMGCount->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////데미지 % ////////////////////
////////////근거리 데미지 % ////////////////////
CPanelUI* statMeleeDMGPanel = parameterPanel->AddChild<CPanelUI>(Vec2(0.f, -5.f));
statMeleeDMGPanel->SetScale(Vec2(180.f, 15.f));
statMeleeDMGPanel->SetColor(D2D1::ColorF(0, 0, 0, 0), D2D1::ColorF(0, 0, 0, 0));
//
CSpriteUI* MeleeDMGIcon = statMeleeDMGPanel->AddChild<CSpriteUI>(Vec2(-statMeleeDMGPanel->GetScale().x / 2.f + 10.f, 0.f));
MeleeDMGIcon->SetName(L"MeleeDMGIcon");
MeleeDMGIcon->SetObjType(GROUP_TYPE::UI);
MeleeDMGIcon->AddImage(pD2DMgr->GetStoredBitmap(L"melee_damage"));
MeleeDMGIcon->SetScale(Vec2(15.f, 15.f));
//
CSpriteUI* MeleeText = statMeleeDMGPanel->AddChild<CSpriteUI>(Vec2(0.f, 0.f));
MeleeText->SetName(L"MeleeText");
MeleeText->SetObjType(GROUP_TYPE::UI);
MeleeText->SetScale(Vec2(110.f, 35.f));
swprintf_s(buffer, L"근거리 데미지");
MeleeText->CreateTextUI(buffer, -(MeleeText->GetScale() / 2.f), (MeleeText->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
MeleeText->GetTextUI()->SetHorizontal(1);
//
CSpriteUI* MeleeCount = statMeleeDMGPanel->AddChild<CSpriteUI>(Vec2(statMeleeDMGPanel->GetScale().x / 2.f - 10.f, 0.f));
MeleeCount->SetName(L"MeleeCount");
MeleeCount->SetObjType(GROUP_TYPE::UI);
MeleeCount->SetScale(Vec2(35.f, 35.f));
swprintf_s(buffer, L"%d", static_cast<int>(playerInfo.m_fMeleeCoef));
MeleeCount->CreateTextUI(buffer, -(MeleeCount->GetScale() / 2.f), (MeleeCount->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////근거리 데미지 % ////////////////////
////////////원거리 데미지 % ////////////////////
CPanelUI* statRangedDMGPanel = parameterPanel->AddChild<CPanelUI>(Vec2(0.f, 20.f));
statRangedDMGPanel->SetScale(Vec2(180.f, 15.f));
statRangedDMGPanel->SetColor(D2D1::ColorF(0, 0, 0, 0), D2D1::ColorF(0, 0, 0, 0));
//
CSpriteUI* rangedDMGIcon = statRangedDMGPanel->AddChild<CSpriteUI>(Vec2(-statRangedDMGPanel->GetScale().x / 2.f + 10.f, 0.f));
rangedDMGIcon->SetName(L"rangedDMGIcon");
rangedDMGIcon->SetObjType(GROUP_TYPE::UI);
rangedDMGIcon->AddImage(pD2DMgr->GetStoredBitmap(L"ranged_damage"));
rangedDMGIcon->SetScale(Vec2(15.f, 15.f));
//
CSpriteUI* rangedText = statRangedDMGPanel->AddChild<CSpriteUI>(Vec2(0.f, 0.f));
rangedText->SetObjType(GROUP_TYPE::UI);
rangedText->SetScale(Vec2(110.f, 35.f));
swprintf_s(buffer, L"원거리 데미지");
rangedText->CreateTextUI(buffer, -(rangedText->GetScale() / 2.f), (rangedText->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
rangedText->GetTextUI()->SetHorizontal(1);
//
CSpriteUI* rangedCount = statRangedDMGPanel->AddChild<CSpriteUI>(Vec2(statRangedDMGPanel->GetScale().x / 2.f - 10.f, 0.f));
rangedCount->SetName(L"rangedCount");
rangedCount->SetObjType(GROUP_TYPE::UI);
rangedCount->SetScale(Vec2(35.f, 35.f));
swprintf_s(buffer, L"%d", static_cast<int>(playerInfo.m_fRangeCoef));
rangedCount->CreateTextUI(buffer, -(rangedCount->GetScale() / 2.f), (rangedCount->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////원거리 데미지 % ////////////////////
////////////공격속도 % ////////////////////
CPanelUI* statAttackSpeedPanel = parameterPanel->AddChild<CPanelUI>(Vec2(0.f, 45.f));
statAttackSpeedPanel->SetScale(Vec2(180.f, 15.f));
statAttackSpeedPanel->SetColor(D2D1::ColorF(0, 0, 0, 0), D2D1::ColorF(0, 0, 0, 0));
//
CSpriteUI* attackSpeedIcon = statAttackSpeedPanel->AddChild<CSpriteUI>(Vec2(-statAttackSpeedPanel->GetScale().x / 2.f + 10.f, 0.f));
attackSpeedIcon->SetName(L"attackSpeedIcon");
attackSpeedIcon->SetObjType(GROUP_TYPE::UI);
attackSpeedIcon->AddImage(pD2DMgr->GetStoredBitmap(L"attack_speed"));
attackSpeedIcon->SetScale(Vec2(15.f, 15.f));
//
CSpriteUI* attackSpeedText = statAttackSpeedPanel->AddChild<CSpriteUI>(Vec2(0.f, 0.f));
attackSpeedText->SetName(L"attackSpeedText");
attackSpeedText->SetObjType(GROUP_TYPE::UI);
attackSpeedText->SetScale(Vec2(110.f, 35.f));
swprintf_s(buffer, L"%% 공격 속도");
attackSpeedText->CreateTextUI(buffer, -(attackSpeedText->GetScale() / 2.f), (attackSpeedText->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
attackSpeedText->GetTextUI()->SetHorizontal(1);
//
CSpriteUI* attackSpeedCount = statAttackSpeedPanel->AddChild<CSpriteUI>(Vec2(statAttackSpeedPanel->GetScale().x / 2.f - 10.f, 0.f));
attackSpeedCount->SetName(L"attackSpeedCount");
attackSpeedCount->SetObjType(GROUP_TYPE::UI);
attackSpeedCount->SetScale(Vec2(35.f, 35.f));
swprintf_s(buffer, L"%d", static_cast<int>(playerInfo.m_fAttackSpeedCoef));
attackSpeedCount->CreateTextUI(buffer, -(attackSpeedCount->GetScale() / 2.f), (attackSpeedCount->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////공격속도 % ////////////////////
////////////치명타율 % ////////////////////
CPanelUI* statCritChancePanel = parameterPanel->AddChild<CPanelUI>(Vec2(0.f, 70.f));
statCritChancePanel->SetScale(Vec2(180.f, 15.f));
statCritChancePanel->SetColor(D2D1::ColorF(0, 0, 0, 0), D2D1::ColorF(0, 0, 0, 0));
//C
CSpriteUI* critChanceIcon = statCritChancePanel->AddChild<CSpriteUI>(Vec2(-statCritChancePanel->GetScale().x / 2.f + 10.f, 0.f));
critChanceIcon->SetName(L"critChanceIcon");
critChanceIcon->SetObjType(GROUP_TYPE::UI);
critChanceIcon->AddImage(pD2DMgr->GetStoredBitmap(L"crit_chance"));
critChanceIcon->SetScale(Vec2(15.f, 15.f));
//
CSpriteUI* critChanceText = statCritChancePanel->AddChild<CSpriteUI>(Vec2(0.f,0.f));
critChanceText->SetName(L"critChanceText");
critChanceText->SetObjType(GROUP_TYPE::UI);
critChanceText->SetScale(Vec2(110.f, 35.f));
swprintf_s(buffer, L"%% 치명타율");
critChanceText->CreateTextUI(buffer, -(critChanceText->GetScale() / 2.f), (critChanceText->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
critChanceText->GetTextUI()->SetHorizontal(1);
//
CSpriteUI* critChanceCount = statCritChancePanel->AddChild<CSpriteUI>(Vec2(statCritChancePanel->GetScale().x / 2.f - 10.f, 0.f));
critChanceCount->SetName(L"critChanceCount");
critChanceCount->SetObjType(GROUP_TYPE::UI);
//740 + Alpha
critChanceCount->SetPos(Vec2(920.f, 350.f));
critChanceCount->SetScale(Vec2(35.f, 35.f));
swprintf_s(buffer, L"%d", static_cast<int>(playerInfo.m_iCriticalAcc));
critChanceCount->CreateTextUI(buffer, -(critChanceCount->GetScale() / 2.f), (critChanceCount->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////치명타율 % ////////////////////
////////////속도 % ////////////////////
CPanelUI* statSpeedPanel = parameterPanel->AddChild<CPanelUI>(Vec2(0.f, 95.f));
statSpeedPanel->SetScale(Vec2(180.f, 15.f));
statSpeedPanel->SetColor(D2D1::ColorF(0, 0, 0, 0), D2D1::ColorF(0, 0, 0, 0));
//
CSpriteUI* speedIcon = statSpeedPanel->AddChild<CSpriteUI>(Vec2(-statSpeedPanel->GetScale().x / 2.f + 10.f, 0.f));
speedIcon->SetName(L"speedIcon");
speedIcon->SetObjType(GROUP_TYPE::UI);
speedIcon->AddImage(pD2DMgr->GetStoredBitmap(L"speed"));
speedIcon->SetScale(Vec2(15.f, 15.f));
//
CSpriteUI* speedText = statSpeedPanel->AddChild<CSpriteUI>(Vec2(0.f, 0.f));
speedText->SetName(L"speedText");
speedText->SetObjType(GROUP_TYPE::UI);
speedText->SetScale(Vec2(110.f, 35.f));
swprintf_s(buffer, L"%% 속도");
speedText->CreateTextUI(buffer, -(speedText->GetScale() / 2.f), (speedText->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
speedText->GetTextUI()->SetHorizontal(1);
//
CSpriteUI* speedCount = statSpeedPanel->AddChild<CSpriteUI>(Vec2(statSpeedPanel->GetScale().x / 2.f - 10.f, 0.f));
speedCount->SetName(L"speedCount");
speedCount->SetObjType(GROUP_TYPE::UI);
speedCount->SetScale(Vec2(35.f, 35.f));
swprintf_s(buffer, L"%d", static_cast<int>(playerInfo.m_fSpeed));
speedCount->CreateTextUI(buffer, -(speedCount->GetScale() / 2.f), (speedCount->GetScale() / 2.f)
, 11, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
////////////치명타율 % ////////////////////
}
void CScene_Run_End::CreateItemInfoPanel(CPanelUI* _backPanel)
{
wchar_t buffer[20];
CPanelUI* panelItemArea = _backPanel->AddChild<CPanelUI>(Vec2(-20.f, 60.f));
panelItemArea->SetName(L"PanelWeaponArea");
panelItemArea->SetObjType(GROUP_TYPE::IMAGE);
panelItemArea->SetColor(ColorNormalize(0, 0, 0), ColorNormalize(0, 0, 0));
panelItemArea->SetScale(Vec2(376.f, 300.f));
panelItemArea->SetMouseOnAlpha(0.f);
panelItemArea->SetNormalAlpha(0.f);
CSpriteUI* itemText =
panelItemArea->AddChild<CSpriteUI>(Vec2(-panelItemArea->GetScale().x / 2.f + 30.f + 5.f
, -panelItemArea->GetScale().y / 2.f + 17.f));
itemText->SetScale(Vec2(60.f, 35.f));
swprintf_s(buffer, L"아이템");
itemText->CreateTextUI(buffer, -(itemText->GetScale() / 2.f), (itemText->GetScale() / 2.f)
, 18, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
CreateScrollArea();
}
void CScene_Run_End::CreateWeaponInfoPanel(CPanelUI* _backPanel)
{
Direct2DMgr* pD2DMgr = Direct2DMgr::GetInstance();
wchar_t buffer[20];
CPanelUI* panelWeaponArea = _backPanel->AddChild<CPanelUI>(Vec2(-20.f, -150.f));
panelWeaponArea->SetName(L"PanelWeaponArea");
panelWeaponArea->SetObjType(GROUP_TYPE::IMAGE);
panelWeaponArea->SetColor(ColorNormalize(0, 0, 0), ColorNormalize(0, 0, 0));
panelWeaponArea->SetScale(Vec2(376.f, 104.f));
panelWeaponArea->SetMouseOnAlpha(0.f);
panelWeaponArea->SetNormalAlpha(0.f);
CSpriteUI* weaponText =
panelWeaponArea->AddChild<CSpriteUI>(Vec2(-panelWeaponArea->GetScale().x / 2.f + 22.f + 5.f
, -panelWeaponArea->GetScale().y/2.f + 17.f));
weaponText->SetScale(Vec2(45.f, 35.f));
swprintf_s(buffer, L"무기");
weaponText->CreateTextUI(buffer, -(weaponText->GetScale() / 2.f), (weaponText->GetScale() / 2.f)
, 18, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
const list<CWeapon*>& vPlayerWeaponList = static_cast<CPlayer*>(CSceneMgr::GetInstance()->GetPlayer())->GetPlayerWeapons();
CPlayer* tmp = static_cast<CPlayer*>(CSceneMgr::GetInstance()->GetPlayer());
int curWeaponCnt = (int)((CPlayer*)CSceneMgr::GetInstance()->GetPlayer())->GetWeaponCount();
CPanelUI* weaponImages = panelWeaponArea->AddChild<CPanelUI>(Vec2(0.f, 15.f));
weaponImages->SetColor(ColorNormalize(0, 0, 0), ColorNormalize(0, 0, 0));
weaponImages->SetScale(Vec2(376.f, 60.f));
weaponImages->SetMouseOnAlpha(0.f);
weaponImages->SetNormalAlpha(0.f);
int temp = 0;
for (auto iter = vPlayerWeaponList.begin(); iter != vPlayerWeaponList.end(); iter++, temp++)
{
CWeapon* weapon = *iter;
wstring iconTag = weapon->Getinfo().m_sIconImageKey;
CSpriteUI* weapons = weaponImages->AddChild<CSpriteUI>(Vec2(-155.f + temp*55.f ,0.f));
weapons->SetName(L"Weapon");
weapons->AddImage(pD2DMgr->GetStoredBitmap(iconTag));
weapons->SetObjType(GROUP_TYPE::UI);
weapons->SetScale(Vec2(50.f, 50.f));
weapons->SetBackGround(true);
weapons->SetBackGroundColor(ColorNormalize(30, 30, 30), ColorNormalize(0, 0, 0)
, ColorNormalize(30, 30, 30), ColorNormalize(0, 0, 0));
weapons->SetIsRound(true, 10.f, 10.f);
}
}
void CScene_Run_End::CreateBackGround(Direct2DMgr* _pD2DMgr, Vec2 _vResolution)
{
/////////////////뒷 배경 오브젝트/////////////////
CObject* backGround = new CSpriteUI;
backGround->SetObjType(GROUP_TYPE::DEFAULT);
backGround->AddImage(_pD2DMgr->GetStoredBitmap(L"shop_background"));
backGround->SetPos(_vResolution / 2.f);
backGround->SetScale(_vResolution);
AddObject(backGround, GROUP_TYPE::DEFAULT);
/////////////////뒷 배경 오브젝트/////////////////
}
void CScene_Run_End::CreateReRunBtn()
{
/////////////////재시작 버튼//////////////////////
//244,506
CBtnUI* rerunBtn = new CBtnUI;
rerunBtn->SetName(L"RerunBtn");
rerunBtn->SetObjType(GROUP_TYPE::UI);
rerunBtn->SetScale(Vec2(152.f, 34.f));
rerunBtn->SetIsRound(true, 10.f, 10.f);
rerunBtn->SetColor(ColorNormalize(237, 237, 237), ColorNormalize(0, 0, 0));
rerunBtn->SetClickedCallBack(ChangeScene, (DWORD_PTR)SCENE_TYPE::START, 0);
rerunBtn->CreateTextUI(L"재시작", -(rerunBtn->GetScale() / 2.f), (rerunBtn->GetScale() / 2.f)
, 20, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
rerunBtn->SetPos(Vec2(244.f, 506.f));
AddObject(rerunBtn, GROUP_TYPE::UI);
/////////////////재시작 버튼//////////////////////
}
void CScene_Run_End::CreateNewRunBtn()
{
/////////////////새로달리기 버튼//////////////////
CBtnUI* newRunBtn = new CBtnUI;
newRunBtn->SetName(L"NewRunBtn");
newRunBtn->SetObjType(GROUP_TYPE::UI);
newRunBtn->SetScale(Vec2(150.f, 34.f));
newRunBtn->SetIsRound(true, 10.f, 10.f);
newRunBtn->SetColor(ColorNormalize(237, 237, 237), ColorNormalize(0, 0, 0));
newRunBtn->SetClickedCallBack(ChangeScene, (DWORD_PTR)SCENE_TYPE::SELECT_CHARACTER, 0);
newRunBtn->CreateTextUI(L"새로운 달리기", -(newRunBtn->GetScale() / 2.f), (newRunBtn->GetScale() / 2.f)
, 20, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
newRunBtn->SetPos(Vec2(406.f, 506.f));
AddObject(newRunBtn, GROUP_TYPE::UI);
/////////////////새로달리기 버튼//////////////////
}
void CScene_Run_End::CreateReturnMainMenuBtn()
{
/////////////////메인메뉴로 돌아가기 버튼/////////
CBtnUI* returnToMainMenuBtn = new CBtnUI;
returnToMainMenuBtn->SetName(L"ReturnToMainMenu");
returnToMainMenuBtn->SetObjType(GROUP_TYPE::UI);
returnToMainMenuBtn->SetScale(Vec2(302.f, 34.f));
returnToMainMenuBtn->SetIsRound(true, 10.f, 10.f);
returnToMainMenuBtn->SetColor(ColorNormalize(237, 237, 237), ColorNormalize(0, 0, 0));
returnToMainMenuBtn->SetClickedCallBack(ChangeScene, (DWORD_PTR)SCENE_TYPE::MAIN, 0);
returnToMainMenuBtn->CreateTextUI(L"메인 메뉴로 돌아가기", -(returnToMainMenuBtn->GetScale() / 2.f), (returnToMainMenuBtn->GetScale() / 2.f)
, 20, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
returnToMainMenuBtn->SetPos(Vec2(640.f, 506.f));
AddObject(returnToMainMenuBtn, GROUP_TYPE::UI);
/////////////////메인메뉴로 돌아가기 버튼/////////
}
void CScene_Run_End::CreateWaveInfoTextPanel(int _wave)
{
////////////상단 실패or성공 - 격돌지대 text ui////////////////////
CObject* panelTextRunSuccessOrFail = new CSpriteUI;
panelTextRunSuccessOrFail->SetObjType(GROUP_TYPE::UI);
panelTextRunSuccessOrFail->SetPos(Vec2(360.f, 28.f));
panelTextRunSuccessOrFail->SetScale(Vec2(196.f, 26.f));
wchar_t buffer[20];
if (_wave <= 10)
swprintf_s(buffer, L"달리기 패배 - 격돌지대");
else
swprintf_s(buffer, L"달리기 성공 - 격돌지대");
panelTextRunSuccessOrFail->CreateTextUI(buffer, -(panelTextRunSuccessOrFail->GetScale() / 2.f), (panelTextRunSuccessOrFail->GetScale() / 2.f)
, 18, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
AddObject(panelTextRunSuccessOrFail, GROUP_TYPE::UI);
////////////상단 실패or성공 - 격돌지대 text ui////////////////////
}
void CScene_Run_End::CreateWaveInfoNumberPanel(wchar_t *buffer, size_t bufferSize, int _wave)
{
//////////////////웨이브 정보/////////////////////////////////////
CObject* panelTextWaveInfo = new CSpriteUI;
panelTextWaveInfo->SetObjType(GROUP_TYPE::UI);
panelTextWaveInfo->SetPos(Vec2(600.f, 28.f));
panelTextWaveInfo->SetScale(Vec2(74.f, 28.f));
swprintf_s(buffer, bufferSize, L"웨이브 %d", _wave);
panelTextWaveInfo->CreateTextUI(buffer, -(panelTextWaveInfo->GetScale() / 2.f), (panelTextWaveInfo->GetScale() / 2.f)
, 18, D2D1::ColorF::White, true, 1.f, D2D1::ColorF::Black
, FONT_TYPE::KR
, TextUIMode::TEXT
, 0);
AddObject(panelTextWaveInfo, GROUP_TYPE::UI);
//////////////////웨이브 정보/////////////////////////////////////
}
void CScene_Run_End::CreateScrollArea()
{
Vec2 vResolution = CCore::GetInstance()->GetResolution();
Direct2DMgr* pD2DMgr = Direct2DMgr::GetInstance();
// 스크롤 영역 설정
m_scrollArea.viewRect = D2D1::RectF(272.f, 220.f, 668.f, 480.f);
m_scrollArea.contentRect = D2D1::RectF(0.f, 0.f, 500.f, 800.f);
m_scrollArea.scrollPos = D2D1::Point2F(0, 0);
const vector<Item*>& passiveItem = ItemMgr::GetInstance()->GetPassiveItems();
wstring iconTag;
// 스크롤 내용 생성 (예: 여러 개의 아이템)
for (int i = 0; i < passiveItem.size(); ++i)
{
CSpriteUI* possessedItem = new CSpriteUI;
possessedItem->SetObjType(GROUP_TYPE::UI);
iconTag = passiveItem[i]->tag + L"_icon";
possessedItem->AddImage(pD2DMgr->GetStoredBitmap(iconTag));
int xCount = i % 7;
int yCount = i / 7;
possessedItem->SetPos(Vec2(35.f + xCount * 54.f, 27.f + yCount * 54.f));
possessedItem->SetScale(Vec2(50.f, 50.f));
possessedItem->SetBackGround(true);
possessedItem->SetBackGroundColor(ColorNormalize(30, 30, 30), ColorNormalize(0, 0, 0)
, ColorNormalize(30, 30, 30), ColorNormalize(0, 0, 0));
possessedItem->SetIsRound(true, 10.f, 10.f);
m_scrollContent.push_back(possessedItem);
}
}
void CScene_Run_End::UpdateScrollPosition(float deltaY)
{
m_scrollArea.scrollPos.y += deltaY;
m_scrollArea.scrollPos.y = max(0.f, min(m_scrollArea.scrollPos.y,
m_scrollArea.contentRect.bottom - (m_scrollArea.viewRect.bottom - m_scrollArea.viewRect.top)));
}
void CScene_Run_End::RenderScrollArea(ID2D1HwndRenderTarget* _pRender)
{
if (!_pRender) return;
//외부영역은 안 그리게
_pRender->PushAxisAlignedClip(m_scrollArea.viewRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
//변환 행렬
D2D1::Matrix3x2F transform = D2D1::Matrix3x2F::Translation(
m_scrollArea.viewRect.left - m_scrollArea.scrollPos.x,
m_scrollArea.viewRect.top - m_scrollArea.scrollPos.y
);
_pRender->SetTransform(transform);
for (auto& item : m_scrollContent)
{
//item->update();
item->finalupdate();
item->render(_pRender);
}
_pRender->SetTransform(D2D1::Matrix3x2F::Identity());
_pRender->PopAxisAlignedClip();
}
'WinApi > Brotato 모작' 카테고리의 다른 글
[Win32 API Brotato 모작] 11. Scene_Start (0) | 2025.03.21 |
---|---|
[Win32 API Brotato 모작] 9. Scene_Shop (0) | 2025.03.18 |
[Win32 API Brotato 모작] 8. Scene_Select_Weapon (0) | 2025.03.14 |
[Win32 API Brotato 모작] 7. Scene_Select_Character (0) | 2025.03.13 |
[Win32 API Brotato 모작] 6. Scene_Main (0) | 2025.03.13 |