2009-10-24 2 views
2

저는 지금 C++로 프로그래밍을 해왔으며 지금은 구문에 익숙합니다. 나는 카드 게임을 만들기 위해 알레그로를 사용하려고 노력하고있다. 나는 게임 논리를 위해 내가해야 할 모든 것을 이해하고 그렇지 않다. 나를 괴롭히는 것은 게임을하는 방법입니다. 나는 루프 기반 응용 프로그램에 익숙하다. VB에서 이벤트 기반 프로그래밍에 익숙해졌습니다. 나는 예를 들어 플레이어를 바꾸고 if와 bool을 많이 사용하지 않고 "이벤트"를 올리는 적절한 방법을 확신하지 못합니다. 또한 지금 당장 나는 어떤 카드가 있는지 확인하는 bool 배열을 가지고있다. 그리고 내 게임은 매번 모든 부울 배열을 반복하며 나에게는 지저분 해 보입니다. 또한 내 메뉴 루프에서 내 설정 루프로 이동하려면 큰 bool없이 어떻게해야합니까? 감사합니다.게임 프로그래밍 구조

+1

큰 bool 뭐죠? '긴 긴 bool'? ;) –

답변

5

대부분의 게임 프레임 워크는 (그들 모두가 루프에서 호출)를 구현해야하는 두 가지 방법을 제공합니다

  • 업데이트를
  • 그리기

Update은 사용자 입력, 상태 변경, 인터벌 작업 등을 확인해야하는 모든 것을 넣어야하는 곳입니다. 예를 들어 Physics, Butto nPressed 등이 있습니다. 여기서 이벤트로 작업하는 것을 방해하지 않습니다 (BoostLibrary Signals을보십시오).

void Game::update() { 
    if(pushedButton) { 
     this->cardsOnTable->add(this->hand->remove(0)); 
     this->activePlayer = nextPlayer(); 
    } 
} 

Draw은 현재 기본 상태를 화면에 표시해야합니다. 따라서 기본 상태/모델에 쉽게 액세스 할 수 있도록해야합니다.

void Game::render() { 
    this->table->render(); 
    this->cardsOnTable->render(); 
    this->hand->render(); 
    // ... 
    flipBuffers(); 
} 

당신은 Scenes와 메뉴/SettingsMenu 문제를 해결할 수 있으며, SceneManager (스택 될 수 있음). 따라서 논리를 Game에 직접 입력하는 대신 Scenes에 입력하십시오. 또한 Manager에서 /로 장면을 밀거나 팝 할 수 있습니다.

void Game::update() { 
    this->sceneManager->activeScene->update(); 
} 

void MenuScene::update() { 
    if(settingsMenuItemSelected) { 
    game->sceneManager->push(new SettingsMenuScene)); 
    // now the next time Game::update() is called 
    // the active scene of the SceneManager will be 
    // the settings menu. And once it is closed/cancelled 
    // it will pop itself from the manager and we are back 
    // in the regular menu 
    } 
} 

당신이 더 많은 고급 물건을 시작하려면, 당신은 거대한 목록에 "이벤트"를 저장하고 Game::update 방법을 입력 할 때 모든 이벤트를 발생을 시도 할 수 있습니다 -이 VB는 '당신이 할 수 있는지 확인합니다 어떻게 UI 스레드가 아닌 다른 스레드에서 컨트롤을 수정 -하지만이 C++ 사용하여 할 것이라고 생각하지 않습니다.

0

이들은 많은 질문입니다. 나의 첫 번째 제안은 비슷한 게임에 대한 온라인 소스 코드를 찾는 것입니다. 코드에 대한 도움이 필요한 경우 질문과 함께 게시하십시오.

0

당신은 가장 가능성 IFS의 무리가 필요하고 이런 식가는 루프 :

while(1){ 
    initYourLevel(); 
    while(levelNotOver){ 
    //do things 
    } 
} 

그런 다음 모든 당신이 뭘 하려는지 따라 달라집니다 귀하의 질문이 나에게 가지 흐릿하다. tutorials을보고 사람들이 일하는 방식에 대해 머리를 감싸십시오. 거기에 많은 샘플 코드가 있습니다!

을하는 데 도움이

희망

2

일반적으로 여기에 다른 질문에서 이미 설명 된 프로그래밍 관용구 및 디자인 패턴에 대한 책을 살펴볼 수 있습니다. 게임과 직접 관련이없는 경우에도 도움이됩니다.

게임 엔진은 상태 머신 (상태 게임, 상태 설정 및 하위 상태)의 좋은 예입니다. 조건부 분기 등으로 모두 할 수 있습니다., 당신이 추상화해야 할 필요가 커지면 머리를 잃지 않아야합니다.
다형성 클래스 (좋아하는 C++ 패턴 북을 참조하십시오), 템플릿 기반 (boost.statechart), ...
중앙 루프를 사용할 때 이벤트를 전달할 때 공통점은 무엇입니까? 현재 상황에 맞는 작업을 수행하는 일부 처리기 (상태 또는 하위 상태를 나타냄). 행동을 (예 : 게임에서 옵션으로) 변경해야합니까? 핸들러를 끄십시오.

또한 현재 게임 상태를 랩핑하고 추상화하려는 경우가 있습니다. 예를 들어, 게임의 명시적인 처리가 필요하지 않습니다. 모든 장소의 카드. 물건을 예를 들어 포장하십시오. 내부적으로 처리하는 카드 또는 플레이어 관리자.
또한 C++에서 제공하는 컨테이너 및 알고리즘을 무료로 사용할 수 있습니다. std::map 또는 std::set s의 카드 또는 플레이어를 관리하십시오. 표준 라이브러리 체크 아웃의 한계를 맞았을 때.

관련 문제