2012-02-05 3 views
2

클래스가 열거 형 GameStates입니다. (공개) 생성자에서 나는이 같은 GameStates를 초기화 :C++ 클래스 열거 형 멤버 변수

switch(enumGameState) 
     { 
     case Ready: 
      if (theGameEngine->KeyHit(Key_Space)) 
      { 
       enumGameState = Firing; 
       cout << "\nGame State moved to Firing"; 
      } // End if 
      break; 
     case Firing: 
      if (theGameEngine->KeyHit(Key_Space)) 
      { 
       enumGameState = Contact; 
       cout << "\nGame State moved to Contact"; 
      } // End if 
      break; 
     case Contact: 
      if (theGameEngine->KeyHit(Key_Space)) 
      { 
       enumGameState = Over; 
       cout << "\nGame State moved to Over"; 
      } // End if 
      break; 
     case Over: 
      break; 
     }; // End of GameState switch 

코드 하다니 오류없는 전혀 : public 메소드 실행에 다음

GameStates enumGameState = Ready; 

() 나는이 같은 스위치가 없다 상태가 충족됩니다. enumGameState의 가치에 어떻게 접근해야합니까?

편집 : 모든 클래스 코드. 생성자가 그대로 다음 코드 줄을있는 경우

class Game 
{ 
private: 
    Block* arrBlocks[10][10]; 
    //IMesh* objBlockMesh; 
    IMesh* objGunMesh; 
    IMesh* objDummyMesh; 
    Gun* objGun; 
    int Game::intSpeed; 
    I3DEngine* theGameEngine; 
    float fltSkyboxXCo; 
    float fltSkyboxYCo; 
    float fltSkyboxZCo; 
    float fltFloorXCo; 
    float fltFloorYCo; 
    float fltFloorZCo; 

    enum GameStates{Ready,Firing, Contact, Over}; 
    GameStates enumGameState; 

public: 

    Game(I3DEngine* the3dengine) 
    { 
     Game::theGameEngine = the3dengine; 
     theGameEngine->StartWindowed(); 

     // Add default folder for meshes and other media 
     theGameEngine->AddMediaFolder("C:\\TL-Engine\\Media\\AssigmentTwo\\Media"); 

     //intSpeed = 1; 

     Game::DrawBasicScene(theGameEngine); 
     Game::DrawBlocks(); 
     Game::CreateAGun(); 
     Bullet::Bullet(theGameEngine); 
     Game::enumGameState = Ready; 
    } // End of Constructor 


private:  


    void DrawBlocks() 
    { 
     float fltBlockOffSet = 12.0f; 
     float fltLeftMost = -54.0f; 
     float fltBlockZCo = 120.0f; 
     float fltBlockYCo = 5.0f; 
     float fltCurrentXCo; 
     float fltCurrentYCo = 5.0f; 
     float fltCurrentZCo = 120.0f; 
     // Stick 10 blocks in an array 
     // Display them 

     for(int i = 0; i < 10; i++) 
     { 
      if (i == 1) // Once i have created the first row all the other blocks are going to be created in a hidden state 
      { 
       fltCurrentYCo = -50.0f; 
      } 
      for(int j = 0; j < 10; j++) 
      { 
       fltCurrentXCo = ((float)j*fltBlockOffSet) + fltLeftMost; // Cast j into a float explicitly so that it doesn't it implicitly 
       arrBlocks[i][j] = new Block(theGameEngine, fltCurrentXCo, fltCurrentYCo, fltCurrentZCo); 
       if(fltCurrentYCo < 0) 
       { 
        arrBlocks[i][j]->SetBlockState(Block::Destroyed); 
       } // End if 
       else 
       { 
        arrBlocks[i][j]->SetBlockState(Block::New); 
       } 
      } // End of inner loop 

      fltCurrentZCo += fltBlockOffSet; 

     } // End of outer loop 

    } 

    void CreateAGun() 
    { 
     // Create a gun 
     Gun::Gun(theGameEngine); 
    } 

public: 
    void Game::Run() 
    { 
     //Start watching input in a while loop 
     // The main game loop, repeat until engine is stopped 
     while (theGameEngine->IsRunning()) 
     { 
      // Draw the scene 
      theGameEngine->DrawScene(); 
      if (theGameEngine->KeyHit(Key_Escape)) 
      { 
       theGameEngine->Stop(); 
      } 

      if)theGameEngine->KeyHit(Key_Space)) 
      { 
       cout << "\n space"; 
      } 

      GameStates currentGameState = enumGameState; 
      switch(enumGameState) 
      { 
      case Ready: 
       if (theGameEngine->KeyHit(Key_Space)) 
       { 
        enumGameState = Firing; 
        cout << "\nGame State moved to Firing" << endl; 
       } // End if 
       break; 
      case Firing: 
       if (theGameEngine->KeyHit(Key_Space)) 
       { 
        enumGameState = Contact; 
        cout << "\nGame State moved to Contact" << endl; 
       } // End if 
       break; 
      case Contact: 
       if (theGameEngine->KeyHit(Key_Space)) 
       { 
        enumGameState = Over; 
        cout << "\nGame State moved to Over" << endl; 
       } // End if 
       break; 
      case Over: 
       break; 
      }; // End of GameState switch 
     } 

    } 
}; // End of Game Class 
+0

