2017-04-24 1 views
1

좋아, 우선, 여기에 내 첫 번째 게시물이며 일반적으로 얻을 수 있고 간단히 대답을 검색 할 수 있습니다. 이 답변을 찾을 수 없습니다.roguelike 엔진에 대한 간단한 타일 맵에 관한 문제

저는 코딩의 초보자입니다. (저는 주로 기초를 알고 많은 비디오를 보았고 C#에 관한 많은 자습서를 읽었습니다) ASCII 콘솔 "게임"을 코딩하려고합니다. 모든 것이 잠시 동안 꽤 잘 진행되었지만 이제는 매핑 부분에 붙어 있습니다. 처음에는 모든 좌표를 수동으로 벽에 입력 할 것이라고 생각했습니다. 그러나 나는 그것을 더 많은 객체 지향적 인 방법으로 그렇게 Tile 클래스를 생성하는 것이라고 설명하는 게시물을 발견했다. I 콘솔의 특정 부분에 타일을 제한하기 때문에

public class Tile 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public bool IsWall { get; set; } 
} 

다음 홀수 시작 X와 Y 값이

private static void PopulateTiles() 
    { 
     for (int x = 1; x < 159; x++) 
      for (int y = 3; y < 45; y++) 
       Tiles.Add(new Tile { X = x, Y = y }); 
    } 

이유를 수행하여 목록을 채우는이고, 나머지는 사용 GUI 용.

