2012-03-29 1 views
1

Моя основная проблема: я не понимаю, как получить позицию сгенерированных фрагментов или как определить, где находится мышь. Должен ли я использовать столкновение для обнаружения мыши или чего-то еще? Есть ли что-то, что я могу сделать, чтобы оптимизировать мой код и облегчить получение таких вещей, как позицияЛучший способ сделать выбор мыши на случайно сгенерированных плитах

Я взял некоторые вещи из своего кода, например, загружая текстуры, чтобы сделать их короче для вас, потому что это не так. часть проблемы.

Моя Tile генерация кода

public Block[] tiles = new Block[3]; 
    public int width, height; 
    public int[,] index; 
    public Rectangle tileRect; 

public void Load(ContentManager content) 
    { 
     tiles[0] = new Block { Type = BlockType.Grass, Position = Vector2.Zero, texture = grass}; 
     tiles[1] = new Block { Type = BlockType.Dirt, Position = Vector2.Zero, texture = dirt}; 

     width = 50; 
     height = 50; 

     index = new int[width, height]; 

     Random rand = new Random(); 
     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
       index[x,y] = rand.Next(0,2); 
      } 
     } 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
        spriteBatch.Draw(tiles[index[x,y]].texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
         Color.White);   
      } 
     } 
    } 

дублирующих Код

public enum BlockType 
{ 
    Dirt, 
    Grass, 
    Selection 
} 

public class Block 
{ 
    public BlockType Type { get; set; } 
    public Vector2 Position { get; set; } 
    public Texture2D texture { get; set; } 
} 

ответ

1

Этот код должен делать трюк. Вы можете добавить этот метод в свой класс генерации плитки. (Непроверено)

public bool IsMouseInsideTile(int x, int y) 
{ 
    MouseState MS = Mouse.GetState(); 
    return (MS.X >= x * 64 && MS.X <= (x + 1) * 64 && 
     MS.Y >= y * 64 && MS.Y <= (y + 1) * 64); 
} 

Вы можете отредактировать эту функцию, но вы хотите подгонять ее под свои нужды.

Редактировать: Я немного объясню этот код.

  • Mouse.GetState() получает текущее положение мыши, как Vector2

  • Плитка [a ,b] находится в положении [a * 64, b * 64], так как ваш метод рисования говорит

  • плитке Макс координаты х и у находится на [(a + 1) * 64, (b + 1) * 64], так как текстура 64 by 64 pixels размеров.

  • Я проверяю, находится ли мышь внутри каждой плитки. Вы можете добавить событие MouseHover, если хотите.

Больше редактирует: Отредактированные мой код, основанный на ваш комментарий.

Еще больше правок: Вот код для метода Draw:

public void Draw(SpriteBatch spriteBatch) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
        spriteBatch.Draw(tiles[index[x,y]].texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
         Color.White); 
        if(IsMouseInsideTile(x, y)) 
         spriteBatch.Draw(selected.texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
             Color.White); 
      } 
     } 
    } 
+0

Это действительно полезно, и это работает до некоторой степени, но я не понимаю, как просто получить один фрагмент, он удаляет все плитки с одинаковой текстурой. Это происходит, когда я делаю плитки [index [x, y]]. Texture = selection; Я бы хотел, чтобы это было нарисовано в методе draw, но я не понимаю, что использовать для Rectangle, чтобы получить позицию этой точной плитки, потому что плитки [index [x, y]]. Position.X и Y doesn 't work – Corey

+0

Кроме того, если вы пытаетесь добавить текстуру «Выбранные», вы должны нарисовать ее ** поверх ** выбранной плитки: она будет намного проще, чем временно заменить текстуру выбранной плитки. – Msonic

+0

Да, но прямо сейчас я просто пытаюсь получить квадратную текстуру выбора, чтобы нарисовать поверх плитки, которую я текуще замалчивает над – Corey

1

В функции XNA Update, вы можете получить позицию мыши с помощью Mouse.GetState (), который даст вам координаты X и Y мыши. Просто разделите их по размеру плитки и округлите (пол), чтобы получить самый близкий индекс координаты плитки.

Добавлено Код

public static Vector2 GetGridCoordinates(MouseState mouseState, int gridSize){ 
    return new Vector2(
     (int)Math.Floor(mouseState.X/gridSize), 
     (int)Math.Floor(mouseState.Y/gridSize) 
    ); 
} 

Вы могли бы даже сделать это функция расширения класса MouseState, так что все вы должны сделать, это что-то вроде:

Vector2 gridCoords = Mouse.GetState().GetGridCoordinates(MyGridSize); 

Но я m, вероятно, передумал ...

+0

Мне нравится это лучше, чем принято отвечать. Нет необходимости делать двойной цикл O (n^2) и проверять каждую плиту, пока вы не нажмете ее, когда сможете начать с положения мыши, и точно знать, какое пятно плитки оно находится с вычислением O (1). Не только это, но и принятый ответ запрашивает положение мыши на каждой итерации цикла, что не нужно. Я редактирую код, чтобы ответить, если плакат нуждается в этом, никогда не делал этого раньше, но я думаю, что дам ему шанс? –

+0

@ A-Type Проблема с производительностью была решена в другом вопросе. Я изменил код здесь, чтобы отразить это обновление. – Msonic

+0

@ A-Type: Спасибо за комментарий! Я использовал код на нескольких языках, который использует этот алгоритм. Он легко читается и использует общие математические функции. Похоже, что так и работает. – irrationalistic