2017-02-28 4 views
0

OpenTK (OpenGL)을 사용하여 C#으로 게임 엔진을 만듭니다. 내 게임의 업데이트 시스템은 이벤트 대기열에서 작동합니다. 무언가가 발생하면 이벤트 대기열에 추가됩니다. 각 이벤트에는 일련의 트리거와 일련의 작업이 있습니다.if 문을 문자열로 저장하는 방법은 무엇입니까? C#

플레이어가 걷는다고 가정 해 봅시다. 'PlayerWalked'트리거가 실행됩니다. 목록에 'PlayerWalked'트리거가있는 게임의 모든 이벤트가 대기열에 추가됩니다.

이제 게임의 업데이트 기능을 몇 초에 한 번씩 호출합니다. 호출 될 때마다 대기열에서 가장 오래된 이벤트가 실행됩니다. 이벤트의 조치 목록에있는 모든 조치가 실행됩니다.

이제 조건 시스템을 추가하고 싶습니다. 방아쇠 'PlayerWalked'에, 다만 그것을 명부에 추가하기보다는 오히려 방아쇠를 검사하고, 조건을 검사하고, 그 후에 그것을 너무 큐 추가한다.

예 :

이벤트 이름 :합니다 Event1
트리거 : 'ChestOpened', 'PlayerDigs'
조건 : 플레이어 위치는 1 일 (2D 게임)에서이다.
액션 : 플레이어에게 10 골드를줍니다.

이제 트리거 검사 및 동작이 수행됩니다. 이제 조건을 추가하면됩니다. 여기 내 딜레마가 있습니다 :

지도를 저장할 때 이벤트 조건 파일에 조건을 저장하는 방법이 필요합니다. 파일에 다음과 같은 내용이 포함될 것이라고 생각했습니다. 'playerPosition | (1,1)' 하지만 매우 넓기 때문에 'playerPosition'변수가 존재하지 않을 수 있으며 이상하게 해석해야합니다.

질문 : 지도 파일 (문자열)에 conparisions (조건, if 문)을 어떻게 저장합니까?

자세한 정보 : 지도는 게임의 실행 파일 옆에있는지도 저장 폴더에 저장된 디렉토리입니다. 지도 폴더에는 이벤트를위한 폴더가 있습니다. events 폴더에는 각 이벤트에 대한 폴더가 있습니다. 각 이벤트 폴더에는 트리거에 대한 파일, 조건에 대한 파일 및 작업에 대한 파일이 있습니다. 트리거와 동작은 현재 작동하지만 조건은 내가 추가하려고하는 것입니다.

파일 구조 :

Maps (Directory) 
    Map1 (Directory) 
     Events (Directory) 
      Event1 (Directory) 
       Triggers (File) 
       Conditions (File) 
       Actions (File) 
      Event2 (Directory) 
       Triggers (File) 
       Conditions (File) 
       Actions (File) 
      Event3 (Directory) 
       Triggers (File) 
       Conditions (File) 
       Actions (File) 

나는 OpenGL을에 래퍼로 ​​OpenTK 사용하고 있지만 사운드 엔진은 아직 없다. 그것은 2D RPG 게임입니다.

편집 : 누군가가 내 관심을 끌었습니다. 나는 그것을 안다.
는 내가 뭘 부탁 해요 것은 어떻게

if (playerPosition == new Point(0, 0)) { } 

내가 변수에 구문 분석 및 저장 할 텍스트 파일로 변환 할 것인가? If 문을 변수에 저장하는 방법과 변수를 파일에 저장하는 방법은 무엇입니까?

는 해결 :

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web.Script.Serialization; 
using System.Windows.Forms; 

namespace Entropy 
{ 
    public partial class MainForm : Form 
    { 
     public MainForm() 
     { 
      InitializeComponent(); 

      a b = new a { s = ":D" }; 

      string json = new JavaScriptSerializer().Serialize(b); 

      Dictionary<string, object> c = (Dictionary<string, object>)new  JavaScriptSerializer().DeserializeObject(json); 
      MessageBox.Show(c["s"].ToString()); 
      //Out: ':D' 
     } 
    } 

    public class a 
    { 
     public string s = string.Empty; 
    } 
} 
+1

'public class PlayerAtPositionCondition'과 같은 것을 만들고 그것의 내부에있는'if '논리를 사용하는'public bool IsSatisfied()'메서드를 만들까요? 따라서'if' 문을 어딘가에 저장하는 대신 리플렉션을 통해 인스턴스화하기 위해 클래스 이름을 저장하거나 나중에'FactoryMethod' 패턴을 사용하여 적절한 클래스를 인스턴스화하는 데 사용할 수있는 코드를 저장하면됩니까? 각 조건에 맞는 클래스를 만들고 클래스에 인수를 전달하십시오. – Alisson

+0

글쎄, 많은 비교가있을 것입니다. PlayerLocation, PlayerHasInventoryItem, GameIsOver, GameHasStarted 등이 있습니다. 자, 저는이 모든 것에 enum을 사용할 수 있습니다. Mabey ... –

답변

1

는 문자열 비교를 저장 한 다음 코드로 선회 .... 그 전화는 컴파일러를 쓰고있다! 컴퓨터 과학이 당신의 등을 맞댄 있습니다!

도메인 지정 언어에 대해 알아볼 수있는 가장 간단한 컴파일러는 무엇입니까?

당신이있어 미니 언어는 매우 소형이다 : 그것은 단지 술어 (아마도 중첩 술어)

당신은 C# 컴파일러 파서/발전기를 볼 수 있습니다. 너는 너보다 먼저 독서를 즐긴다.

또는 이러한 중첩 된 조건자를 보유하는 클래스 구조를 만든 다음 json으로 serialize하고 json을 저장할 수 있습니다.

그래서 당신은

var condition = new Condition { 
    Object = Objects.Player, 
    Comparison = Comparisons.Equals, 
    Value = new Value { type = Position, innerValue = "2,1" } 
}; 

가있을 수 있습니다 그리고 당신은 당신이 저장할 수있는 문자열로 직렬화 ...

var json = new JavaScriptSerializer().Serialize(obj); 

을 그리고 당신은 JSON 직렬화를 해제하여 나중에 다시로드 할 수 있습니다 다시 개체로.

비교 대상에 대해 '평가'하는 방법이 있으며, 개체 계층 구조를 통해 계산 된 답을 계산합니다.

필자는 이전에 스크립트 언어를 참조하여 이런 종류의 작업을 수행했지만 Lua는 게임에서 이러한 유형의 활동에 널리 사용되지만 파이썬은 상호 운용성에도 적합합니다.

+0

고마워요! 이것은 내가 찾고 있었던 바로 그 것이다! –

+1

이 비슷한 질문을보십시오 : http://stackoverflow.com/questions/821365/how-to-convert-a-string-to-its-equivalent-linq-expression-tree –

+0

고마워! 나는 LINQ를 실제로 사용하지 않았기 때문에 그것에 익숙하지 않다. –