2012-05-29 2 views
5

Ich habe eine Funktion, die einen Zeichnungszustand für eine bestimmte Kachel bei einer anderen Kachel setzt. Die Kachel, deren Draw-Status geändert wird, vergleicht die Kacheln, die sie umgeben, und aktualisiert sie entsprechend. Ich werde versuchen, das zu veranschaulichen unterGibt es eine Möglichkeit, aus einer Funktion auszubrechen, die void zurückgibt?

[b] [b] [a] 
[b] [a] [a] 
[a] [a] [a] where a = sand && b = water 

, wenn ein feststellt, dass b grenzt es, muss es seinen Einzug Zustand zu aktualisieren. Also habe ich eine Funktion, die für einen Groß-, Klein-, Links- und Rechtsfall funktioniert. Ich muß jetzt diese Funktion ändern, so kann es einen Links-Rechts-Fall oben rechts Fall unten rechts Fall behandeln, etc. etc. Hier ist meine Funktion

public override void CompareBorderingTiles(Tile T) 
    { 
     if (T is Water) 
     { 
      float leftBound = location.X - (Tile.TileWidth * Tile.TileScale); 
      float rightBound = location.X + (Tile.TileWidth * Tile.TileScale); 
      float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale); 
      float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale); 
      if (T.GridLocation.X == leftBound) 
      { 
       drawstate = DrawState.Left; 
      } 
      if (T.GridLocation.X == rightBound) 
       drawstate = DrawState.Right; 
      if (T.GridLocation.Y == upperBound) 
       drawstate = DrawState.Upper; 
      if (T.GridLocation.Y == bottomBound) 
       drawstate = DrawState.Lower; 
     } 

     base.CompareBorderingTiles(T); 
    } 

ist es sein sollte ziemlich erklärend, warum Ich möchte aus dieser Funktion ausbrechen oder auch nicht. Grundsätzlich habe ich eine Enum, die mir sagt, was mein Draw-Zustand ist (Drawstate ist das Enum). Kann mir jemand sagen, ob ich den richtigen Zeichnungszustand einstellen kann und dann meine Funktion verlassen kann?

+3

Sie meinen Sie wollen Ihre Funktion stoppen? wenn es wahr ist, können Sie 'return;' dafür verwenden –

Antwort

17

Verwenden Sie einfach eine return-Anweisung, wo Sie enden soll:

return; 

in Ihrem Code So könnten Sie tun:

public override void CompareBorderingTiles(Tile T) 
{ 
    if (T is Water) 
    { 
     float leftBound = location.X - (Tile.TileWidth * Tile.TileScale); 
     float rightBound = location.X + (Tile.TileWidth * Tile.TileScale); 
     float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale); 
     float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale); 
     if (T.GridLocation.X == leftBound) 
     { 
      drawstate = DrawState.Left; 
      return; 
     } 
     if (T.GridLocation.X == rightBound) 
     { 
      drawstate = DrawState.Right; 
      return; 
     } 
     if (T.GridLocation.Y == upperBound) 
     { 
      drawstate = DrawState.Upper; 
      return; 
     } 
     if (T.GridLocation.Y == bottomBound) 
     { 
      drawstate = DrawState.Lower; 
      return; 
     } 
    } 

    base.CompareBorderingTiles(T); 
} 
+0

Ich wusste nicht, dass ich das Return-Schlüsselwort so verwenden könnte, danke. –

7

Verwenden Sie einfach return; für sich, das wird sofort von der Funktion "zurückkehren".

Auf die Reflexion müssen Sie wirklich zurückkehren?

if (T.GridLocation.X == leftBound) 
    { 
     drawstate = DrawState.Left; 
    } 
    else if (T.GridLocation.X == rightBound) 
    { 
     drawstate = DrawState.Right; 
    } 

    else if (T.GridLocation.Y == upperBound) 
    { 
     drawstate = DrawState.Upper; 
    } 
    else if (T.GridLocation.Y == bottomBound) 
    { 
     drawstate = DrawState.Lower; 
    } 

Das sollte den Code in Zukunft leichter zu pflegen machen.

+0

Carl schlug die Konkurrenz um 2 Sekunden :) – Brady

+0

lol es wäre schneller gewesen, wenn es nicht für die 30 Zeichen Minimum gewesen wäre! :) –

+0

Ja, ich glaube, dass ich sollte, weil ich einen Zustand oben links, unten links usw. abhängig davon, wo die Kachel auf meinem Gitter ist, setzen muss. –

7

Sie können eine Funktion mit return verlassen.

+0

ah Ich wusste nicht, dass du das Rückgabeschlüsselwort für sich selbst verwenden könntest, ich fühle mich jetzt wie ein Idiot, danke. –

3

Sie könnten return; an einem beliebigen Punkt in der Funktion verwenden und es wird die Funktion dort und dann verlassen. Die Verwendung der Rückgabe würde bedeuten, dass Ihre Basisfunktion nicht aufgerufen werden würde. Wenn Sie die Basisfunktion erforderlich werden Verwendung genannt else if dann, wenn Sie Bedingung sind erfüllt ist, wird es die übrigen, wenn Aussagen nicht überprüfen:

public override void CompareBorderingTiles(Tile T) 
    { 
     if (T is Water) 
     { 
      float leftBound = location.X - (Tile.TileWidth * Tile.TileScale); 
      float rightBound = location.X + (Tile.TileWidth * Tile.TileScale); 
      float upperBound = location.Y - (Tile.TileHieght * Tile.TileScale); 
      float bottomBound = location.Y + (Tile.TileHieght * Tile.TileScale); 
      if (T.GridLocation.X == leftBound) 
      { 
       drawstate = DrawState.Left; 
      } 
      else if (T.GridLocation.X == rightBound) 
       drawstate = DrawState.Right; 
      else if (T.GridLocation.Y == upperBound) 
       drawstate = DrawState.Upper; 
      else if (T.GridLocation.Y == bottomBound) 
       drawstate = DrawState.Lower; 
     } 

     base.CompareBorderingTiles(T); 
    } 
+0

Dies - auch wenn Sie die Funktion "base" nicht aufrufen möchten, wickeln Sie sie einfach in eine else ein. Diese 'sonst wenn' sind viel einfacher zu folgen als viele 'zurückgesprungene Punkte. – Rawling

+0

schlägst du mich um 2 Sekunden –

0

Verwendung return; die Funktion als ungültig zurück

Verwandte Themen