League Of Legends - Link Select [winAPI 09] ๊ธฐ์ดˆ ์ˆ˜ํ•™
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/winAPI

[winAPI 09] ๊ธฐ์ดˆ ์ˆ˜ํ•™

by GAMEMING 2024. 6. 5.
728x90

 

 

 

์ €๋ฒˆ์— ๊ตฌํ˜„ํ•œ ๋ฏธ์‚ฌ์ผ์„ ๋งŒ์•ฝ ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด?

 

๋”๋ณด๊ธฐ

[ ์ฐธ๊ณ  ]

 

- ์›์ฃผ์œจ

 ์ง€๋ฆ„๊ณผ ์›์˜ ๋‘˜๋ ˆ์˜ ๋น„์œจ

 

- 3.14 ๋ผ๋””์•ˆ : 180๋„

- 1 ๋ผ๋””์•ˆ : 57๋„์ฏค. ์˜๋ฏธ → ๋ฐ˜์ง€๋ฆ„๊ณผ ํ˜ธ์˜ ๊ธธ์ด๊ฐ€ ๊ฐ™์€ ๊ฐ’

 

- ์‚ผ๊ฐํ•จ์ˆ˜ : ์ง๊ฐ ์‚ผ๊ฐํ˜•์—์„œ์˜ ๋ฐ‘๋ณ€/๋น—๋ณ€/๋†’์ด์˜ ๋น„์œจ

 

์šฐ๋ฆฌ๋Š” ์ €๋ฒˆ ์‹œ๊ฐ„์— ์œ„/์•„๋ž˜์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๋ฉด, ์ด๋ฅผ ๊ฐ๋„๋กœ ์ˆ˜์ •ํ•ด ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

// Missile.h

#pragma once
#include "Object.h"

class Missile : public Object {
private:
	float		theta;  // ๋ฐฉํ–ฅ์„ ๊ฐ๋„๋กœ

public:
	Missile();
	~Missile();

	virtual void update();
	virtual void render(HDC _hdc);

	void SetDir(float _th) { theta = _th; }
};


// Missile.cpp
#include "pch.h"
#include "Missile.h"

#include "TimeManager.h"

Missile::Missile()
	: theta(PI/2.f)	// PI๋Š” define.h์—์„œ ๋งคํฌ๋กœ๋กœ ๋งŒ๋“ค์–ด ๋†“์Œ
{
}

Missile::~Missile()
{
}

void Missile::update()
{
	Vec2 vPos = getPos();

	vPos.x += 600.f * cosf(theta) * fDT;
	vPos.y -= 600.f * sinf(theta) * fDT;

	setPos(vPos);
}

void Missile::render(HDC _hdc)
{
	Vec2 vPos = getPos();
	Vec2 vScale = getScale();

	Ellipse(_hdc, (int)(vPos.x - vScale.x / 2.f), (int)(vPos.y - vScale.y / 2.f),
		(int)(vPos.x + vScale.x / 2.f), (int)(vPos.y + vScale.y / 2.f));
}

 

 

์ญ? ์–ด์งธ์„œ ๊ฐ‘์ž๊ธฐ ์—ฌ๊ธฐ์„œ sin, cos๊ฐ€ ๋‚˜์˜ฌ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ๋Œ€๊ฐ์„ ์œผ๋กœ 10์„ ์ด๋™ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž. ์ด๋•Œ x์ถ•์œผ๋กœ 10, y์ถ•์œผ๋กœ 10์œผ๋กœ ์ด๋™ํ•˜๋ฉด ํ”ผํƒ€๊ณ ๋ผ์Šค ์ •๋ฆฌ์— ์˜ํ•ด ๋Œ€๊ฐ์„ ์€ ์ด ๋‘ ์„ ๋ณด๋‹ค ๊ธธ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ ๋ฌผ์ฒด๋Š” ์‹ค์ œ๋กœ 10๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

์ด ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ๋„(๋ผ๋””์•ˆ)์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋” ๋ฐ”๊พธ์–ด์•ผ ํ•œ๋‹ค.

 

 

๋Œ€๊ฐ์„  ๊ธธ์ด๊ฐ€ 1์ผ ๋•Œ x์ถ•์˜ ๊ธธ์ด๋Š” cosΘ, y์ถ• sinΘ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„๋‹ค. ๋”ฐ๋ผ ๋Œ€๊ฐ์„ ์œผ๋กœ ๊ฐ€๊ณ ์ž ํ•˜๋Š” ๊ธธ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ๊ฐ๊ฐ ํ•ด๋‹น ๊ฐ๋„์˜ sin๊ณผ cos์„ ๊ณฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

