Prüfen ob Barriere zwischen 2 benachbarten Hexagons liegt



  • Hi, ich habe in meinem Projekt ein Labyrinth, welches aus Hexagonen besteht, aufgebaut. Hier sieht man 2 teile mit jeweils einer öffnung.

    Ich möchte nun eine Figur von einem Teil ins nächste bewegen und hab folgende Funktion für die Wand-Kollision geschrieben:

    isWallInTheyWay(CardinalDirection:String) {
       //...
       //standOnHex=Hexagon auf dem Figur steht, blau makiert im Bild
       //walkToHex =Nachbar im Osten
       if(CardinalDirection == EAST) {
          if(standOnHex == null) {   //Wenn hexagon null ist, dann gibt es auch keine Wand
             if(walkToHex == null) {
                return false;
             }
             else if (walkToHex.isSideOpen(WEST)) {
                return false;		
             }	
          }
          else if(standOnHex.isSideOpen(EAST)) {
             if(walkToHex == null) {
                return false;
             }
             else if (walkToHex.isSideOpen(WEST)) {
                return false;		
             }					
          }
       }
       //...weitere 5 himmelsrichtungen?
       return true;
    }
    

    Der Code Ausschnitt ist jetzt nur für die Himmelsrichtung von Ost nach West. Bevor ich jetzt für die anderen Himmelsrichtungen den Code 5 weitere male kopiere und leicht modifiziere, wollte ich hier nach einer eleganten Lösung für evtl. kürzeren Code fragen. Das ganze ist nicht c++, aber doch sehr ähnlich zu c++.

    Danke
    MfG
    Dudeldu


  • Mod

    Du schreibst eine Funktion, die dir zu einer Himmelsrichtung die entgegengesetzte Richtung angibt. Dann wird dein Code zu:

    isWallInTheyWay(CardinalDirection:String) {
       //...
       //standOnHex=Hexagon auf dem Figur steht, blau makiert im Bild
       //walkToHex =Nachbar im Osten
       OppositeDirection = GetOppositeDirection(CardinalDirection);
       if(standOnHex == null) {   //Wenn hexagon null ist, dann gibt es auch keine Wand
             if(walkToHex == null) {
                return false;
             }
             else if (walkToHex.isSideOpen(OppositeDirection)) {
                return false;      
             } 
          }
          else if(standOnHex.isSideOpen(CardinalDirection)) {
             if(walkToHex == null) {
                return false;
             }
             else if (walkToHex.isSideOpen(OppositeDirection)) {
                return false;      
             }                 
       }
       return true;
    }
    

    Wobei ich es übrigens äußerst ungeschickt finde, Himmelsrichtungen als String zu modellieren. Das schreit geradezu nach einem enum.



  • Hi!
    Funktioniert, danke!

    SeppJ schrieb:

    Wobei ich es übrigens äußerst ungeschickt finde, Himmelsrichtungen als String zu modellieren. Das schreit geradezu nach einem enum.

    Dudeldu schrieb:

    Das ganze ist nicht c++, aber doch sehr ähnlich zu c++.

    [...]ActionScript 3.0 does not support a specific enumeration facility, unlike C++ with its enum keyword or Java with its Enumeration interface.[...]

    Es gibt aber ein ähnliches äquivalent mit klassen und konstanten(siehe link), was ich jetzt auch verwendet habe, dennoch bleibt der Datentyp ein String.


  • Mod

    Aber Ganzzahldatentypen wird es doch wohl geben, oder? Ob man nun

    enum Direction
    {
      North,
      Northeast,
      Southeast,
      South,
      Southwest,
      Northwest
    };
    

    oder

    typedef int Direction;
    
    const int North = 0;
    const int Northeast = 1;
    const int Southeast = 2;
    const int South = 3;
    const int Southwest = 4;
    const int Northwest = 5;
    

    oder dessen Actionscript-Äquivalent schreibt, macht doch keinen großen Unterschied. Ist aber alles besser als String.


Log in to reply