Zerstörbarer Boden

Wazzledi

Mitglied
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

Tank.png
 

Hellosager

Aktives Mitglied
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

Mitglied
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

Top Contributor
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

Mitglied
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?
 

Wazzledi

Mitglied
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?
 
Zuletzt bearbeitet:

JuKu

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

Jardcore

Top Contributor

Wazzledi

Mitglied
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.
Java:
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:

Java:
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.

Tank2.png
 

Neue Themen


Oben