C++ 입력 시스템 설계: Polling에서 Event 구조로 확장하기

📚 입력 시스템 시리즈


//
//

🚀 들어가며

이전 글에서는 키 입력을 단순히 확인하는 것을 넘어서,

Pressed
Held
Released

세 가지 상태를 구분하는 방법을 구현해봤습니다.

하지만 여기서 한 가지 문제가 남아 있습니다.

❓ 입력 처리가 게임 코드 곳곳에 흩어지지 않게 하려면?
❓ 특정 객체만 입력을 받게 하려면?
❓ 입력을 이벤트처럼 처리하려면?

이번 글에서는 Polling 방식의 입력을
👉 이벤트 기반 구조(Event System)로 확장하는 방법을 살펴보겠습니다.


🎯 현재 구조의 문제

지금까지 구현한 구조는 다음과 같습니다.

if (input.IsJumpPressed())
{
    Jump();
}

이 방식은 간단하고 직관적이지만, 문제가 있습니다.

입력 처리 코드가 게임 로직에 직접 연결됨
↓
코드가 여러 곳에 분산됨
↓
확장 어려움

//

🎯 해결 방향

입력 처리 구조를 다음과 같이 바꿉니다.

입력 감지
↓
이벤트 발생
↓
등록된 함수 실행

즉,
👉 입력을 “직접 처리”하지 않고
👉 “이벤트로 전달”하는 구조입니다.


🧠 이벤트 구조 기본 개념

이 구조는 매우 단순합니다.

입력 발생
↓
OnJump 이벤트 호출
↓
등록된 함수 실행

🎮 델리게이트와 연결

이제 이전에 구현했던 델리게이트를 활용할 수 있습니다.

Delegate OnJump;

입력 시스템에서는 이렇게 사용합니다.

if (input.IsJumpPressed())
{
    OnJump.Broadcast();
}

이제 입력 시스템은 “무슨 일이 일어나는지” 모릅니다.

단순히 이벤트만 발생시킵니다.


🎯 게임 객체에서 입력 처리

이제 실제 게임 로직은 이렇게 작성됩니다.

class Player
{
public:
    void Jump()
    {
        std::cout << "Player Jump\n";
    }
};
Player player;

OnJump.Add([&player]()
{
    player.Jump();
});

이 구조의 핵심은 다음입니다.

입력 시스템
↓
이벤트 발생
↓
Player 반응

🔥 무엇이 달라졌나?

기존 구조:

입력 → 바로 함수 호출

변경된 구조:

입력 → 이벤트 → 객체 반응

👉 완전히 다른 구조입니다.


🎯 장점

  • 입력과 게임 로직이 분리된다
  • 여러 객체가 하나의 입력에 반응할 수 있다
  • 확장성이 좋아진다
  • 엔진 구조와 동일한 형태가 된다

🧠 전체 흐름 정리

GetAsyncKeyState
↓
Input System
↓
Pressed 판별
↓
Delegate Broadcast
↓
Game Object 실행

이 구조가 바로 게임 엔진 입력 시스템의 기본 형태입니다.


🎯 핵심 정리

  • Polling 방식 입력은 이벤트 구조로 확장할 수 있다
  • 입력 시스템은 이벤트만 발생시키는 역할을 한다
  • 실제 로직은 델리게이트를 통해 연결된다
  • 입력과 게임 로직을 분리하는 것이 핵심이다

이 구조를 이해하면
게임 엔진의 입력 시스템과 이벤트 흐름이 어떻게 연결되는지 보이기 시작합니다.


🎮 마무리

입력 시스템은 단순히 키를 읽는 코드가 아니라,

👉 사용자 행동을 게임 객체로 전달하는 구조입니다.

이 구조를 이해하면 게임 엔진의 설계 방식이 자연스럽게 보이기 시작합니다.


🚀 한 단계 더 나아가고 싶다면

입력 시스템, 델리게이트, 게임 루프는 모두 하나의 흐름으로 연결됩니다.

👉 게임 엔진 구조를 더 깊이 이해하고 싶다면

아래 강의를 통해 직접 구현해보는 것을 추천드립니다.

C++로 만드는 게임 엔진 프레임워크 강의

👉 C++로 만드는 게임 엔진 프레임워크 강의 바로가기

단순히 사용하는 것을 넘어서,
엔진이 어떻게 동작하는지 이해하는 데 초점을 맞춘 내용입니다.

//
   

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다