2012-05-29 23 views
5

Mam funkcję, która ustawia stan rysowania dla konkretnej płytki z innym kafelkiem. Płytka, która jest rysowana, zmieni się porównując płytki, które ją otaczają, a następnie odpowiednio zaktualizuje. Postaram się pokazać, że poniżejCzy istnieje sposób na wyjście z funkcji, która zwraca void?

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

gdy wykryje, że b graniczy go, musi aktualizować swój draw Państwie. Tak więc mam funkcję, która działa dla dużych i małych liter, z lewej strony i z prawej. Teraz trzeba zmodyfikować tę funkcję dzięki czemu może obsługiwać przypadek lewy-prawy, górny prawy przypadek, prawy dolny przypadek, itp itd. Tu jest mój funkcja

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); 
    } 

Powinno być dość wyjaśniająca, dlaczego chciałbym wyjść z tej funkcji, a może nie. Zasadniczo mam wyliczenie, które mówi mi, jaki jest mój stan rysowania (drawstate to enum). Czy ktoś może mi powiedzieć, czy mogę ustawić prawidłowy stan rysowania, a następnie wyjść z mojej funkcji?

+3

ci oznacza, że ​​chcesz zatrzymać swoją funkcję? jeśli to prawda, możesz użyć 'return;' dla niego –

Odpowiedz

17

Wystarczy użyć instrukcji return, gdzie chcesz zakończyć:

return; 

Więc w kodzie można zrobić:

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

Nie wiedziałem, że mogę użyć słowa kluczowego return na własną rękę, dziękuję. –

7

Po prostu użyj return; samodzielnie, to natychmiast "zwróci" z funkcji.

W przypadku refleksji czy naprawdę musisz wrócić?

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; 
    } 

To powinno ułatwić utrzymanie kodu w przyszłości.

+0

Carl pokonał konkurencję o 2 sekundy :) – Brady

+0

lol byłoby szybciej, gdyby nie było to minimum 30 znaków! :) –

+0

Tak, wierzę, że powinienem, ponieważ będę musiał ustawić stan górnej lewej strony, stan lewej dolnej itd. W zależności od tego, gdzie jest kafelek na mojej siatce. –

7

Można wyjść z funkcji z return.

+0

ah Nie wiedziałem, że możesz użyć słowa kluczowego return na własną rękę, czuję się teraz jak idiota, dziękuję. –

3

Możesz użyć return; w dowolnym punkcie funkcji, a następnie opuści funkcję tam, a następnie. Używanie zwrotu oznaczałoby, że twoja funkcja podstawowa byłaby nazwana , a nie. Jeśli potrzebujesz funkcji bazowej nazwać stosowanie else if wtedy, gdy jesteś warunek jest spełniony, nie będzie sprawdzić pozostałe if:

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

To - nawet jeśli nie chcesz wywoływać funkcji 'base', po prostu zapisz ją w innym miejscu. Te 'else if's są dużo łatwiejsze do naśladowania niż wiele' return'ów kropkowanych. – Rawling

+0

pokonałeś mnie 2 sekundy –

0

korzystanie return; funkcja zwróci jako pustkę

Powiązane problemy