게임 리소스 (나무, 철, 금)에 인스턴스 또는 클래스 사용


31

목재, 철, 금 등과 같은 자원을 판매하거나 구매할 수있는 곳으로 배를 보낼 수있는 게임을 만들고 있습니다.

이제 게임에서 리소스를 어떻게 만들어야하는지 궁금했습니다. 나는 2 가지 옵션을 생각해 냈습니다.

  1. 각 자원에 대한 클래스를 작성하십시오.

    public class ResourceBase {
        private int value;
        // other base properties
    }
    
    public class Gold : ResourceBase {
         public Gold {
             this.value = 40 // or whatever
         }
    }
  2. Resource 클래스의 인스턴스 만들기

    public class Resource {
        string name;
        int value;
    
        public Resource(string name, int value) {
            this.name = name;
            this.value = value;
         }
     }
    
    // later on...
    
    Resource gold = new Resource("Gold",40);

두 번째 옵션을 사용하면 resources.json 파일에서 게임 리소스를 채울 수 있습니다.

새로운 아이디어 / 디자인 패턴 / 구조는 언제나 환영합니다!

편집 : 그것은 어 ass 신 크리드 블랙 플래그의 동반자 앱과 약간 같습니다. 아래 이미지의 리소스 표시 줄을 참조하십시오

편집 2 : "JSON 파일에서 항목 / 리소스로드"에 대한 연구를 더하고이 블로그를 발견했습니다 : Power of JSON in Game Development-Items . 옵션 1과 옵션 2 중 최고를 보여줍니다. 각 리소스에 기능을 계속 추가 할 수 있습니다. :)

여기에 이미지 설명을 입력하십시오


1
Minecraft에는 각 리소스에 대해 별도의 클래스가 있습니다 (
필수 아님

@MCMastery ohh 마인 크래프트가 오픈 소스입니까? 그 구조를 살펴보고 싶습니다. 언급을위한 thx
MDijkstra

1
그것은 아니지만 서버에 대해 항상 난독 처리되고 있습니다 ... github.com/Wolf-in-a-bukkit/Craftbukkit/tree/master/src/main/…
MCMastery

12
그런 문자열을 사용하지 마십시오. "glod"또는 이와 유사한 방식으로 "gold"를 잘못 입력하기가 너무 쉽고 디버깅하기가 매우 어렵습니다. enum대신 사용하십시오 .
Nolonar 2016 년

마인 크래프트는 기술적으로 오픈 소스가 아니지만 거의 완전히 디 컴파일 및 난독 처리되었습니다. 인터넷 어디에서나 난독 처리 된 소스를 찾을 수 없어야하지만 files.minecraftforge.net (MDK 다운로드는 원하는 것) 에서 프로세스를 다운로드하여 실행할 수 있습니다.
JamEngulfer

답변:


51

코드를 다시 쓰거나 업데이트하지 않고도 언제든지 새로운 리소스 유형 또는 항목을 도입 할 수 있다는 사실 때문에 두 번째 접근 방식을 사용하십시오 ( 데이터 기반 개발 ).


편집하다:

100 % 확신하더라도 일부 가치가 절대 변하지 않더라도 이것이 일반적으로 좋은 이유에 대해 좀 더 자세히 설명합니다.

주석에 언급 된 콘솔 게임 예제를 보자. 암호화 키, 자신의 이름 등과 같이 실제로 (또는 원하지 않는) 것을 제외하고는 아무것도 하드 코딩해서는 안되는 이유가 아주 많기 때문입니다.

콘솔에서 게임을 출시 할 때는 대개 콘솔 제조업체 자체의 QA가 게임을 테스트하고, 게임을하고, 문제를 찾는 등의 검토 과정을 거쳐야합니다. 이것은 필수이며 비용, 많은 비용이 소요됩니다. 필자는 한 번만 인증을 위해서만 릴리스 비용이 30,000-50,000 달러가 될 수 있다고 읽었습니다.

이제 게임 출시를 위해 30,000 달러를 지불하고 기다린다고 상상해보십시오. 그리고 갑자기 게임 가치 중 일부가 실제로 깨지는 것을 알 수 있습니다. 철 막대를 50 골드에 사고 55 골드에 팔 수 있다고 가정 해 봅시다.

당신은 무엇을합니까? 해당 내용을 하드 코딩 한 경우 새로운 업데이트 / 릴리스 버전을 작성해야합니다.이 버전은 다시 한 번 검토해야하므로 최악의 경우 재 인증 비용을 다시 지불해야합니다! 나는 Ubisoft가 신경 쓰지 않을 것이지만 내 자신의 작은 인디 게임 개발자 포켓을 위해 ... 아야!

그러나 게임이 가끔 업데이트 된 게임 정의 (예 : JSON 파일 형식)를 검사한다고 상상해보십시오. 게임은 새로운 업데이트없이 언제든지 최신 버전을 다운로드하여 사용할 수 있습니다. 재 인증이나 다른 지불금없이 언제든지 불균형 / 취약 / 버그를 고칠 수 있습니다. 약간의 사소한 디자인 결정, 당신은 그만한 가치가 없다고 생각하고 5 자리의 돈을 절약했습니다! 굉장하지 않습니까? :)

