2013-06-02 2 views
0

모노 게임 (XNA)에서 학습용으로 간단한 2 차원 스크롤링 게임을 만들려고합니다. 현재 텍스트 파일에서 타일 정보를로드하여 타일이 쓰여지는 위치에 대한 정보를 저장하는 타일 객체와 배열 (tiles [,])을 만들고 draw 메소드가 호출 될 때 어떤 텍스쳐가 사용되어야합니다. 현재 배열의 모든 타일을 한 번에 그려서 타일을 화면 전체로 이동시키는 위치를 간단히 업데이트합니다. 분명히 모든 타일을 한꺼번에 마시는 것은 약간의 고통이며, 타일을 화면에서 볼 때 그리면 더 좋을 것이라고 생각합니다. 타일이 화면을 가로 질러 이동하면 더 많은 타일이 그려집니다. 어떻게해야 할 지 잘 모르겠다. 나는 어떻게 타일을 그려야 하는지를 알 수있는 방법에 관해서는 약간 분실되었다. 도움을 주시면 대단히 감사하겠습니다. 여기 내 레벨 클래스의 그리기 및 업데이트 메소드가 있습니다. 간단히 Tile 클래스의 메소드를 호출하여 위치를 그리거나 업데이트합니다. 지금 화면에 보이는 타일을 통해 단지 루프를 시도하고 사전화면에 타일 (스프라이트) 만 그리는 방법

/// <summary> 
    /// Draws each individual tile in the level. 
    /// </summary> 
    private void DrawTiles(SpriteBatch spriteBatch) 
    { 
     // For each tile position 
     for (int y = 0; y < Height; ++y) 
     { 
      for (int x = 0; x < Width; ++x) 
      { 
       tiles[x, y].Draw(spriteBatch); 
      } 
     } 
    } 



    public void Update(GameTime gameTime, int scrollSpeed, ScrollDirection direction) 
    { 
     // Update the positions of each of the Background sprites 
     foreach (Tile tile in tiles) 
     { 
      tile.Update(gameTime, new Vector2(0, scrollSpeed), scrollDirection); 
     } 
    } 
} 

덕분에 그래픽 장치에서 전달 된 뷰포트를 사용하여 그립니다. 나는 기본적으로 화면의 높이를 타일의 높이로 그리고 너비를 너비로 나누어 그려주기 전에 화면에 맞을 수있는 타일 수를 얻으려고합니다. 이것은 잘 동작하며, 모든 타일을 시점에서 볼 수있게 그립니다.

