2009-03-07 5 views
2

현재 앱을 쓰고 있습니다. 싱글 톤을 피하고 싶다면 단순히 주위의 모든 참조를 전달해야합니까?글로벌 상태 회피

예 :

나는 "main"클래스를 가지고 있습니다.
등급 : 홈페이지
+ ---- 화면
+ ---- 카메라
+ ---- 지형
+ ---- 차량
+ ---- PhysicsWorld

카메라, 지형 및 차량 등 클래스가 포함되어 있습니다. 이제 지형 객체를 만들 때 문제가 있습니다. Terrain은 Main 클래스 Screen 객체에 액세스하여 Terrain Graphics를 화면에 추가 할 수 있습니다. 또한 드로잉 할 때 Camera 객체에 대해 알고 싶어하므로 드로잉 할 스케일을 알 수 있습니다. 또한 PhysicsWorld 객체에 대해 알고 싶어하므로 물리 엔진에 추가 할 수 있습니다.

항상 생성자간에 이러한 개체를 앞뒤로 움직여야합니까? 내 말은, 지형 객체를 만들 때 내 스크린 객체, 내 물리 월드, 카메라 등을 그냥 지나쳐야한다는 것입니까?

내가 가진 또 다른 임의의 시나리오는 이제 .. 내 Vehicle 클래스 내에서 Main 클래스에서 Restart() 메서드를 호출해야합니다. 이것은 내가 main의 인스턴스를 Vehicle에 전달해야한다는 것을 의미합니까? 정말??

이 지속적으로 어디에 거의 등 내가 가진 객체가 화면, 물리학, 카메라 정보를 필요로 게임 내 모든,

모든 특히 내 시나리오에서, 내 수업에 4-5 일을 통과해야에 성가신 느낌 제안?

답변

1

ActionScript를 모르지만 변수가 참조로 전달되었다고 가정하면 카메라, 스크린, 지형, PhysicsWorld를 포함하는 '환경'클래스를 구성하여 인스턴스에 전달할 수 있습니다.

2

지속적 내가 이 거의 모든 게임 오브젝트가 화면, 물리학, 카메라 정보를 필요가있는 지금, 특히 내 시나리오에서, 내 수업에 을 4-5 가지를 통과 을 가지고 그것은 성가신 느낌, 그러면 올바른 질문은 "모든 수업에서 5 가지 물체가 모두 필요한 이유는 무엇입니까?"입니다. 왜 모든 gmae 개체에 언급 된 것들이 필요합니까? 게임 내 개체에는 동작을 처리하는 데 필요한 위치와 위치가 필요합니다. 그런 다음 별도의 렌더러가 개체를 렌더링 할 수 있습니다. 즉, 렌더러에만 카메라 정보와 스크린이 필요하다는 의미입니다.

물리학은 어느쪽으로 갈 수 있습니다. 게임 객체를 업데이트하는 별도의 물리 엔티티가 있거나 각 물리 객체에 물리 객체를 전달할 수 있습니다. 그러나 당신이 그것을 지나치더라도, 우리는 나열된 세 가지 객체 중 하나에 이릅니다. :)

그래서 전역 및 싱글 톤을 자주 피하는 것이 좋습니다. 그들은 당신의 의존성을 위장하여 실제로 필요한 것보다 훨씬 더 많은 의존성을 갖게됩니다. 그리고 나서 은 전역을 제거하는 것이 거의 불가능합니다.

그러나 전역 변수를 사용하는 경우 최소한 독점을 피하십시오.싱글 톤에 의해 강화 된 추가 제약 조건은 필요 없습니다.

지형이가 화면에 그 지형 그래픽을 추가 할 수 있도록 메인 클래스를 화면 개체에 액세스하려고합니다. 그것은 도 카메라 에 대해 알고 싶어하므로 그림을 그릴 때 무엇을 그릴 지 알고 있습니다. 또한 은 내 PhysicsWorld 객체에 대해 알고 싶어하므로 물리 엔진에 추가 할 수 있습니다.

지형 개체는 한 가지를 알아야합니다. 지형과 같은 것입니다. 다른 사람이 렌더링에 책임을 질 수 있습니다. 누군가 카메라, 스크린 및 지형 그래픽에 대해 알아야 할 필요가 있습니다. 이는 동일한 객체가 이러한 객체를 포함하는 다른 작업 (예 : 다른 렌더링 작업)을 수행 할 수 있음을 암시합니다. 지형은 왜 그려지는 스케일을 고려해야합니까? 눈금은 알아야하지만 카메라 공간의 눈금은 알 필요가 없습니다. 그리고 다른 사람이 물리 엔진에 지형을 추가 할 수없는 이유는 무엇입니까? 주요 기능은이를 수행 할 수 있습니다. 지형 생성, 물리 엔진 생성, 물리 엔진으로 지형 등록, 게임 시작.

0

나는 똑같은 문제가있다. (우연히도 액션 스크립트 3에서도 마찬가지다.)

저는 RTS를 사용하여 플래시 작업을하고 있으며 각각 새로운 클래스 (예 : gameGrid, currentSelection, visibleUnits 등)에 많은 수의 참조를 전달해야한다는 것을 알고있었습니다.

결국 내가해야 할 일은 모든 클래스가 자신의 속성을 유지하게하고 대신 이러한 클래스 (잘 객체)에 대한 참조를 전달한다는 것입니다.

어쨌든, 지금 내가하고있는 일은 RTSGlobals라는 클래스 내부의 메인 스테이지, 인터페이스, 엔진 및 디스플레이 영역과 같이 일반적으로 사용되는 객체에 대한 참조를 포함하는 정적 변수를 갖는 것입니다. 거기에 화면 크기와 같은 상수도 넣을 것입니다.

나는 이것이 정말로 당신의 질문에 대답하지 않는다는 것을 알고있다. 그러나 때때로 나는 효율적인 솔루션을 선호하여 약간의 OOP 우수 사례를 무시할 만하다.

사람이 그래도 좋습니다 솔루션을 가지고있는 경우, :)

0

난 당신이 XNA의 샘플 프로젝트 (그것을 구글)를 살펴 보시기 바랍니다 알려주세요. 그들은 잘 설계되어있어 힌트를 줄 수 있습니다.

또한 AS3을 사용 중이므로 이벤트 시스템을 사용하여 다른 항목에 메시지를 보낼 수 있습니다. 예를 들어 Main을 Vehicle 클래스에 전달하는 대신 Main (또는 관심있는 모든 것이 든)을 Vehicle 클래스의 리스너로 만듭니다. 그런 다음 자동차 충돌이 발생하여 게임을 다시 시작하고 CAR_CRASHED와 같은 이벤트를 전달하려고한다고 가정 해 보겠습니다. 차 청취자는이 메시지를 토대로 뭔가를해야합니다. 이벤트 시스템을 이해하려면 EventDispatcher를 입력하고 강조 표시 한 다음 Flash IDE에서 F1을 누릅니다.