WIN32 Camera, Tile

Date:     Updated:

카테고리:

태그:

17일차

- Default
    - Client.h
    - framework.h
    - Resouce.h
    - targetver.h
- Engine
    1. Header
        **1. define.h**
        2. struct.h
        3. func.h
        4. func.cpp
        **5. global.h**
    2. Core
        1. CCore.cpp
 ****       2. CCore.h
    3. Manager
        1. KeyMgr
            1. CkeyMgr.cpp
            2. CkeyMgr.h
        2. TimeMgr
            1. CTimeMgr.cpp
            2. CTimeMgr.h
        3. SceneMgr
            1. CSceneMgr.cpp
            2. CSceneMgr.h
    		4. PathMgr
						1. CPathMgr.cpp
						2. CPathMgr.h
				5. ResMgr
						1. CResMgr.cpp
						2. CResMgr.h
	****			6. CollisionMgr
						1. CCollisionMgr.cpp
						2. CCollisionMgr.h
				7. EventMgr
						1. CEventMgr.cpp
****						2. CEventMgr.h
				**8. Camera
						1. CCamera.cpp
						2. CCamera.h**
    4. Object
		    1. Monser
			    1. CMonster.cpp
			    2. CMonster.h
			  2. Missle
				  1. Missile.cpp
				  2. Missile.h
****				3. Player
					1. CPlayer.cpp
					2. Cplayer.h
				**4. Tile
					1. CTile.cpp
					2. CTile.h**
        1. CObject.cpp
        2. CObject.h
    5. Scene
        1. Scene_Start
            1. CScene_Start.cpp
            2. CScene_Start.h
        **2. Scene_Tool
		        1. CScene_Tool.cpp
		        2. CScene_Tool.h**
        3. CScene.cpp
        4. CScene.h
    6. Resource
		    1. Sound
		    2. Texture
			    1. CTexture.cpp
				  2. CTexture.h
		    3. CRes.cpp
		    4. CRes.h
		7. Component
				1. Collider
					1. CCollider.cpp
					2. CCollider.h
				2. Animator
					1. Animation
						1. CAnimation.cpp
						2. CAnimation.h
					1. CAnimator.cpp
					2. CAnimation.h
		8. Module
				1. SelectGDI.cpp
				2. SelectGDI.h
- 리소스 파일
- main.cpp
**- pch.h.**
  • 전체적으로 카메라 위주였다! 그리고 카메라 위주 렌더링 방식으로 바뀌었다!
  1. pch.h, global.h
    • 미리 컴파일 된 옵션을 뺴고, global.h에 pch.h에 있는 걸 전부 옮겼다. pch.h에는 global.h만 인클루드 했다. Unity Build를 사용했는데, 나는 어떻게 해도 무반응이라서… 일단 포기했다.
  2. define.h

#define TILE_SIZE 64
  1. CCamera.h
#pragma once

class CObject;
class CCamera
{

	SINGLE(CCamera)

private:
	//그릴때만 현재 카메라의 좌표에 따라서 계산해서 찍힌다.
	//충돌 자체는 본 좌표계에 그대로. 

	Vec2			m_vLookAt;			//카메라가 보는 위치
	Vec2			m_vCurLookAt;		//이전 위치와 현재 위치 보간. 
	Vec2			m_prevLookAt;		//카메라가 보는 이전 프레임 위치. 
	

	CObject*		m_pTargetObj;		//카메라 타켓 오브젝트 <- 카메라가 해당 타겟을 쫒아다님. 

	Vec2			m_vDiff;			//해상도 중심위치와, 카메라 LootAt간의 차이 값. 
	float			m_fTime;			// 타겟을 따라가는데 걸리는 시간. 
	float			m_fSpeed;			//타겟을 따라가는 속도. 
	float			m_fAccTime;			//누적 시간. 

public:
	void SetLookAt(Vec2 _vLook) { 
		m_vLookAt = _vLook; 
		float fmoveDistance = (m_vLookAt - m_prevLookAt).Length();
		m_fSpeed = fmoveDistance / m_fTime;
		m_fAccTime = 0.f;
	
	}
	void SetTarget(CObject* _pTarget) { m_pTargetObj = _pTarget; }

	Vec2 GetLookAt() { return m_vCurLookAt; }
	Vec2 GetRenderPos(Vec2 _vObjPos) {
		return _vObjPos - m_vDiff;
	}

	Vec2 GetRealPos(Vec2 _vRenderPos) { { return _vRenderPos + m_vDiff; } }

public:
	void update();

private:
	void CalDiff();
};

  1. CCamera.cpp
#include "pch.h"
#include "CCamera.h"

#include "CObject.h"
#include "CCore.h"
#include "CkeyMgr.h"
#include "CTimeMgr.h"

CCamera::CCamera() 
	: m_pTargetObj(nullptr)
	, m_fTime(0.5f)
	, m_fSpeed(0.f)
	, m_fAccTime(0.5f)

{

}

CCamera::~CCamera() {

}