날 잘못 이해하지 마 이것은 다른 유형의 소프트웨어 및 플랫폼에도 적용됩니다. 업데이트 된 데이터 파일을 다운로드하는 것은 일반적으로 게임이든 응용 프로그램 / 도구인지에 관계없이 표준 사용자에게 훨씬 쉽고 실행 가능합니다. Windows의 프로그램 파일에 설치된 게임을 상상해보십시오. 업데이터는 무엇이든 수정하려면 관리자 권한이 필요하며 실행중인 프로그램은 수정할 수 없습니다. DDD를 사용하면 프로그램이 데이터를 다운로드하여 사용합니다. 플레이어는 업데이트가 있음을 알지 못할 수도 있습니다.


6
DDD의 경우 +1 이것은 자원과 같은 것들에 매우 적합합니다.
크롬 스터, 모니카

@Funnydutchman 누군가의 답변이 도움이된다면 Stack Exchange에서 왼쪽의 숫자 위에있는 화살표를 클릭하여 답변을 찬성하는 것이 일반적입니다. 답변이 가장 도움이 되었으면 하단 화살표 아래의 확인 표시를 클릭하여 답변을 수락해야합니다. 두 가지 조치 모두 응답자에게 평판을 제공하고 커뮤니티에 유용한 답변을보다 잘 보이게합니다.
Nzall

2
첫 번째 방법으로 코드를 다시 작성하는 방법을 보지 못했습니다. 당신이 할 일은 수업을 추가하는 것입니다 (내가 무언가를 놓친 경우가 아니면)
SirPython

4
그리고 Object Oriented 코드와 Object Obsessed 코드의 차이점이 있습니다. 객체 계층 구조를 만들 수 있다고해서 반드시 그럴 필요는 없습니다.
corsiKa

2
@ AgustínLado 고객이 "이것은 절대 변하지 않을 것"이라고 말할 때마다 1 달러가 들었다면, 저녁 식사를 위해 괜찮은 식당에 데려다 줄 수 있습니다. 평범한 식당 만 .. 그래도 저녁 식사를하기에 충분한 시간이지만 그래도.)
corsiKa

29

일반적으로 객체에 다른 값만 필요한 경우 객체에 다른 코드와 동일한 클래스의 인스턴스가 필요한 경우 다른 클래스를 사용합니다.

리소스에 고유 한 게임 메커니즘이 다른 경우 클래스를 사용하여 나타내는 것이 좋습니다. 예를 들어, 플루토늄이 경우에 따라 출산 반감기 시간과 토끼가있는 피보나치 순서를 , 다음은 기본 수준하도록 적합 할 수 있습니다 Resource방법으로 Update무 연산과 두 개의 파생 클래스로 구현 HalfLifeResource하고 SelfGrowingResource있는을 이 방법을 재정 의하여 값을 줄이거 나 늘리십시오 (그리고 서로를 저장할 때 발생하는 일을 통제하는 논리도 포함 할 수 있음).

그러나 리소스가 실제로 벙어리 숫자 일 경우 간단한 변수보다 더 멋진 것으로 구현하는 것은 의미가 없습니다.


귀하의 답변에 대한 @Phillipp에게 감사드립니다. 이것이 내가 생각한 것입니다. 그러나 리소스는 속성 / 메소드 측면에서 실제로 변경되지 않으므로 지금은 옵션 2를 사용
하겠습니다.

14


인터페이스 : 자원 클래스가 5 개의 정수에 대한 "저장소"이고 자원마다 다른 논리를 갖는 경우 (예 : 플레이어 지출 / 충돌, 도시 생산) 경우 추가 옵션을 추가하고 싶습니다 . 의지). 이 경우 클래스를 전혀 원하지 않을 수도 있습니다. 일부 엔티티에는 다른 엔티티와 상호 작용할 수있는 변수가 있음을 노출하고 싶을뿐입니다.

interface IHasResources {
  int Gold { get; set; }
  int Wood { get; set; }
  int Cloth { get; set; }
  // ....
}

class Player : IHasResources { }
class City: IHasResources { }