유일하게 문제는 뷰포트 외부에서 시작된 타일을 더 이상 그리지 않으므로 루프가 원래 위치를 사용함에 따라 업데이트 타일에서 뷰포트로 이동하더라도 그려지지 않습니다. 수준이 만 화면에 무엇 그리는 모든 타일을 통해 루프 매우 비효율적 큰 수 있듯이 나는 :-(

하지만 모든 타일을 통해 반복하지 않고이 문제를 해결하는 방법을 생각하지 못할.

어떤 조언을 주시면 감사하겠습니다 여기

업데이트 된 무승부이다.

private void DrawTiles(SpriteBatch spriteBatch) 
    { 
     float tileWidth = 40; 
     float tileHeight = 32; 


     for (int y = 0; y < (int)Math.Ceiling(mViewport.Height/tileHeight); ++y) 
     { 

      for (int x = 0; x < (int)Math.Ceiling(mViewport.Width/tileWidth); ++x) 
      { 
       tiles[x, y].Draw(spriteBatch); 
      } 
     } 
    } 
+0

간단한 2D 카메라 예를 X 및 Y 속성을 필요 http://pastebin.com/jrGXWfNh 그것은 단지 카메라가 무엇을 보여 그것은 그려진 사각형 작동하는 방법 참조로. 아주 이해하기 쉽도록 상당히 간단합니다. 그런 다음 화면에 한계가 있음을 알게되면 카메라가있는 곳을 확인하고 다른 사각형이 화면의 "내부"에 있는지 확인한 다음 그리거나 그리지 않습니다. – Deukalion

+0

감사합니다 Deukalion, 나는 그것을 얻을 것 같아요. –

답변

1

당신은 당신의 카메라에 대한 정보가 필요하면 카메라가 화면 크기, 당신은 할 수 무엇을 중심에 있고 무엇을 알고있는 경우. 다음과 같은 무승부 전화 :

private void DrawTiles(SpriteBatch spriteBatch) 
{ 
    // For each tile position 
    for (int y = cameraOffset.Y - screenHeight/2; y < cameraOffset.Y + (int)Math.Ceiling(screenHeight/2); ++y) 
    { 
     for (int x = cameraOffset.X - screenWidth/2; x < cameraOffset.X + (int)Math.Ceiling(screenWidth/2); ++x) 
     { 
      tiles[x, y].Draw(spriteBatch); 
     } 
    } 
} 

내가 Math.Ceiling을 사용하는 이유는 부분적으로 화면에 타일이있는 경우를 커버하는 것입니다. 반대쪽에있는 Math.Floor는 정수부이므로 암시됩니다.

여기서는 cameraOffset, screenWidth 및 screenHeight가 타일 단위임을 가정합니다. 그렇지 않은 경우 적절하게 변환하십시오.

+0

다시 한번 감사드립니다. Mike, 나는이 개념의 카메라로는 길을 잃었습니다.현재 배열 위치에 따라 타일 위치를 지정하고 다음에 따라 타일 위치를 변경합니다. theSpriteBatch.Draw (mSpriteTexture, Position * sizeVector, Color.White); 카메라 설정에 대한 내 머리를 for을 수있는 자습서를 알고 있습니까? –

+0

이 예제에서는 카메라가 화면 중앙에 있으므로 그냥 플레이어 위치 나 다른 곳으로 변경하십시오. – Cyral

+0

@Pectus Excavatum spriteBatch에서 세계에 대한 행렬을 설정하면 전체 "2D 화면". 화면이 400x400이고 카메라가 X = 0, Y = 0 인 경우 모든 것을 0, 400, 400으로 렌더링하기 시작합니다. 크기를 조절하거나 회전하지 않는 한. Matrix camera = Matrix.CreateScale (Zoom) * Matrix.CreateRotationZ (MathHelper.ToRadians (Degree)) * Matrix.CreateTranslation (PositionX, PositionY, 0); 그리고 당신은 단지 당신이 보여주고 자하는 무엇이든 그 위치를 조정합니다. 이제 400, 0 (렌더링되지 않음)에 객체의 위치를 ​​설정할 수 있지만 카메라를 약간 이동하면 표시됩니다. – Deukalion

0

창 너비와 높이를 저장하는 WINDOW_WIDTH 및 WINDOW_HEIGHT라는 상수를 만듭니다. 그런 다음 표시 한 타일을 WINDOW_WIDTH 및 WINDOW_HEIGHT 값 내의 타일로만 그립니다. 또한 타일 클래스에 내가 방금 만든

private void DrawTiles(SpriteBatch spriteBatch) 
{ 
    float tileWidth = 40; 
    float tileHeight = 32; 


    for (int y = 0; y < (int)Math.Ceiling(mViewport.Height/tileHeight); ++y) 
    { 

     for (int x = 0; x < (int)Math.Ceiling(mViewport.Width/tileWidth); ++x) 
     { 
      if (tiles[x, y].X <= WINDOW_WIDTH && 
       tiles[x, y].X >= 0 && 
       tiles[x, y].Y <= WINDOW_HEIGHT && 
       tiles[x, y].Y >= 0) 
      { 
       tiles[x, y].Draw(spriteBatch); 
      } 
     } 
    } 
} 
관련 문제