35. 스물한번째 수업
경일게임아카데미 프로그래밍반 28기 21일차 수업 (2021. 05. 07)
삼각함수(COS, SIN)와 입사각 반사각
저번시간까지 원과 원, 원과 사각형의 충돌을 알아보았습니다. 오늘은 COS, SIN에 대하여 배워봅시다.
오늘의 수업은 총 2개의 주제를 가지고 있습니다.
1. 원의 이동각도를 사인, 코사인을 이용하여 각도를 변경하여 방향을 바꾸는 것.
2. ①을 활용하여 대포를 제작하고 대포의 각도를 조절하여 쏘는 방향을 바꾸는 것.
1의 playGround.h
#pragma once
#include "gameNode.h"
#define PI 3.14156f
struct tagObj
{
float x, y;
float angle;
float radius;
float speed;
};
class playGround : public gameNode
{
private:
tagObj _obj;
public:
playGround();
~playGround();
virtual HRESULT init();
virtual void release();
virtual void update();
virtual void render(HDC hdc);
};
1의 playGround.cpp
#include "stdafx.h"
#include "playGround.h"
playGround::playGround()
{
}
playGround::~playGround()
{
}
//초기화는 여기다 하세요 제발
HRESULT playGround::init()
{
gameNode::init();
_obj.x = WINSIZEX / 2;
_obj.y = WINSIZEY / 2;
_obj.radius = 50;
_obj.angle = 0;
return S_OK;
}
//메모리 해제는 여기다 하세요 제발
void playGround::release()
{
gameNode::release();
}
//여기에다 연산하세요 제에발
void playGround::update()
{
gameNode::update();
if (KEYMANAGER->isStayKeyDown(VK_LEFT)) _obj.angle += 0.04f;
if (KEYMANAGER->isStayKeyDown(VK_RIGHT)) _obj.angle -= 0.04f;
// * 3은 스피드 값=(R값)을 뜻한다.
_obj.x += cosf(_obj.angle) * 3;
_obj.y += -sinf(_obj.angle) * 3;
}
//여기에다 그려라 좀! 쫌!
void playGround::render(HDC hdc)
{
HDC backDC = this->getBackBuffer()->getMemDC();
PatBlt(backDC, 0, 0, WINSIZEX, WINSIZEY, WHITENESS);
// 위에 건들지마라
//================제발 이 사이에 좀 그립시다==========================
// 위치 재연산
EllipseMakeCenter(backDC, _obj.x, _obj.y, _obj.radius * 2, _obj.radius * 2);
//==================================================
//여기도 건들지마라
this->getBackBuffer()->render(hdc, 0, 0);
}
수업내용
.h 파일에는 딱히 특별한 것이 없다. 원의 X, Y좌표, 각도, 크기를 정할 반지름, 속도가 있다.
이를 .cpp 파일에서 VK_LEFT, RIGHT를 이용하여 앵글 값을 더하거나 빼준다.
이후 _obj.x에는 cosf(_obj.angle) 3(Speed)를 계속 더해준다
마찬가지로 _obj.y에는 -sinf(_obj.angle) 3(Speed)를 계속 더해준다.
중요 ✍
왜 여기서 -sinf를 사용할까?
아래 이미지를 참고하자.
일반적으로 sin는 그림에서 보는 것처럼 3시를 기준으로 시계방향으로 각도가 올라간다. 이로 인해 0, 90, 180, 270가 시계 방향으로 표시된다.
하지만 여기에 역수(-)를 취하게 되면 방향이 반대로 되어서 반시계 방향인 0, 90, 180, 270로 표시된다. (사진 참고)
이로 인해 sinf를 사용할 때 (역수)-를 붙여 사용하면 여러모로 사람이 이해하기 보다 편리하므로 역수(-)를 붙여 사용한다.
결과화면