학원/경일게임아카데미

35. 스물한번째 수업

셩잇님 2023. 1. 13. 02:01
반응형

경일게임아카데미 프로그래밍반 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를 사용할 때 (역수)-를 붙여 사용하면 여러모로 사람이 이해하기 보다 편리하므로 역수(-)를 붙여 사용한다.

 

 

 


 

 

 

결과화면

 

 

 

 

 

반응형