또한 이것은 적의 함대를 약탈하는 것과 정확히 동일한 코드로 도시를 약탈하여 코드 재사용을 촉진 할 수있는 장점이 있습니다.
단점은 이러한 클래스를 구현하면 많은 클래스가 구현하는 경우 지루한 일이 될 수 있으므로 인터페이스를 사용하지만 원래 문제가 아닌 옵션 1 또는 2로 해결할 수 있습니다.

interface IHasResources { 
   IEnumerable<Resource> Resources { get; }
}

인스턴스 (enum 포함) : 자원 유형을 정의 할 때 문자열 대신 enum을 사용하는 것이 바람직한 경우가 있습니다.

enum Resource {
   Gold, Wood, Cloth, //...
}

class ResourceStorage {
   public Resource ResourceType { get; set; }
   public int Value { get; set; }
}

IDE는 점을 작성한 후 할당 할 때 유효한 모든 리소스 목록을 제공하기 때문에 약간의 "안전성"을 제공합니다 ResourceType = Resource.. 또한 명시 적 유형 또는 컴포지션 / 플래그 와 같이 열거 형에 더 많은 "트릭"이 있습니다. 제작할 때 유용하다고 생각할 수 있습니다.

[Flags]
enum Metal {
 Copper = 0x01/*01*/, Tin = 0x02/*10*/, Bronze = 0x03/*11*/
}
Metal alloy = Metal.Copper; //lets forget Value(s) for sake of simplicity
alloy |= Metal.Tin; //now add a bit of tin
Console.WriteLine(alloy); //will print "Bronze"


가장 좋은 점은 은색 총알이 없지만 개인적으로 나는 어떤 형태의 인스턴스에 의존 할 것입니다. 인터페이스만큼 환상적이지는 않지만 단순하고 상속 트리를 어지럽히 지 않으며 널리 이해합니다.


2
귀하의 답변에 감사드립니다 @wondra 나는 enum 옵션을 좋아하고 어떻게 구리와 주석으로 청동을 만들 었는지; p
MDijkstra

2
나는이 커뮤니티에 구체적으로 참여하여 열거 형 솔루션을 투표 할 수있었습니다. enum Description 속성 을 사용 하여 enum ( my-great-enum) 의 일부 JSON 표현에서 enum ( )의 C # 표현으로 매핑 할 수도 있습니다 MyGreatEnum.
Dan Forbes

분명히 나는 ​​Java 루프를 너무 오래 벗어났습니다. 인터페이스에 대한 필드 선언은 언제부터 허용됩니까? 내가 아는 한 자동으로 정적이고 최종적이므로 질문에 설명 된 목적으로 많이 사용하지 않습니다.
M.Herzkamp

2
@ M.Herzkamp 그것은 필드가 아니며 속성이며 Java는 속성을 지원하지 않습니다. 질문은 C #, C # 인터페이스에 속성을 허용합니다-속성은 결국 중요한 방법입니다. 완전히 확실하지는 않지만 Java에서 지원되지 않는 플래그 주석에 대해서도 마찬가지입니다.
wondra 2016 년

정리해 주셔서 감사합니다! 나는 C # 태그를 놓 쳤고 질문의 코드는 엄청나게 비슷하게 Java : D
엄청나게 M.Herzkamp

2

옵션 1을 사용해야하며, 3 가지 장점이 있습니다.

  1. 리소스 유형을 매개 변수로 전달하는 대신 리소스를 인스턴스화하는 것이 더 쉽습니다. 예를 들어, new Gold(50)
  2. 자원에 특별한 행동을 취해야하는 경우, 자원의 클래스를 변경하면됩니다.
  3. 리소스가 특정 유형인지 확인하는 것이 더 쉽습니다. resource instanceof Gold

모든 대답에는 장단점이 있으므로 어느 쪽이 더 좋은지 선택하기가 어렵습니다. 질문을 수정했습니다. 그 구조에 대해 어떻게 생각하십니까?
MDijkstra 2016 년

1

자원에 자체 비즈니스 로직이 없거나 환경, 상호 작용하는 다른 자원 또는 다른 자원과의 상호 작용 방식에 대한 특수 사례 시나리오가없는 경우 옵션 2를 사용하면 새로운 것을 쉽게 추가 할 수 있습니다.

제작을 위해 두 가지 자원을 혼합하면 어떤 일이 일어날 지와 같은 상황을 고려해야하는 경우, 자원이 크게 다른 특성 (물통이 석탄 덩어리와 매우 다름) 또는 다른 복잡한 경제 상호 작용을 가질 수있는 경우, 접근법 1은 엔진에는 훨씬 유연하지만 데이터에는 적합하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.