ref. 추락 여고생과 폐인 교사
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
간단한 중력만 구현해보려고 했지만 어쩌다보니 생명주기를 만들게 된 나..
전방선언은 신이 아니였다
전에 전방선언에 대해 생각했었습니다. 주로 컴파일 중복을 피해서 빌드 속도를 올리려고 사용하는데..
물론 중요한 개념이지만 포인터가 강제된다는 단점이 크게 걸리더라고요
그래서 포인터가 아니여야하는 부분을 억지로 적용하는 게 더 맞지 않아보여 이런저런 시도후 다시 수정했습니다
너무 빨라요;;
이번에도 너무 빨라서 문제가 발생했습니다
저번에는 WaitEvent를 이용해서 랜더링을 이벤트마다 실행시키도록 했었죠
하지만 이번에 했던 프로젝트는 이벤트 없이도 계속 돌아가야하기 때문에 WaitEvent를 사용하지 못했습니다
그렇기에 이번에도 cpu와 gpu를 예상 이상으로 먹게되어 결국 명시적으로 1ms의 딜레이를 주었습니다
SDL_Delay(1); //이거 한줄로 방어가 되네;;
Vector2햄.. 그립읍니다...
struct Vector2 {
float x;
float y;
};
이것만 필요하다면 얼마나 좋을까요...
사각형에는 두가지가 필요했습니다
1. Position
2. Velocity
기본적으로 Position에 값을 대입하여 이동하진 않고, Velocity값에 따라 이동합니다
물론 이 두 데이터를 float px, py, vx, vy로 할 수는 있지만, 이왕 2차원의 백터값 및 좌표를 사용해야하기에 Vector2를 만들기로 했습니다
연산자 오버로딩을 통해 제 자료형을 위한 연산을 다시 만들어야합니다
기본적으로 필요한 연산자는
=, +, -. *, /, ==, != 정도로 정했습니다
이 중에서 깊게 살펴볼거는 =연산자입니다
=은 대입 연산자로 칭하며 우측값을 좌측값에 대입할 때 사용되죠
추후 기회가 된다면 좌측값, 우측값을 다루겠지만 일단 계속하자면 우측값은 좌측값일 수도 있고 임시값일 수도 있습니다
따라서 2개의 상황에 전부 대응하기 위해 2개의 대입 연산자를 필요로하죠
Vector2& operator=(const Vector2& other); //복사 대입 연산자 (주로 좌측값)
Vector2& operator=(Vector2&& other); //이동 대입 연산자 (주로 임시값)
연산자를 커스텀할 수 있으니 나중에는
#define UP 1
#define DOWN 2
Vector2 dir = Vector(0, 1);
if(dir == UP) {
//dss
}
요런 것도 가능하겠네요 흐흐
하지만 대입 연산자만 존재해서는 아무것도 되지 않았습니다
왜 안되나 찾아보니 "복사 생성자"랑 "이동 생성자" 요놈들이 없다고하네요?
역시 쉽지 않은 C++의 세계였습니다
Vector2(const Vector2& other) = default; //복사 생성자
Vector2(Vector2&& other) = default; //이동 생성자
간단하게는 데이터를 우측값으로 사용하기 위해 필요하다고 이해했습니다
좌측값과 우측값에 대한 내용은 따로 다루는 게 좋겠네요
돌고돌아 그 녀석들
사각형이 물리적으로 움직이기 위해서는 일정 주기마다 연산을 진행하는 FixedUpdate가 필요합니다
하지만 FixedUpdate는 고정주기라 입력이랑은 맞지 않습니다
그럼 뭐다?
둘 다 구현한다~
Update야 뭐 프레임마다니까 while문에 그냥 넣었습니다
FixedUpdate는 따로 시간을 설정해 20ms마다 체크하도록 하였습니다
#define FIXED_DELTATIME 20.0f
//while문 내부
m_currentFrameTime = SDL_GetTicks();
m_deltaTime = m_currentFrameTime - m_previousFrameTime;
if (m_deltaTime > 250) m_deltaTime = 250; // 큰 지연 방지
m_previousFrameTime = m_currentFrameTime;
m_accumulatedTime += m_deltaTime;
if (m_accumulatedTime >= FIXED_DELTATIME) {
FixedUpdate(FIXED_DELTATIME / 1000.0f);
m_accumulatedTime -= FIXED_DELTATIME;
}
뉴턴의 사과
마지막으로는 중력을 다루겠습니다
중학교때 배운 중력상수 9.81!!!를 고정주기마다 -하면 되겠지 했습니다만
SDL 윈도우 좌표계는 좌픅 상단이 0,0이라는 변수가 있었죠
그냥 빼니까 위로 역류하는 상황이;;
뭐 어쨌든 바꿔넣었습니다
추가로 중력은 물리연산이므로 FixedUpdate에서 실행했습니다
마무리
어쩌다보니 게임 루프 자체를 만들게 되었네요
이왕 이렇게 된거 작은 2D 게임엔진 하나 도전해볼까합니다
ㅎㅔ헤
▶ 더 공부해야할 것
에셋 관리 방법(텍스처, 사운드 등)
빌드 및 배포
SDL라이브러리 자체
Entity Component System
Occulusion Culling
'프로젝트 회고록' 카테고리의 다른 글
| Depth 양은 알 수가 없어 (0) | 2026.04.25 |
|---|---|
| 지뢰인가요? SDL양 (0) | 2025.04.08 |