2010-06-23 5 views
3

많은 종류의 게임 개체에 대해 적절한 양의 정보를 저장할 필요가있는 작은 온라인 게임을 만들고 있습니다.게임 개체 라이브러리의 코드와 구성

이 데이터를 코드로 생성할지 또는 일부 구성 파일에 저장할지 결정하려고합니다. 아마 예를 XML 형태의 포맷을 사용

(within a set of functions executed once at program startup) 
.... 
// create grass terrain 
grass=new GameObject(); 
grass.inheritProperties(generic_terrain); 
grass.set(NAME,grass); 
grass.set(MOVEABLE,true); 
grass.set(MOVECOST,10); 
grass.set(IMAGE_INDEX,1); 
.... 

설정 파일 접근 반면 :

데이터 생성 방법은 (자바 틱 의사 코드에서) 뭔가를 할 것입니다

(within terrain.xml file) 
.... 
<terrain name="grass"> 
    <inherit class="generic_terrain"/> 
    <property key="NAME" value="grass"/> 
    <property key="MOVABLE" value="true"/> 
    <property key="MOVECOST" value="10"/> 
    <property key="IMAGE_INDEX" value="1"/> 
</terrain> 
.... 

몇 가지 중요한 점 :

  • 이 정보는 게임 게임이 실행될 때마다 정적 (즉 않습니다 실행 중에하지 변경)
  • 속성 이름 (NAME, MOVECOST 등) 상대적으로 작은 목록이지만 추가 것들은 시간이 지남에 추가 할 수 있습니다
  • 그것은 dev에 의해 변경 될 것이라고 생각하는 것이 안전 가정합니다. 도망 팀 (즉, 구성 을 빌드 프로세스 외부에서 관리 할 필요가 없습니다.
  • 이 게임 밸런싱을 이유로 개발 동안 꽤 정기적으로 을 쥐게해야합니다 (예 : 단위/덜 더 강력한 만들기)
  • 잔디의 요구 위의 예에서, 즉 속성의 "상속"어느 정도있다 generic_terrain에 정의 된 모든 표준 속성과 몇 가지 새로운 추가/변경 사항을가집니다.

이 상황에 가장 적합한 방법은 무엇입니까? 더 중요한 이유는 무엇입니까?

+0

당신이 효율적인 설정 파일 형식을 찾고 있다면, 나는에보고하는 것이 좋습니다 [YAML은] (http://www.yaml.org/) : –

답변

5

개인적으로 가능한 한 config에 많은 것을 밀어 넣고 싶습니다. 그 이유는 어떤 시점에서 내가 완전히 다른 방식으로 게임을 위해 작성한 코드를 재사용하고 싶을 수 있기 때문입니다. 소스 코드가 구현 세부 사항에 대한 참조로 흩어져 있다면이 작업이 훨씬 더 어려워집니다.

config 접근법에 대한 한 가지 재미있는 경고는 값 이외에 객체의 동작을 설명하기 시작할 때 나타납니다. 볼 오브젝트를 "잡는"컵 오브젝트가있는 간단한 예제를 고려하십시오. 다음과 같이 표현할 수 있습니다.

<object name="ball"> 
    <property key="shape" value="circle"/> 
    <property key="movable" value="true"/> 
    <property key="speed" value="10"/> 
</object> 

<object name="cup"> 
    <property key="shape" value="rectangle"/> 
    <property key="movable" value="true"/> 
    <property key="speed" value="6"/> 
    <property key="catches" value="ball"/> 
</object> 

여기서 문제는 코드에서 "캐치 (catch)"가하는 것을 정의해야한다는 것입니다.이제 객체 무엇뿐만 아니라를 작동하는 방법을 설명 할 수있는 능력을 얻고있다

<object name="cup"> 
    <property key="shape" value="rectangle"/> 
    <property key="movable" value="true"/> 
    <property key="speed" value="6"/> 

    <oncollision> 
     if (collided.getName() == "ball") { 
     collided.destroy(); 
     points++; 
     } 
    </oncollision> 
</object> 

: 당신이 해석 언어를 사용하는 경우 같은 일을 할 수 있습니다. 여기서 유일한 문제는 해석 된 언어로 작업하지 않는 경우 런타임에 코드를 정의 할 수 없다는 것입니다. 이것은 Lua이 게임 개발에서 매우 인기있는 이유 중 하나입니다. 이는 선언적 및 절차 적 언어로 잘 작동하며 컴파일 된 응용 프로그램에 포함하기 쉽습니다. 따라서 다음과 같은 상황을 표현할 수 있습니다.

object { 
    name='ball'; 
    movable=true; 
    speed=10; 
} 

object { 
    name='cup'; 
    movable=true; 
    speed=6; 
    oncollision=function(collided)  
    if collided:getName() == "ball" then 
     collided:destroy(); 
     points++; 
    end 
    end; 
} 
2

코드에서 데이터를 분리하는 것은 항상 좋은 생각입니다. 실행 중에 데이터가 정적 인 경우에도 설계 프로세스 중에는 데이터가 없습니다. 하드 코딩 된 데이터가있는 게임은 쉽게 수정할 수있는 구성 파일에서 데이터를 수집하는 것보다 유연성이 떨어집니다.

데이터를 별도의 파일에 보관하면 xml과 같은 다양한 값을 빠르고 간단하게 변경할 수 있습니다.

+0

는 설정 파일은 별도 될 수 있습니다 파일 일지라도 – Tom

2

이것은 언어와 관련이 없습니다.

컴파일 된 언어를 사용하는 경우 구성 파일을 사용하여 무언가를 조정할 때마다 강제로 다시 컴파일하지 않도록하십시오.

명시 적으로 컴파일/링크 프로세스를 수행 할 필요가없는 언어를 사용하는 경우 구문 분석 및 로딩을 처리 할 필요가 없도록 코드로 작성하십시오. (하지만 기능을 한 곳에서 수행하여 나중에 기능을 완전히 교체하는 것이 쉽고, 향후 어느 시점에서해야 할 필요가 있습니다.)

기본적으로 코드는 데이터이지만 코드로 데이터를 수정하는 것은 고통스럽게 어렵습니다. 그러한 경우 (예 : 컴파일 된 언어의 경우) 수정하기 쉬운 종류의 코드로 작성하십시오. (귀하의 해석 된 구성 언어)

+0

흥미 롭습니다 ... 개인적으로 필자는이 상황에서 재 컴파일 비용에 영향을받지는 않았습니다. 모든 테스트를 실행하는 데 3 초 (또는 백그라운드에서 자동으로 더 잘 실행되는 경우)이면, 비용이 들지 않을 것입니다 별도의 설정 파일을 탐색하는 것 이상. – mikera

+0

동적으로로드 된 라이브러리를 사치스럽게 사용하는 경우 이것이 맞을 수도 있습니다. 하나의 .cpp 파일 만 변경된 경우 작업중인 시스템 컴파일/링크는 ~ 45 초가 걸립니다. 그래서 YMMV. – pkh

2

많은 게임 엔진은 언급 한 여러 가지 이유로 스크립팅 언어를 사용합니다. Lua은 많은 게임에서 큰 성공을 거두었던 정말 훌륭하고, 매우 빠르며 가벼운 스크립팅 엔진입니다. 파서를 사용하여 간단한 설정을하고 그대로 두거나 더 많은 기능을 구현하고 실제 코드를 파일에 기록 할 수 있습니다. 루아에서 귀하의 예제는 다음과 같이 보일 수 있습니다 :

grass = { 
    NAME = "grass", 
    MOVEABLE = true, 
    MOVECOST = 10, 
    IMAGE_INDEX = 1 
} 

setmetatable(grass, generic_terrain) 
+0

그래서 올바르게 이해한다면 루아는 "코드"캠프에 속하지만 가벼운 도메인 특정 언어로 실행하고 동적으로 실행하여 설정 파일과 비슷하게 작동합니까? – mikera

+0

그런 식으로 설정하고 싶다면 간단한 설정 파일처럼 동작 할 수 있습니다. 루아에 대한 기본적인 데이터 구조는 하나의 설정 언어에 대해 꽤 잘 작동하는 테이블 (조합 해시 테이블과 배열이다)이다. – Dolphin

2

XML을 사용하기로 결정했다면, 적어도 제정신 인 스키마를 사용하십시오. 자신의 작은 스키마 ("객체", "속성", "키", "가치")를 XML에 직접 포함시키는 이유는 없습니다. 에 대해 어떻게 :

<ball> 
    <shape>circle</shape> 
    <movable>true</movable> 
    <speed>10</speed> 
</ball> 

<cup> 
    <shape>rectangle</shape> 
    <movable>true</movable> 
    <speed>6</speed> 
    <catches>ball</catches/> 
</cup> 
관련 문제