void CCamera::update()
{
	if (m_pTargetObj != nullptr) {
		if (m_pTargetObj->IsDead()) m_pTargetObj = nullptr;
		m_vLookAt = m_pTargetObj->GetPos();
	}
	
	if (KEY_HOLD(KEY::UP)) {
		m_vLookAt.y -= 500.f * fDT;
	}
	if (KEY_HOLD(KEY::DOWN)) {
		m_vLookAt.y += 500.f * fDT;
	}
	if (KEY_HOLD(KEY::RIGHT)) {
		m_vLookAt.x += 500.f * fDT;
	}
	if (KEY_HOLD(KEY::LEFT)) {
		m_vLookAt.x -= 500.f * fDT;
	}

	//화면 중앙좌표와 카메라 LootAt 좌표간의 차이 값. 
	CalDiff();

}

void CCamera::CalDiff()
{
	//이전 LookAt과 현재 Look의 차이값을 보정해서 현재의 LookAt을 구한다.
	//방향 벡터.

	m_fAccTime += fDT;
	if (m_fAccTime >= m_fTime) {
		m_vCurLookAt = m_vLookAt;
	}
	else {
		Vec2 vLookDir = m_vLookAt - m_prevLookAt;
		m_vCurLookAt = m_prevLookAt + vLookDir.Normalize() * m_fSpeed * fDT;
	}

	Vec2 vResolution = CCore::GetInstance()->GetResolution();
	Vec2 vCenter = vResolution / 2;

	//
	m_vDiff = m_vCurLookAt - vCenter;
	m_prevLookAt = m_vCurLookAt;
}

  • update마다 Diff를 계산해서, 눈으로 보는 좌표와 실제 좌표의 차이를 구한다.
  • 그 후, 오브젝트가 Render할때는 GetRenderPos를 사용해서 렌더링 한다.
  1. CTile.h
#pragma once
#include "CObject.h"

class CTexture;
class CTile :
    public CObject
{

private:
    CTexture*       m_pTileTex;
    int             m_iIdx;

public:
    void SetTexture(CTexture* _pTex) {
        m_pTileTex = _pTex;
    }

private:
    virtual void update();
    virtual void render(HDC _dc);
    CLONE(CTile);
public:
    CTile();
    ~CTile();
};

  1. CTile.cpp
#include "pch.h"
#include "CTile.h"

#include "CTexture.h"

CTile::CTile()
	: m_pTileTex(nullptr)
	, m_iIdx(3)
{
	SetScale(Vec2(TILE_SIZE, TILE_SIZE));
}

CTile::~CTile()
{

}

void CTile::update()
{

}

void CTile::render(HDC _dc)
{

	if (m_pTileTex == nullptr || -1 == m_iIdx) {
		return;
	}

	UINT iWidth = m_pTileTex->Width();
	UINT iHeight = m_pTileTex->Height();

	UINT IMaxCol = iWidth / TILE_SIZE;
	UINT IMaxRow = iHeight / TILE_SIZE;

	UINT iCurRow = (UINT)(m_iIdx / IMaxCol);
	UINT iCurCol = (UINT)(m_iIdx % IMaxCol);

	Vec2 vRenderPos = CCamera::GetInstance()->GetRenderPos(GetPos());
	Vec2 vScale = GetScale();

	if (IMaxRow <= iCurRow) {
		assert(nullptr);
	}
	
	BitBlt(_dc,
		(int)(vRenderPos.x),
		(int)(vRenderPos.y),
		(int)(vScale.x),
		(int)(vScale.y),
		m_pTileTex->GetDC(),
		iCurRow * TILE_SIZE,
		iCurCol * TILE_SIZE,
		SRCCOPY);
}

  • 타일이고, 인터넷에 널린 bmp파일을 받아다가 사용했다.
  • 64 * 64기준인데, 뭐… 커스텀할 수 있다.
  1. CScene_Tool.h
#pragma once
#include "CScene.h"

class CScene_Tool :
    public CScene
{
private:

public:
    virtual void update();
    virtual void Enter();
    virtual void Exit();
    

public:
    CScene_Tool();
    ~CScene_Tool();
};

  1. CScene_Tool.cpp
#include "pch.h"
#include "CScene_Tool.h"
#include "CkeyMgr.h"
#include "CSceneMgr.h"
#include "CTile.h"
#include "CCore.h"
#include "CResMgr.h"

CScene_Tool::CScene_Tool()
{

}

CScene_Tool::~CScene_Tool()
{

}

void CScene_Tool::Enter()
{

	CTexture* pTileTex = CResMgr::GetInstance()->LoadTexture(L"Tile", L"texture\\tera2.bmp");
	//타일 생성

	for (int tileIDX = 0; tileIDX < 5; tileIDX++) {
		for (int tileJDX = 0; tileJDX < 5; tileJDX++) {
			CTile* pTile = new CTile();

			pTile->SetPos(Vec2((float)(tileJDX * TILE_SIZE), (float)(tileIDX * TILE_SIZE)));
			pTile->SetTexture(pTileTex);

			
			AddObject(pTile, GROUP_TYPE::TILE);
		}
	}

	Vec2 vResolution = CCore::GetInstance()->GetResolution();
	//Camera Look 지점.
	CCamera::GetInstance()->SetLookAt(vResolution / 2.f);
}

void CScene_Tool::Exit()
{

}

void CScene_Tool::update()
{
	//부모쪽 기능 호출. 
	CScene::update();

}

  • 그 이외 오브젝트는 깃허브에 올라갈 소스를 봐주시길! 사실 별 건 없다.

WINAPI 카테고리 내 다른 글 보러가기

댓글 남기기