# [Java] Vereinfachung von Boolean Abfragen



## GentleXD (25. Mai 2018)

Hallo, ich habe mal eine Frage,

folgendes ich habe Texturen in einem 2 Dimensionalen Array gespeichert. Jetzt werden diese verändert in Bezug auf ihre direkten Nachbarn Also wenn z.b. der linke Nachbar unsichtbar oder garnicht existiert ändert die momentane Texture ihre Struktur. Dafür habe ich bisher folgende Lösung, ich Frage einfach für jede Kombinatioin die booleans ab und jetzt stellt sich mir die Frage ob das ganze nicht effizienter geht?

```
Texture middle = layer.getTexture(x, y);
Texture left = layer.getTexture(x - 1, y);
Texture right = layer.getTexture(x + 1, y);
Texture above = layer.getTexture(x , y + 1);
Texture below = layer.getTexture(x, y - 1);

boolean transparentLeft = isTransparent(left), transparentRight = isTransparent(right), transparentAbove = isTransparent(above), transparentBelow = isTransparent(below);

int currentState = middle.getState();

if(!isTransparent(middle)) {

    // Rand Texturen
    if(transparentLeft && !transparentRight && !transparentAbove && !transparentBelow) { layer.setState(x, y, 4); layer.setRot(x, y, 1); return true; }
    if(!transparentLeft && transparentRight && !transparentAbove && !transparentBelow) { layer.setState(x, y, 4); layer.setRot(x, y, 3); return true; }
    if(!transparentLeft && !transparentRight && transparentAbove && !transparentBelow) { layer.setState(x, y, 4); layer.setRot(x, y, 0); return true; }
    if(!transparentLeft && !transparentRight && !transparentAbove && transparentBelow) { layer.setState(x, y, 4); layer.setRot(x, y, 2); return true; }
    // Rand Texturen ENDE

    // Eck Texturen
    if(transparentLeft && !transparentRight && transparentAbove && !transparentBelow) { layer.setState(x, y, 5); layer.setRot(x, y, 0); return true; }
    if(transparentLeft && !transparentRight && !transparentAbove && transparentBelow) { layer.setState(x, y, 5); layer.setRot(x, y, 1); return true; }
    if(!transparentLeft && transparentRight && !transparentAbove && transparentBelow) { layer.setState(x, y, 5); layer.setRot(x, y, 2); return true; }
    if(!transparentLeft && transparentRight && transparentAbove && !transparentBelow) { layer.setState(x, y, 5); layer.setRot(x, y, 3); return true; }
    // Eck Texturen ENDE

    // 1 Seitige Texturen
    if(transparentLeft && transparentRight && transparentAbove && !transparentBelow) { layer.setState(x, y, 2); layer.setRot(x, y, 0); return true; }
    if(transparentLeft && !transparentRight && transparentAbove && transparentBelow) { layer.setState(x, y, 2); layer.setRot(x, y, 1); return true; }
    if(transparentLeft && transparentRight && !transparentAbove && transparentBelow) { layer.setState(x, y, 2); layer.setRot(x, y, 2); return true; }
    if(!transparentLeft && transparentRight && transparentAbove && transparentBelow) { layer.setState(x, y, 2); layer.setRot(x, y, 3); return true; }
    // 1 Seitige Texturen ENDE

    // 2 Seitige Texturen
    if(transparentLeft && transparentRight && !transparentAbove && !transparentBelow) { layer.setState(x, y, 3); layer.setRot(x, y, 0); return true; }
    if(!transparentLeft && !transparentRight && transparentAbove && transparentBelow) { layer.setState(x, y, 3); layer.setRot(x, y, 1); return true; }
    // 2 Seitige Texturen ENDE

    if(transparentLeft && transparentRight && transparentAbove && transparentBelow) { layer.setState(x, y, 1); layer.setRot(x, y, 0); return true; }
```

Für Erläuterungen einfach Fragen.


----------



## httpdigest (25. Mai 2018)

Eventuell kannst du den Code noch etwas kompakter machen, indem du Bitmasken verwendest.
Das macht das ganze aber eventuell schwerer zu verstehen:

```
Texture middle = layer.getTexture(x, y);
Texture left = layer.getTexture(x - 1, y);
Texture right = layer.getTexture(x + 1, y);
Texture above = layer.getTexture(x , y + 1);
Texture below = layer.getTexture(x, y - 1);
int mask = (isTransparent(left)  ? 0b0001 : 0) |
           (isTransparent(right) ? 0b0010 : 0) |
           (isTransparent(above) ? 0b0100 : 0) |
           (isTransparent(below) ? 0b1000 : 0);
if (!isTransparent(middle)) {
    // Rand Texturen
    if (mask == 0b0001) { layer.setState(x, y, 4); layer.setRot(x, y, 1); return true; }
    if (mask == 0b0010) { layer.setState(x, y, 4); layer.setRot(x, y, 3); return true; }
    if (mask == 0b0100) { layer.setState(x, y, 4); layer.setRot(x, y, 0); return true; }
    if (mask == 0b1000) { layer.setState(x, y, 4); layer.setRot(x, y, 2); return true; }
    // Rand Texturen ENDE
    // Eck Texturen
    if (mask == 0b0011) { layer.setState(x, y, 5); layer.setRot(x, y, 0); return true; }
    if (mask == 0b1001) { layer.setState(x, y, 5); layer.setRot(x, y, 1); return true; }
    if (mask == 0b1010) { layer.setState(x, y, 5); layer.setRot(x, y, 2); return true; }
    if (mask == 0b0110) { layer.setState(x, y, 5); layer.setRot(x, y, 3); return true; }
    // Eck Texturen ENDE
...
```


----------



## GentleXD (25. Mai 2018)

Dankeschön


----------



## mrBrown (25. Mai 2018)

Wenn das Model es hergibt kann man daraus auch sowas machen wie `if (deinModel.isTransparent(LEFT))`

Setzt aber voraus, dass es sinnvoll gekapselt ist und die Zahlenwerte, die du danach für die Setter brauchst, irgendeiner Logik folgen


----------

