2013-05-24 2 views
1

MVC 디자인 패턴으로 타일 기반 게임 만들기. 내지도 모델에는 모든 게임 개체의 2D 배열이있어서 위치를 처리합니다. 그러나 나는 대상이 자신의 위치를 ​​알아야 할 때 (예 : 마법의 범위)와 같은 경우가 있습니다. 객체가 자체 위치를 저장하는 것이 좋은 생각입니까? 나는 양측에 문제가있는 것을 본다.GameObject는 타일 기반 게임에 자체 위치를 저장합니까?

  1. 개체가 자신의 위치를 ​​알지 못합니다. 위치 데이터는지도에만 저장됩니다. 위치가있는 경우 즉시 개체를 찾을 수 있습니다. 그러나 객체간에 이동하려면 배열을 반복해야합니다.
  2. 개체는 자신의 위치를 ​​알고 있습니다. Map 및 Object에 저장된 위치 데이터입니다. 활성 객체가 있으면 객체에서 바로 위치를 끌어 올 수 있습니다. 그러나 이것은 맵 배열과 객체의 위치 사이의 불일치를 초래할 수 있습니다. 나는 다른 하나를 바꾸지 않고 하나가 업데이트되지 않았는지 확신하지 못합니다. 각 콘트롤러 (객체와 맵)에는 객체를 움직이는 함수가있을 수 있으며, 호출 될 때 다른 객체의 모델이 일관성 있고 업데이트되는지를 살펴볼 수 있습니다. 그러나 이것은 극도로 미숙 한 것처럼 보입니다.

답변

0

위치를 GameObject에 저장하고 개인 필드와 위치를 수정하는 단일 기능을 사용하여 위치가 일관성을 유지하는 것이 좋습니다. 위치는 GameObject의 private 멤버 일 수 있으며 2D 배열은 Map 클래스의 private 멤버 여야합니다. 그런 다음 객체를 이동할 수있는 Map 클래스의 함수를 정의합니다. 이 함수는 배열과 객체에 저장된 위치를 업데이트해야합니다. GameObject의 위치에 대한 Map 클래스 액세스를 부여하는 방법은 프로그래밍 언어에 따라 다릅니다. Java에서는 package-private 함수 (기본 액세스 수준)를 구현하고 동일한 클래스에서 Map 및 GameObject를 정의 할 수 있습니다. C#에서는 내부 함수를 정의하고 동일한 어셈블리에서 C++로 Map 및 GameObject를 정의 할 수 있습니다 Map.move 함수를 GameObject의 친구로 만들 수 있습니다. GameObject의 보호 된 비공개 멤버에 대한 액세스 권한을 부여합니다.

이 접근법의 유일한 단점은 실수로 배열을 업데이트하지 않고 GameObject 내에서 GameObject의 위치를 ​​수정할 수 있다는 것입니다. 이를 방지하려면 각 오브젝트의 위치를 ​​Map-Class의 맵/사전에 저장할 수 있습니다. C++에서는 대략 다음과 같습니다.

#include<map> 

class GameObject {}; //don't store the location here 

struct Location { 
    int x,y; 
}; 

class Map { 
private: 
    //the 2D array containing pointers to the GameObjects 
    GameObject* array[WIDTH][HEIGHT]; 

    //a map containing the locations of all the GameObjects, indexed by a pointer to them. 
    std::map<GameObject*,Location> locations; 

public: 
    //move an object from a given location to another 
    void move(int fromX, int fromY, int toX, int toY) { 
     GameObject* obj = array[fromX][fromY; 
     array[toX][toY] = obj 
     array[fromX][fromY] = 0; 
     locations[obj].x = toX; 
     locations[obj].y = toY; 
    } 

    //move a given object to a location 
    void move(GameObject* obj, int toX, int toY) { 
     Location loc = locations[obj]; 
     move(loc.x, loc.y, toX, toY); 
    } 

    //get the location of a given object 
    Location getLocation(GameObject* obj) const { 
     return locations[obj]; 
    } 
};