# Zerstörbarer Boden



## Wazzledi (5. Feb 2017)

Hallo, 
ich versuche im Moment ein Spiel nachzuprogrammieren, welches ich früher öfter gespielt habe: http://spielspiele.de/tanks-spiel/

Ich habe auch schon relativ viel hinbekommen, jedoch habe ich im Internet keinen sinnvollen Tipp erhalten, wie man so einen Zerstörbaren Boden, wie in dem Spiel oben, programmiert. Bis jetzt besteht mein Boden nur aus einem Bild (siehe Anhang). 
Wäre nett wenn m ir dabei jemand helfen könnte oder einen Tipp geben kann. 

MfG 
Dennis aka Wazzledi


----------



## Hellosager (5. Feb 2017)

Du brauchst wahrscheinlich eine Kollisionsabfrage und musst dann das Bild an der Stelle des Einschlags manipulieren. Der Boden wird wohl eine eigene Komponente sein schätze ich, das heißt es sollte bekannt sein, wo überall Boden ist. Dann musst du wahrscheinlich am Einschlagsort einfach nur die Pixel drum herum z.B. durchsichtig machen.


----------



## Wazzledi (5. Feb 2017)

Okay und wie mache ich die Pixel an der Stelle durchsichtig? Und bei der Kollisionsabfrage habe ich bis jetzt nur die Koordinate, wo der Boden beginnt. Wie kann ich denn dann bestimmen wo der Boden ist und wo vielleicht schon ein Loch entstanden ist? Und ja der Boden ist ein eigenes Bild welches über dem Hintergrund gezeichnet wird.


----------



## Jardcore (6. Feb 2017)

Vielleicht kannst du auch einfach für jedes Pixel ein einfaches dynamisches Objekt erstellen und die Kollision mit einer Bombe prüfen. Für Kollisionserkennung musst du dich dann aber wahrscheinlich mit QuadTrees beschäftigen denn sonst würde deine Performance den Bach runter gehen.

Ein QuadTree ist übrigens dafür da, die Collisionsabfragen pro Frame zu reduzieren. Damit teilst du dein Terrain in mehrere Flächen ein und prüfst nur in Bereichen die Kollision, in denen sich zum Beispiel eine Bombe befindet.


----------



## Wazzledi (6. Feb 2017)

Okay dann werde ich mich mit den QuadTrees mal beschäftigen. Und weiß zufällig jemand wie man das Terrain zufällig erstellen kann also mit Bergen und ähnlichem?


----------



## Jardcore (6. Feb 2017)

Oft wird in dem Zusammenhang Perlin Noise benutzt.
http://stackoverflow.com/a/25816671


----------



## Wazzledi (6. Feb 2017)

Perlin Noise sieht sehr kompliziert aus und der Link ist leider für Javascript. Die meisten Perlin noise Codes sind für 2D maps gemacht. Gibt es einen Code für dieses 1D Terrain?


----------



## JuKu (6. Feb 2017)

Ich glaube solche Spiele nutzen einfach meist gar keine Grafik direkt, sondern zeichnen das ganze in Rechtecken.


----------



## Jardcore (7. Feb 2017)

Wazzledi hat gesagt.:


> Gibt es einen Code für dieses 1D Terrain?


Laut Google schon:
http://gamedev.stackexchange.com/questions/110219/smooth-1d-terrain-generation

Solange eine Sprache nur if else while usw. benutzt kannst du das ganze auch einfach in andere Sprachen übertragen.

Hier zum Beispiel JavaScript live Beispiel.
http://codepen.io/codevinsky/pen/jEPWBO

Den Code kann man in wenigen Minuten auf Java übertragen.


----------



## Wazzledi (9. Feb 2017)

Okay ich habe jetzt den Boden nicht mehr als Bild, sondern als einzelne Balken gecodet. Und setze dann bei einer Kollision die Koordinaten runter. Um das Terrain zufällig zu generieren habe ich dann im Internet was zur Kosinus Interpolation gelesen und mal eingebaut. Jedoch ist dann mein Boden viel zu zackig. Hier der Code für die Interpolation.

```
public class Interpolate {
           
           
          public static double CosineInterpolate( double y1,double y2, double mu)
                  {
                     double mu2;

                     mu2 = (1-Math.cos(mu*Math.PI))/2;
                     return(y1*(1-mu2)+y2*mu2);
                  
                  }
          public static float PerlinNoise1D(float x, float persistence, int octaves)
          {
              float total = 0;
              float p = persistence;
              int n = octaves -1;
              for(int i=0;i<=n;i++)
              {
                  float frequency = (float) Math.pow(2, i);
                  double amplitude = Math.pow(p, i);
                  total += InterpolatedNoise(x*frequency )*amplitude;
              }
              return (int) total;
          }
          private static float InterpolatedNoise(float x)
          {
              int integer_X = (int) x;
              float fractional_X = x - integer_X;

              float v1 = SmoothNoise1D(integer_X);
              float v2 = SmoothNoise1D(integer_X + 1);

              return (float) CosineInterpolate(v1, v2, fractional_X);

          }
          public static float Noise(int x)
          {
              x = (x<<13) ^ x;
              return (float) ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
          }
          public static float SmoothNoise1D(int x)
          {
              return Noise(x)/2  +  Noise(x-1)/4  +  Noise(x+1)/4;
          }
```

Und hier der Code für das Boden setzten durch die Interpolation:


```
public void interpolBoden() {
        for (int i = 1; i < 1000; i++) {
            bodenHoehe[i] = (int) (bodenHoehe[i-1] + Interpolate.PerlinNoise1D(i, 1.5f,4));
        }
    }
```
Das sieht dann ungefähr so aus. Beachtet bitte erstmal nicht dass der Boden unten aufhört. Wäre gut wenn mir jemand dabei helfen könnte. Und die breite der Boden Balken ist glaube ich 1 pixel.


----------

