2012-01-13 1 views
3

저는 며칠 동안 SDL을 사용 해왔고, 자습서를 따라 Galaga의 복제본을 개발하기로 결정했습니다. 그러나 필자는 코드 작성을 위해 적절한 레이아웃을 찾기가 어려웠다.SDL을 사용하는 게임을위한 코드 구성

예를 들어, I는 다음과 같이 우주선 클래스 정의한 : 스프라이트 등등과 화면상의 위치를 ​​유지하는베이스 클래스이다

class Spaceship : public Sprite 
{ 
public: 
    Spaceship(SDL_Surface *surface); 
    Spaceship(const char *filename); 

    void handleEvent(SDL_Event *event); 
}; 

. 내 생성자는 같은 것이다 : 나는 그것이 내가 "game.h"를 포함 할 필요가 것 때문에 게임 :: screenWidth() 정적 클래스]를 사용하는 것은 불가능합니다 본 적이 무엇부터

Spaceship::Spaceship(SDL_Surface *surface) : 
    Sprite(surface) 
{ 
    m_y = Game::screenHeight() - m_surface->h; //positions the ship at the bottom 
} 

을하는 기본적으로 주요 게임 클래스이며 기본적으로 무한 루프를 만드는 "spaceship.h"를 포함합니다 (#ifndef 등을 사용하지 않고 성공을 시도했습니다).

  • 는 이런 종류의 결과를 얻을 수있다 :

    그래서 여기 내 질문에 온다?

  • 그렇지 않은 경우 이런 종류의 문제를 방지하려면 코드를 어떻게 구성해야합니까? screen 등등에 관한 정보를 저장하고 game.h와 우주선 둘 다에서 포함시키는 Screen 클래스를 생성해야합니까?

편집 : 내가 첫 번째 문제를 (난 그냥 CPP 파일이 아닌 헤더 파일에 포함 "game.h"을 추가) 극복 할 수있는 방법을 발견했다. 그러나, 나는 아직도이 경우 최고의 디자인 선택이 무엇인지 궁금합니다.

+0

나는 "메인 게임 클래스"를 피함으로써 "메인 게임 클래스"문제를 해결합니다. 이 문제를 해결하는 한 가지 방법은 * main 함수가 필요한 모든 항목을 인스턴스화 한 다음 정적 상태 (전역 변수)에 의존하지 않고 각 클래스가 필요로하는 비트 만 전달하기 위해 Dependency Injection을 사용하는 것입니다. –

+0

"어떻게 프로젝트를 디자인합니까?"라는 질문은 꽤 광범위한 질문입니다.하지만 기본적으로 올바르게하고 있습니다 (학습 프로젝트를 수행 할 때 코드를 디자인 할 때 옳고 그른 방법은 없습니다) – thedaian

+0

@ MerlynMorgan-Graham 고맙습니다. 이 접근 방식도 너무 –

답변

0

종속성 그래프에서주기를 해제해야합니다.

예를 들어, 화면 높이를 저장하는 Spaceship 클래스에 필드를 추가 할 수 있습니다.

+0

나는 그것에 대해 이미 생각했지만 게임 중에 화면 해상도를 변경하고 싶을 때 문제가 될 수 있습니다. –

+0

@Narrakan 내 자신의 성향은, 내가 당신 상황에 있다면, Spaceship 수업에서 설정 클래스의 일부 인스턴스에 대한 링크 (참조)를 배치하는 것입니다. –

1

해당 개체에 대한 포인터 또는 참조 만 저장하려는 경우 class Game; 또는 class Spaceship;을 사용하여 클래스 중 하나 또는 모두를 전달 선언 할 수 있습니다. 이 객체를 매개 변수로 사용하거나 반환하는 경우에는 예외입니다 (afaik 제외).

두 구성원 모두 실제로 다른 구성원을 원한다면 이 아닌이 가능합니다. 그러면 각 개체의 내부에 자체 복사본이 생성됩니다.

+1

@AnonymousDownvoter : 의견을 보내 주시면 감사하겠습니다. –