대학에서 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
{
...
};
어떤 도움도 대단히 감사하겠습니다 내가 정말 다음에 어디로 가야에 붙어있어 것처럼! 감사합니다. .
감사 것입니다하지만, 난 여전히 다음을 이해하지 못하는 메소드를 사용하려면 클래스의 인스턴스를 만들어야합니까? 2) 그렇다면 하위 클래스에 대해이 인스턴스를 어디에서 어떻게 만들 수 있습니까? –
1. 정적 인 경우 인스턴스없이 실행될 수 있지만 실제로는 실행되지 않습니다. 생성자는 새 객체를 반환하기 때문에 예외입니다. 2. 하위 클래스는 선택을했기 때문에 변환하려고 할 때 만들어집니다. 예를 들어 플레이어 1을 사용하면 OnePlayer gamedata (게임 인터페이스)가됩니다. – Eadword
당신이 제안한 방식으로 서브 클래스의 인스턴스를 만들려고 시도했지만, 그때부터 메소드를 호출하는 것처럼 보이지 않습니다. 왜 파생 된 기본 클래스에서 파생 클래스의 인스턴스를 생성하는 데 어려움이 있습니까? Fl_Window에서? –