์ ๋ฒ์ ๊ตฌํํ ๋ฏธ์ฌ์ผ์ ๋ง์ฝ ๋๊ฐ์ ์ผ๋ก ์ด๋ํ๋ ค๋ฉด?
[ ์ฐธ๊ณ ]
- ์์ฃผ์จ
์ง๋ฆ๊ณผ ์์ ๋๋ ์ ๋น์จ
- 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)๋ก ํ๋ฉด ๋๋ค.
์ผ๊ฐํจ์ ๋ง๊ณ ๋ ์ข์ ์ ๊ทผ ๋ฐฉ๋ฒ์ด ์์๊น?
๋ฐ๋ก ๋ฒกํฐ(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 |