인쇄물에 std :: endl을 추가하여 줄을 비우는 것이 도움이됩니까?'std :: cout << "Text"<< std :: endl; –

+0

아니요, 콘솔 출력에는 아무것도 없습니다. 나는 지금 스위치의 바깥 쪽에서 key_Space를 테스트했지만, 키 누름이 읽히지 않는 것처럼 보입니다. 이스케이프 키 캡처가 제대로 작동하는 것처럼 보이는 것은 이상합니다. –

+0

죄송합니다. 위의 발췌 문장에없는 것을 알고 있습니다. 스위치 직전에 게임을 종료하는 이스케이프 키에 대한 또 다른 theGameEngine-> Key_Hit()가 있습니다. 완벽하게 작동합니다! –

답변

1

도움 주셔서 감사합니다. 이 문제는 클래스가 아니거나 클래스의 코드가 아닙니다. Visual Studio에서 문제였습니다. 불행히도 불확실합니다. 코드가 복사되어 새 프로젝트에 추가되면 완벽하게 컴파일되고 main에있는 모든 중단 점에 충돌합니다.

이야기의 도발 : 분명히 먼저 시도하십시오.

4

는 :

GameStates enumGameState = Ready; 

그런 다음 당신이 방금했던 당신의 생성자 메서드 내에서 지역 변수 enumGameState를 만들고 초기화됩니다. 생성자가 완료 되 자마자 범위를 벗어나 값이 손실됩니다.

은 아마도 당신은 또한 값이 초기화되지 변수 enumGameState, 그래서 당신의 switch 문이 가짜 값으로 실행되는 회원에게 있습니다.

멤버 변수와 이름이 같은 로컬 변수를 만드는 방법은 C++에서의 섀도우 잉 예제인데, 이는 종종 오류를 나타냅니다. 이런 이유 때문에 GCC와 같은 일부 컴파일러는 변수를 섀도 잉하면 경고를 표시 할 수 있습니다. 자세한 내용은 this answer을 참조하십시오.

enum GameState 
{ 
    Ready, 
    Firing, 
    Contact, 
    Over 
}; 

그런 다음 클래스 Game는 다음과 같이 수 :

+0

GameStates의 인스턴스는 클래스 상단의 enumGameState로 정의되며 생성자 내에서만 준비 됨으로 설정됩니다. –

+0

@Stephen - 그럼 문제가 뭔지 잘 모르겠습니다. 실제 코드를 보지 않고 말하기는 어렵습니다. –

+0

엄청난 실패, 모든 코드를 실수로 추가 한 다음 게시물을 편집하여 삭제하려고 시도하고 두 번에 끝납니다. :(죄송합니다 추 신 : 초과 코드를 제거 할 수 있습니까? –

1

당신은 그것을 사용하기 위해이 열거를 정의 할 필요가 여기

class Game 
{ 
public: 
    Game(GameState gs = Ready) : gs(gs) { } 
    void update() 
    { 
     switch (gs) 
     { 
     case Ready: cout << "Ready\n"; gs = Firing; break; 
     case Firing: cout << "Firing\n"; gs = Contact; break; 
     case Contact: cout << "Contact\n"; gs = Over; break; 
     case Over: cout << "Over\n"; break; 
     default: break; 
     } 
    } 
private: 
    GameState gs; 
}; 

그리고는 main입니다 :

int main() 
{ 
    Game g; 
    g.update(); 
    g.update(); 
    g.update(); 
    g.update(); 
    return 0; 
} 

출력 :

+0

공개 열거 형 GameStates가 이미 정의되어 있으며 인스턴스가 이미 있습니다.이 이름을 enumGameState로 지정 했으므로이 값을 생성자에 할당합니다. 메서드는 동일한 클래스 변수를 사용하려고합니다. –

+0

자, 구현이 올바르다 고 생각합니다.하지만'int gameState; '대신에 enum을 사용하기로 결정한 것이 좋습니다.); – LihO

+0

그것을 정확하게하고 있었지만 나는 왜 내가 원하는 결과를 얻지 못하는지 전혀 모른다. 이전 과제 디버깅이 훨씬 더 어려웠음에도 불구하고 지금 내 과제를 다시 시작하기 위해 24 시간 전까지 만 남기고 싶었습니다! –

1

클래스 자체에 문제가 있다고 생각하지 않습니다. 게임을 실행할 때 main()이 입력되지 않으므로 클래스가 존재하지 않습니다. 그것은 또 다른 곤경에 처하게됩니다. 게임 장면이 그려지는 곳에서 렌더링이 잘되는 것처럼 보입니다.

게임 클래스 코드를 모두 디버그하도록 도와 주셔서 감사합니다.