2017-09-01 8 views
0

Je veux mettre en surbrillance les dalles à la portée d'une unité qui est placée dans un système de dalles hexagonales. Par exemple si je place une unité avec range = 2 sur 6 | 5, je veux mettre en évidence 5 | 4, 6 | 4, 7 | 4, 7 | 5, 6 | 6, 5 | 5, 4 | 5, 4 | 4, 5 | 3 et ainsi de suite ...Obtenir les coordonnées des dalles hexagonales adjacentes dans un système de coordonnées

example map

Comment puis-je calculer les coordonnées de l'origine des coordonnées et la gamme? En ce moment j'utilise beaucoup si des clauses pour vérifier toutes les possibilités comme ceci:

if (gameField[x, y].IsHighlighted && gameField[x, y].DeployedUnit != null) 
{ 
    if (gameField[x, y].DeployedUnit.AttackRange > 0) 
    { 
     if (x % 2 == 0) 
     { 
      if (x > 0 && y > 0) 
       { 
         gameField[x - 1, y - 1].IsGreenRange = true; 
       } 
       if (x > 0) 
       { 
         gameField[x - 1, y].IsGreenRange = true; 
       } 
       if (y < height - 1) 
       { 
         gameField[x, y + 1].IsGreenRange = true; 
       } 
       if (x < length - 1) 
       { 
         gameField[x + 1, y].IsGreenRange = true; 
       } 
       if (x < length - 1 && y > 0) 
       { 
         gameField[x + 1, y - 1].IsGreenRange = true; 
       } 
       if (y > 0) 
       { 
         gameField[x, y - 1].IsGreenRange = true; 
       } 
     } 
     else 
     { 
       [...] 
     } 
    } 
} 

Mais lorsque la portée augmente, la complexité augmente aussi ... Il doit y avoir une meilleure façon. Des idées?

Répondre

1

Récursivité. Même chose que pour éclairer les hexagones que vous pouvez atteindre par le mouvement.

+0

En outre, cet article est sans doute utile d'avoir un regard sur: [Naidamast] (https://www.codeproject.com/Articles/1119973/Part-I-Creating-a-Digital-Hexagonal- Tuile-Carte) – MartinB

0

Grâce à MartinB, j'ai essayé l'approche récursive et ça a marché comme un charme. :)

private void HighlightRange(int originX, int originY, int range, bool greenRange = true) 
     { 
      if (range > 0) 
      { 
       List<Tuple<int, int>> hexCoordinates = new List<Tuple<int, int>>(); 
       if (originX % 2 == 0) 
       { 
        hexCoordinates.Add(new Tuple<int, int>(originX, originY - 1)); 
        hexCoordinates.Add(new Tuple<int, int>(originX - 1, originY - 1)); 
        hexCoordinates.Add(new Tuple<int, int>(originX - 1, originY)); 
        hexCoordinates.Add(new Tuple<int, int>(originX, originY + 1)); 
        hexCoordinates.Add(new Tuple<int, int>(originX + 1, originY)); 
        hexCoordinates.Add(new Tuple<int, int>(originX + 1, originY - 1)); 
       } 
       else 
       { 
        hexCoordinates.Add(new Tuple<int, int>(originX, originY - 1)); 
        hexCoordinates.Add(new Tuple<int, int>(originX - 1, originY)); 
        hexCoordinates.Add(new Tuple<int, int>(originX - 1, originY + 1)); 
        hexCoordinates.Add(new Tuple<int, int>(originX, originY + 1)); 
        hexCoordinates.Add(new Tuple<int, int>(originX + 1, originY + 1)); 
        hexCoordinates.Add(new Tuple<int, int>(originX + 1, originY)); 
       } 
       hexCoordinates.RemoveAll(t => (t.Item1 < 0 || t.Item1 >= length || t.Item2 < 0 || t.Item2 >= height)); 

       while (hexCoordinates.Count > 0) 
       { 
        if (range > 1) 
        { 
         HighlightRange(hexCoordinates[0].Item1, hexCoordinates[0].Item2, range - 1, greenRange); 
        } 
        if (greenRange) 
        { 
         gameField[hexCoordinates[0].Item1, hexCoordinates[0].Item2].IsGreenRange = true; 
        } 
        else 
        { 
         gameField[hexCoordinates[0].Item1, hexCoordinates[0].Item2].IsRedRange = true; 
        } 
        hexCoordinates.RemoveAt(0); 
       } 
      } 
      else 
      { 
       return; 
      } 
     }