더 좋은 방법이 없다면 (그리고 그럴 수 있어야합니다.) 나는 그 목록의 일부만 검색하여 ISWALL 속성을 TRUE로 설정 한 후 나는 또한 가능하면, 프로그램을 늦추고 방지하기 위해 노력하고있어 (이

static void DrawObstacles() 
    { 
     foreach (Tile tile in World.Tiles) 
     { 
      if (tile.IsWall) 
      { 
       Console.SetCursorPosition(tile.X, tile.Y); 
       Console.Write("#"); 
      } 
     } 
    } 

지금까지, 나는 몇 가지 다른 솔루션을 시도했지만 분명히, 내가 그들 각각의 문제로 실행 사용 , 반복 횟수가 1000 회 이상인 다른 루프는 피하십시오. 지금 그래서

//Tried this 
    private static void SetWalls() 
    { 
     int[] walls = new int[] { }; 
     walls += Tiles.GetRange(0, 7); //Fails because I cannot use tiles in an int[]... of course 
    } 

    //This 
    List<Tile> walls = new List<Tile>(); 
    List<Tile> walls = Tiles.GetRange(0, 7); 
    List<Tile> walls = Tiles.GetRange(19, 7; //Doesn't work either but I've no idea why here 

    //And finally 
    List<Tile> walls = new List<Tile>(); 
    walls.Add(Tiles[Tiles.GetRange(0, 7)]); //Gives me an error saying that System.Collections.Generic.List<Engine.Tile> cannot be converted to int 

, 난 빌드 "이 넘어서 난 정말 반복하는을 ... 모든이 2 차원 배열을 수동으로 조정하지 않고 입력하는 것보다, 목록을 반복하는 것을 선호하고 것 때문에 손실 조금 "벽.

내 질문에 : 목록의 일부만 (예 : 색인 0-7, 19-26, 29, 31, 35-46) 검색 할 수 있고 이것을 사용하려면 기본 타일 목록을 반복 할 수 있습니까? 그 인덱스에서 타일의 ISWALL 속성을 변경하려면 새로운 "인덱스 목록"... 그게 합리적이라면.

미리 감사 드리며 게시물에 실수를 저 지르더라도 알려주십시오.

+0

나는 이것을 읽지 못했습니다. 당신의 질문은 정확히 무엇입니까? – Smartis

+0

기본적으로 타일 목록을 반복하고 일부만 선택하여 ISWALL 속성을 TRUE로 설정할 수 있기를 원합니다. 타일 ​​0-7, 19-26 등과 같은 특정 범위 만 선택하면됩니다. 그것이 의미가있는 경우 – Schaezar

+1

타일을 80x25 형식으로 저장하지 않았습니까? 화면 출력을 모방 중입니까? 그게 네 인생을 더 편하게 해 줄거야. 네가 방을 제대로 만들려고한다고 생각하니? (나는 로게 엘 게임에서 내 삶을 너무 많이 보냈다.) – BugFinder

답변

0

많은 불필요한 정보가 있으므로 질문을 이해하기 어렵습니다. 그러나, 당신은 단순히 몇 가지를 찾기 위해 모든 게임 객체를 반복하고 싶지 않은 것처럼 보입니다. 이것은 게임에서 주로 충돌하는 문제입니다. 나는 당신이 콘솔에서이 게임을 만들고 있다고 가정하고 있습니다. 그래서 어떤 게임 엔진 기능도 당신의 마음에 들지 않을 것입니다.

그래서 저는 여러분의 개체가 중요성이나 기능에 따라리스트를 깰 가능성이 있음을 제안합니다. 이렇게하면 시작할 때 모든 게임 개체를 반복해서 실행 한 다음 실행 중에 처리가 끝나지 않게 할 수 있습니다.

예를 들어, 당신은 너무 맘에 드는 모든 것을 초기화 할 수 있습니다 :

List<GameObject> GameObjects { get; set; } 
    List<GameObject> Walls { get; set; } 
    List<GameObject> Items { get; set; } 

    public Map() 
    { 
     PopulateTiles(); 
     StructureCollections(); 
    } 

    //Small processing loop 
    private void DrawObstacles() 
    { 
     foreach(var wall in Walls) 
     { 
      Console.SetCursorPosition(tile.X, tile.Y); 
      Console.Write("#"); 
     } 
    } 

    //Called only on startup 
    private void PopulateTiles() 
    { 
     for (int x = 1; x < 159; x++) 
      for (int y = 3; y < 45; y++) 
       GameObjects.Add(new GameObject() { X = x, Y = y }); 
    } 

    //Called only on starup 
    private void StructureCollections() 
    { 
     foreach(GameObject gameObj in GameObjects) 
     { 
      if (gameObj.IsWall) 
       Walls.Add(gameObj); 

      if (gameObj.IsItem) 
       Items.Add(gameObj); 
     } 
    } 

이 완벽한 해결책이 아니다, 모든 정말 당신이 당신의 게임을 실행 계획 방법에 따라 달라집니다. 그러나 나는 그것이 아이디어를위한 좋은 출발이라고 생각한다.

업데이트 : 게임 개체를 수작업으로 만드는 대신 게임 개체를 만들 수있는 더 나은 방법을 찾고 싶다면 개체를 더 많은 클래스로 나눌 수 있습니다.예를 들어 : 이제이 경우

public class GameObject 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
    public bool IsWall { get; set; } 

    public GameObject(int x, int y) 
    { 
     X = x; 
     Y = y; 
    } 

} 

public class Wall : GameObject 
{ 
    public Wall(int x, int y) : base(x,y) 
    { 
     IsWall = true; 
    } 
} 

, 당신은 더 많은 매개 변수를 필요로하지 않고,이 벽으로 작동하는 데 필요한 모든 것을 처리 할 새로운 new Wall(x, y);를 요구해야합니다.

업데이트 : 이것은 답변으로 받아 들여지기 때문에이 답변은 작고 구체적인 문제에 대한 것임을 지적해야합니다. 만약 당신이 자신의 클래스를 필요로하는 많은 객체들을 가지게된다면, 이것은 최상의 메소드가 아닙니다 ("Wall"은 자신의 클래스입니다). 우리가 더 많은 물체를 갖게된다면이 디자인은 계급 폭발을 초래할 것입니다.

+0

정확히 그걸하고 싶습니다, 그러나 IsWall 속성을 변경하는 방법을 모르겠습니다 (다음과 같은 명령문을 사용하여 수동으로 입력하는 것 외 : gameObjects.Add (새 GameObject (X, Y, true) 벽이되는 모든 타일에 대해 ... 건조하지 않으며 각 문장에 대해 100 줄의 코드를 사용하게됩니다. – Schaezar

+0

업데이트 된 게시물 확인 – Toskr