2015-01-01 2 views
0

대학에서 C++ 프로젝트에 대한 소개를 위해 아케이드 게임용 테이블을 코딩하고 있습니다. 이 게임에는 공이 화면의 반대쪽으로 튀어 오르는 한 선수 연습 모드가 있고 플레이어 1의 패들 이동에는 w 및 s 키를 사용하고 플레이어 2의 이동에는 위아래 키를 사용하는 두 플레이어 모드가 있습니다. 나는 원래 한 클래스에 게임을 썼지 만, 제 강사와상의 한 후에 그는 추가로 3 가지 클래스를 사용하여 게임을 만들 것을 제안했습니다.기본 클래스에서 파생 클래스의 인스턴스 만들기 (FLTK를 사용하여 GUI를 작성하는 C++)

Fl_Window 
^ 
| 
Game Interface 
^   ^
|   | 
One Player Two Player 

내 강사가 보낸 다이어그램은 위에서 볼 수 있습니다.

두 가지 게임 모드 (예 : 볼 그리기, 화면 위쪽과 아래쪽에서의 충돌 및 플레이어 1의 패들 이동)와 두 개의 다른 클래스에 공통된 메서드가 포함 된 게임 인터페이스 클래스가 있습니다. 모드에 특정한 방법을 포함하는 모드 (예 : 움직이는 플레이어 2의 패들, 채점 시스템 및 드로잉 플레이어 2의 패들).

처음에는 게임 인터페이스 클래스의 인스턴스를 만들고 게임 모드를 선택하여 메뉴를 만드는 게임 초기화 함수를 실행합니다. 두 모드 중 하나를 선택하면 게임 인터페이스 클래스 내의 함수가 메뉴 위젯을 지우고, 플레이어 1의 패들을 그리고, 공을 그려서 일정 속도로 임의의 방향으로 공을 끕니다.

내가 원하는 것은 올바른 게임 모드 클래스의 인스턴스를 만들고 해당 클래스 내에서 다른 특정 초기화 함수 (한 명 또는 두 명의 플레이어)가 실행되도록하는 것입니다.

다른 게임 모드에서 메인 메뉴로 돌아가고 다른 모드를 선택할 수 있기를 원합니다.

이것은 처음으로 C++ 대규모 프로젝트이므로 전반적인 개념적 이해가 불만족 스럽습니다.

특정 게임 모드 클래스의 인스턴스를 어떻게 그리고 어디서 만들 수 있습니까? 기본 게임 인터페이스 클래스 또는 기본?

나는 이런 식으로 게임 메뉴를 intialise : 함수를 실행

//Main Function 
int main() 
{ 
GameInterface MyInterface(GameInterface::WindowSizeX, 
GameInterface::WindowSizeY, "PONG"); 
MyInterface . InitialiseMenu();                

return Fl::run();                   
} 

:

void GameInterface :: InitialiseMenu() 
{ 
begin(); 

MenuTitle = new Fl_Box (400, 50, 100, 50, "Welcome to PONG"); 
MenuTitle -> labelcolor (FL_WHITE); 
MenuTitle -> labelsize (MenuTitleTextSize); 
MenuTitle -> box (FL_NO_BOX); 
MenuTitle -> show(); 

TwoPlayerMode = new Fl_Button (400, 300, 150, 50, "Two Player Mode"); 
TwoPlayerMode -> callback(TwoPlayerMode_cb, this); 
TwoPlayerMode -> show(); 

show(); 
} 

(참고 : 저는 현재 단지와 함께 작동하는 두 선수의 클래스를 얻기 위해 시도하고 있습니다 게임 인터페이스 전에 세 클래스를 모두 작동 시키십시오)

콜백 함수는 다음과 같습니다.

,210
//Define two player mode button call back function 
void GameInterface :: TwoPlayerMode_cb(Fl_Widget* w,void* data) 
{ 
((GameInterface*) data) -> TwoPlayerMode_cb_i(w); 
} 

void GameInterface :: TwoPlayerMode_cb_i(Fl_Widget* w) 
{ 
TwoPlayerMode -> hide(); 
MenuTitle -> hide(); 
InitialiseGameObjects(); 

} 

초기화 게임 객체 함수이다 : 그것은 // TwoPlayerModeInitialise_i를 읽는 시점

//Define initialise game objects 
void GameInterface :: InitialiseGameObjects() 
{ 
Fl::add_timeout(0.01, GameInterfaceUpdate_cb, this); 

begin(); 

Ball = new Fl_Box (400, 300, 10, 10); 
Ball -> box(FL_FLAT_BOX); 
Ball -> color (FL_WHITE); 
Ball -> show();  

Player1Paddle = new Fl_Box(0, 300, PaddleSizeX, PaddleSizeY); 
Player1Paddle -> box(FL_FLAT_BOX); 
Player1Paddle -> color(FL_WHITE); 
Player1Paddle -> show(); 

InitialBallDirectionGenerator(); 

BallVelocityX = InitialBallDirectionX * InitialBallSpeed; 


BallVelocityY = InitialBallDirectionY * InitialBallSpeed; 

//TwoPlayerModeInitialise_i(); 

end(); 

} 