๊ทธ๋ž˜์„œ ์•„๋ž˜์˜ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค

 

 

 

45๋„ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋ ค๋ฉด ๊ฐ๋„๋ฅผ theta(PI/4.f), ์œ„๋กœ ๊ฐ€๋ ค๋ฉด theta(PI/2.f)๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

 

 

theta(PI/4.f)

 

 

 


 

 

 

์‚ผ๊ฐํ•จ์ˆ˜ ๋ง๊ณ  ๋” ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ?

๋ฐ”๋กœ ๋ฒกํ„ฐ(vector)๋‹ค.

 

๋ฒกํ„ฐ vs ์Šค์นผ๋ผ

์Šค์นผ๋ผ๋Š” ์ˆœ์ˆ˜ํ•œ ๊ฐ’์„ ์˜๋ฏธ, ๋ฒกํ„ฐ๋Š” ํฌ๊ธฐ(๊ฐ’)์™€ ๋ฐฉํ–ฅ์„ ์˜๋ฏธํ•œ๋‹ค. ํ˜„์žฌ struct.h ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Vec2 ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ ํ‰๋ฉด์—์„œ์˜ ์œ„์น˜๊ฐ’์„ ์˜๋ฏธํ•˜๊ณ  ์žˆ๋‹ค.

 

๋Œ€๊ฐ์„ ์ด ๋ฌผ์ฒด๊ฐ€ ๋‚˜์•„๊ฐˆ ๋ฐฉํ–ฅ์ด ๋˜๋Š”๋ฐ ๊ทธ ๋ฐฉํ–ฅ์˜ ๊ธธ์ด๋งŒํผ ๊ฐ€๊ธฐ ์œ„ํ•ด x์™€ y๋ฅผ ์–ผ๋งˆ๋‚˜ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๋Š”๊ฐ€๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

์ด๋•Œ ๋ฐฉํ–ฅ์˜ ํฌ๊ธฐ(๋Œ€๊ฐ์„ ์˜ ๊ธธ์ด)๋ฅผ 1๋กœ ์ •๊ทœํ™” ์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ •๊ทœํ™” ์ž‘์—…์€ ๊ฐ x์™€ y ๊ฐ’์„ ํ”ผํƒ€๊ณ ๋ผ์Šค ์ •๋ฆฌ์— ์˜ํ•ด ๊ฐ ๊ธธ์ด ์ œ๊ณฑ์˜ ๋ง์…ˆ์˜ ์ œ๊ณฑ๊ทผ์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ๋œ๋‹ค.

 

 

 

// struct.h

	float Length()
	{
		return sqrt(x * x + y * y);
	}

	Vec2& Normalize()
	{
		float len = Length();
		
		assert(len != 0.f);

		x /= len;
		y /= len;

		return *this;
	}
// Missile.h

class Missile : public Object {
private:
	float		theta;  
	Vec2		dir;	// ๋ฐฉํ–ฅ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค

public:
	Missile();
	~Missile();

	virtual void update();
	virtual void render(HDC _hdc);

	void SetDir(float _th) { theta = _th; }
	void SetDir(Vec2 _dir)
	{
		dir = _dir;
		dir.Normalize();
	}
};


// Missile.cpp
Missile::Missile()
	: theta(PI/4.f)
	, dir(Vec2(1.f, 1.f))
{
	dir.Normalize();
}

void Missile::update()
{
	Vec2 vPos = getPos();

	//vPos.x += 600.f * cosf(theta) * fDT;
	//vPos.y -= 600.f * sinf(theta) * fDT;

	vPos.x += 600.f * dir.x * fDT;
	vPos.y += 600.f * dir.y * fDT;

	setPos(vPos);
}


// Player.cpp
void Player::CreateMissile()
{
	Vec2 missilePos = getPos();
	missilePos.y -= getScale().y / 2.f;

	Missile* missile = new Missile;
	missile->setPos(missilePos);
	missile->setScale(Vec2(25.f, 25.f));
	missile->SetDir(Vec2(-1.f, -7.f));	// ์—ฌ๊ธฐ์„œ๋„ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

	Scene* curScenes = SceneManager::Instance()->GetCurScene();
	curScenes->AddObject(missile, GROUP_TYPE::DEFAULT);
}

 

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

[winAPI 11] Resource Manager  (0) 2024.06.06
[winAPI 10] Resource & Path Manager  (1) 2024.06.06
[winAPI 08] Object  (0) 2024.06.05
[winAPI 07] Scene & Scene Manager  (1) 2024.06.04
[winAPI 06] Key Manager  (1) 2024.06.04