2012-10-20 1 views
3

나는 팩맨 게임을 사용하고 있으며, 다시 돌아가서 코드를 "정리"하려고합니다. 전에는 기본적으로 내 게임의 모든 객체 (팩맨, 유령,지도 등)를 참조하는 game1.cs의 객체를 참조하는 "TopObject"를 사용했습니다. 필자는 유령 물체 나 내 유령 물체의 맵/타일 오브젝트, 심지어 어디서든지 컨텐츠를로드 할 수있는 내 ContentMananger에서 Pacman 오브젝트에 액세스 할 수 있도록 전역 적으로 사용할 수있게 만들었습니다.팩맨 게임 조직 (XNA) - 유령/음식과의 충돌을 어디에서 확인해야합니까?

저는 이것이 나쁜 습관이라는 것을 알고 있습니다. 그래서 그것을 제거하려고합니다. 예를 들어, "ContentManager"유형을 사용하는 모든 객체에서 LoadContent() 메소드를 작성 했으므로 TopObject를 사용하여 ContentManager를 호출 할 필요가 없습니다.

계속 진행하면 내 모든 개체에 대한이 글로벌 참조가 없으면 작업을 수행하는 데 어려움을 겪고 있습니다. 예를 들어 : - 내 팩맨 업데이트() ..

  • 내에서 난 내가 벽에 실행하는거야 알고 있어야합니다. 지도/타일에 대한 참조가 필요합니다.

  • 유령과 충돌했는지 알아야하므로 유령 객체에 대한 참조가 필요합니다.

  • 내가 음식과 충돌했는지를 알아야하고 스코어 보드를 업데이트해야하므로 스코어 보드 개체에 대한 참조가 필요합니다.

그래서 본질적으로, 그것은이 "글로벌"topobject을하는 것 같은 느낌이 든다 훨씬 청소기입니다, 내 모든 객체에 주위에 많은 객체 참조를 통과하는 거대한 엉망 될거야 같은 느낌.

누구든지이 기능을 구성하는 방법을 알고 있으므로 제대로 처리하고 있습니까? Pacman Update() 내에서 충돌 여부를 확인해야합니까, 아니면 별도의 "PacmanObject.CheckCollisionWith()"를 만들고 내 Game1 Update()에서 호출해야합니까? 충돌 논리가 새로운 클래스로 분리되어야 하는가?

감사합니다.

+0

재미있는 읽을 거리이며, 이러한 유형의 문제에 접근하는 방법과 처음 실행시 작동하는 것처럼 보이는 일반적인 접근 방식이 잘못된 이유를 마음에 두는 데 도움이됩니다. http://gameprogrammingpatterns.com /하나씩 일어나는 것.html – JohnLBevan

답변

1

개체에 대한 참조를 포함하는 중심점은 그다지 나쁜 것이 아닙니다. 그러나 좋은 디자인은 올바른 클래스의 각 개체와 가장 관련이있는 작업을 배치합니다. 예를 들어, 플레이어는 타일과 벽을 참조 할 필요가 없습니다. Move 메서드를 수행하는 동안 플레이어는 다음 클래스가 유효하면 true/false를 반환하는 Map 클래스의 정적 메서드를 호출 할 수 있습니다. 이 방법으로, 플레이어는지도 자체에 대한 참조가 없습니다.

public class Player 
{ 
    public void Update() 
    { 
     //stuff to find nextTile position 

     //Call static function toward a class that contains the map data. 
     if (Map.TileIsWalkable(nextTile)) 
      Move(); 
    } 
} 

public class Map 
{ 
    public static Map loadedMap; // Handling it as singleton, normally you only load one map at a time. 

    public static bool TileIsWalkable(Vector2 position) 
    { 
     if (loadedMap == null) // Throw assert, shouldn't happen. 

     return //whatever test needed in loadedMap structure 
    } 
} 

유령에 대한 참조를 유지하는 Ghost 관리자가있을 수도 있습니다. 플레이어는 충돌이 일어 났는지를보기 위해 모든 유령을 반복 할 관리자의 메소드 만 호출하면됩니다. 더 좋은 방법은 위치가 아니라 참조가 될 수 있습니다. 그런 식으로 유령이 서로 충돌하는지 재사용 할 수 있습니다. (임의의 아이디어)

무언가를 할 수있는 방법이 충분합니다. 어떤 코드 디자인에서나 가장 어려운 점은 더 이해하기 쉬운 장소에 물건을 놓는 것이고 나중에 업데이트하고 수정하는 것이 가장 쉽습니다.

+0

Marc에게 감사드립니다. 맵과 GhostManager를 정적으로 만드는 아이디어가 마음에 들었습니다. 그런 식으로 참조로 전달할 필요가 없습니다 ... 그냥 "작업"합니다. –