๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

Camera

by eazuooz 2022. 10. 4.

์˜ˆ์ œ :)

https://github.com/eazuooz/WindowAPI/commit/f6b865acb40a78dbbbdb14e8210544089b24c8b9

 

Camera · eazuooz/WindowAPI@f6b865a

Show file tree Showing 17 changed files with 229 additions and 84 deletions.

github.com

 

๊ฒŒ์ž„์—์„œ๋Š” ์นด๋ฉ”๋ผ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ถ€๋ถ„๊ณผ ์‹ค์ œ ๊ฒŒ์ž„์˜ ์›”๋“œ ์˜์—ญ์€ ๋‹ค๋ฅด๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์นด๋ฉ”๋ผ์˜ ์œ„์น˜๋‚˜ ์›€์ง์ž„์— ๋”ฐ๋ผ์„œ ํ™”๋ฉด์— ๋ณด์ด๋Š” ์˜์—ญ์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์นด๋ฉ”๋ผ๋Š” ๊ฒŒ์ž„์—์„œ

๊ผญ ํ•„์š”ํ•œ  ์กด์žฌ์ด๋‹ค.

 

Camera๋Š” ํ™”๋ฉด์˜ ํ•ด์ƒ๋„์™€ ์นด๋ฉ”๋ผ๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ์ขŒํ‘œ, ํ™”๋ฉด ํ•ด์ƒ๋„ ์ค‘์‹ฌ ์ขŒํ‘œ์™€ ํ˜„์žฌ ์นด๋ฉ”๋ผ Look ๊ฐ„์˜ ์ฐจ์ด๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

	class Object;
	class Camera
	{
	public:
		static void Initialize();
		static void Tick();

		static Vector2 CalulatePos(Vector2 pos) { return pos - mDistance; }
		static void SetTarget(Object* object) { mTarget = object; }

	private:
		Camera() = delete;
		~Camera() = delete;

	private:
		static Size mResolution;		// ํ™”๋ฉด ํ•ด์ƒ๋„
		static Vector2 mLookPosition;  // ์นด๋ฉ”๋ผ๊ฐ€ ๋ณด๊ณ ์žˆ๋Š” ์ขŒํ‘œ
		static Vector2 mDistance;		// ํ™”๋ฉด ํ•ด์ƒ๋„ ์ค‘์‹ฌ ์ขŒํ‘œ์™€ ํ˜„์žฌ ์นด๋ฉ”๋ผ Look ๊ฐ„์˜ ์ฐจ์ด

		static Object* mTarget;
	};

 

์นด๋ฉ”๋ผ๊ฐ€ ํ™”๋ฉด ๊ฐ€์šด๋ฐ๋ฅผ ๋ณด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์ค‘๊ฐ„์ขŒํ‘œ๋ฅผ ๊ตฌํ•ด์•ผํ•œ๋‹ค.

Win32 ์ขŒํ‘œ๊ณ„๋Š” ์ขŒ์ƒ๋‹จ์ด 0,0 ์ด๊ธฐ๋–„๋ฌธ์— ์นด๋ฉ”๋ผ๋ฅผ ํ™”๋ฉด ํ•ด์ƒ๋„์˜ ์ ˆ๋ฐ˜๋งŒํผ ์ด๋™ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

	void Camera::Initialize()
	{
		WindowData winData = Application::GetInstance().GetWindowData();
		mResolution.y = winData.height; 
		mResolution.x = winData.width;
		mLookPosition = (mResolution / 2.0f);

	}
	void Camera::Tick()
	{
		// ์‹œ๊ฐ„ ๋™๊ธฐํ™”
		if (KEY_PREESED(KEY_CODE::UP))
		{
			mLookPosition.y -= Time::DeltaTime() * 500.0f;
		}

		if (KEY_PREESED(KEY_CODE::DOWN))
		{
			mLookPosition.y += Time::DeltaTime() * 500.0f;
		}

		if (KEY_PREESED(KEY_CODE::LEFT))
		{
			mLookPosition.x -= Time::DeltaTime() * 500.0f;
		}

		if (KEY_PREESED(KEY_CODE::RIGHT))
		{
			mLookPosition.x += Time::DeltaTime() * 500.0f;
		}

		if(mTarget != nullptr)
			mLookPosition = mTarget->GetPos();

		mDistance = mLookPosition - (mResolution / 2.0f);
	}

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ Object๋“ค์˜ ๋ Œ๋”๋ง ์ขŒํ‘œ๋“ค์„ ๊ณ„์‚ฐํ• ๋•Œ  Camera์ขŒํ‘œ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ ์ขŒํ‘œ๋ฅผ ์„ธํŒ…ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์‹ค์ œ ์นด๋ฉ”๋ผ๊ฐ€ ํ™”๋ช… ์ค‘์‹ฌ ์ขŒํ‘œ ๊ธฐ์ค€์œผ๋กœ ์ด๋™ํ•œ ๊ฑฐ๋ฆฌ๋งŒํผ ์šฐ๋ฆฌ ๋ฌผ์ฒด๋“ค๋„ ๊ทธ๊ฑฐ๋ฆฌ๋งŒํผ ๋บด์ค€ ๊ฐ’์œผ๋กœ ๋‹ค์‹œ ์ขŒํ‘œ๋ฅผ ์„ธํŒ…ํ•ด์ฃผ๋ฉด๋œ๋‹ค.

	// ์นด๋ฉ”๋ผ ๊ธฐ์ค€ ์ขŒํ‘œ ๊ณ„์‚ฐ
    static Vector2 CalulatePos(Vector2 pos) { return pos - mDistance; }
    
    void Player::Render(HDC hdc)
	{
		Image* pImage 
			= Resources::Load<Image>(L"PlayerImage", L"..\\Resources\\Images\\Fighter.bmp");
		if (nullptr == pImage)
			return;

		Vector2 vPos = GetPos();
		vPos = Camera::CalulatePos(vPos);
		TransparentBlt(hdc, (int)vPos.x - pImage->GetWidth() / 2
			, (int)vPos.y - pImage->GetHeight() / 2
			, pImage->GetWidth(), pImage->GetHeight()
			, pImage->GetDC(), 0, 0, pImage->GetWidth(), pImage->GetHeight(), RGB(255, 0, 255));

		Object::Render(hdc);
	}

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Object Delete  (0) 2022.10.12
Alphablend, Camera Effect  (0) 2022.10.05
Collider Manager  (1) 2022.09.30
Collider  (0) 2022.09.27
Component  (0) 2022.09.26

๋Œ“๊ธ€