(); 두 플레이어 모드에 필요한 다른 객체, 함수 등을 초기화하는 두 플레이어 클래스에 포함 된 메서드가 필요합니다. 이 시점에서 그 클래스의 인스턴스를 만들어야한다고 가정합니까? 그런 다음 두 클래스의 메서드를 사용하여 게임을 제어하고 싶습니다 (예 : 플레이어 1의 패들 이동이 게임 인터페이스 클래스에서 비롯되고 플레이어 2의 패들 이동이 두 플레이어 모드 클래스에서 발생 함).

내 클래스는 다음과 같이 만들어집니다 :

//Game Interface Class 
class GameInterface : public Fl_Window 
{ 
//Defining Public Members 
public:             
GameInterface(int width, int height, const char* title=0) : Fl_Window(width, height, title)  
{ 
color(FL_BLACK);                   
show();                     
} 
... 
}; 

&

class TwoPlayerMode : public GameInterface 
{ 
... 
}; 

어떤 도움도 대단히 감사하겠습니다 내가 정말 다음에 어디로 가야에 붙어있어 것처럼! 감사합니다. .

답변

0

공용 함수 GameInterface getBaseClass() { return *this; }을 GameInterface에 추가 한 다음 하위 클래스 인스턴스에서 호출 할 때 기본 기본 클래스를 반환해야합니다.

OnePlayer(GameInterface base) : GameInterface(base) { 
    //here you could call any additional init functions 
} 

편집 :

그런 다음 GameInterface를 받아 줄 것을을 보내는 하나 또는 두 개의 플레이어에서 생성자를 만들 수 있습니다 내가 그것을 테스트 할 때 작동하는 추상 예를

class Base { 
protected: 
    int x; 

public: 
    Base(int x) : x(x) {} 
    Base getBaseClass() { return *this; } 
    virtual int getX() { 
     return x + 1; 
    } 
}; 

class Derived : public Base { 
public: 
    Derived(Base b) : Base(b) {} 

    Base getBaseClass() { 

    } 

    int getX() { 
     return x; 
    } 
}; 

int main() { 
    Base t(6); 
    Derived d(t); 
    std::cout << d.getX() << '\n'; //6 

    Base y = d.getBaseClass(); 
    std::cout << y.getX() << '\n'; //7 
} 
+0

감사 것입니다하지만, 난 여전히 다음을 이해하지 못하는 메소드를 사용하려면 클래스의 인스턴스를 만들어야합니까? 2) 그렇다면 하위 클래스에 대해이 인스턴스를 어디에서 어떻게 만들 수 있습니까? –

+0

1. 정적 인 경우 인스턴스없이 실행될 수 있지만 실제로는 실행되지 않습니다. 생성자는 새 객체를 반환하기 때문에 예외입니다. 2. 하위 클래스는 선택을했기 때문에 변환하려고 할 때 만들어집니다. 예를 들어 플레이어 1을 사용하면 OnePlayer gamedata (게임 인터페이스)가됩니다. – Eadword

+0

당신이 제안한 방식으로 서브 클래스의 인스턴스를 만들려고 시도했지만, 그때부터 메소드를 호출하는 것처럼 보이지 않습니다. 왜 파생 된 기본 클래스에서 파생 클래스의 인스턴스를 생성하는 데 어려움이 있습니까? Fl_Window에서? –

0

배열에서 플레이어를 초기화 할 수 있도록 게임 모드를 디자인해야합니다. 단일 플레이어 모드에서 배열에는 하나의 플레이어 객체 만 있습니다. 2 플레이어 모드에서는 2가 있습니다.이 방법으로 많은 기능이 두 클래스에서 동일 할 수 있습니다.

파생 클래스에서 재정의하려는 모든 함수는 다형성이 가능하도록 기본 클래스에서 가상으로 선언되어야합니다. 소멸자를 기본 클래스에서 가상으로 선언하는 것을 잊지 마십시오! 당신이 원하는하지 않은 경우 당신은 메뉴에 대한 클래스 주위에 랩을 만들 수

// create a pointer to a GameInterface object 
GameInterface *game; 

// start one player mode 
game = new OnePlayer(); 
game->run(); 

// before you change the game mode delete the current game 
delete game; 

// start two player mode 
game = new TwoPlayer(); 
game->run(); 

포인터가 다형성이며, 다음 중 하나를 게임 모드가 될 수 있기 때문에 당신은 GameInterface 객체에 대한 포인터를 사용한다

... 메인에 코드가있다. 그럼 그냥 메인에 메뉴 객체를 생성하고 실행 :

int main() 
{ 
// assuming default constructor exists, create the menu 
GameSelectMenu menu; 

// run the menu 
menu.run(); 

return 0; 
} 

메뉴 클래스 자체는 GameInterface 포인터를 개최 것이다 그것은 게임 모드를 전환 할 때 메모리 관리를 담당 할 것이다. GameInterface *를 OnePlayer 또는 TwoPlayer 개체로 지정하는 여러 모드를 실행하기위한 함수를 만들 수 있습니다.) 1 : 사용자가 실제로 게임 모드를 변경할 수 있도록 실제 메뉴의 사용자 인터페이스를 만드는 곳도 ... 도움을

//.. Within run() function of menu class 

std::string input; 
std::cout << "choose a game (enter 'a' or 'b'): " 
std::cin>> input; 

// check input for errors 
... 

// run a mode depending on input 
if (input == "a") startOnePlayer(); 
else if (input == "b") startTwoPlayer(); 

// remember to delete the GameInterface object when you have finished with it if it has been initialised 
if (game != NULL) delete game; 

... 
관련 문제