Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

1

08.03.2016, 21:47

C++, SFML Prozedurale Levelgenerierung

Hallo zusammen,
ich habe gerade damit angefangen mit C++ und SFML ein "Holzfällerspiel" zu programmieren. Man soll durch eine endlose 2D Welt laufen können, die sich immer neu und zufällig aus verschiedenen Materialien generieren soll. Let´s GameDev hat dazu mal ein Video gemacht, allerdings ohne zu erklären wie das dann als Code aussehen könnte.
Hättet ihr Ideen oder Denkanstöße so etwas umzusetzen?
Wichtig ist hierbei aber, dass nicht nur ein Bild mit verschiedenen Farben generiert wird, da man später mit den einzelnen Materialien interagieren soll. Außer man generiert ein ewig großes Bild mit verschiedenen Farben und setzt dann auf eine bestimmte Farbe immer ein bestimmtes Objekt.

Danke für eure Antworten

LG Tute
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

2

09.03.2016, 00:02

Es gibt da natürlich zahlreiche Möglichkeiten, aber wie wär es mit:

Perlin Noise (mit Implementierungspseudocode)

Dieses Verfahren generiert sehr natürlich wirkende Verteilungen und eignet sich sicher
für einen Wald :)

RmbRT

Treue Seele

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

3

09.03.2016, 01:54

Also wenn du unendlich große Welten willst, ist das schon sehr kompliziert, weil du von der Herangehensweise stark eingeschränkt wirst. Das impliziert nämlich, dass du nicht auf umliegende Felder zugreifen kannst, wenn du das aktuelle Feld bestimmst. Also kannst du nicht prüfen, ob zum Beispiel ein Gebiet zu dicht besiedelt mit Bäumen ist, oder ob irgendwo ein Fluss durchlaufen soll. Du musst dir für On-The-Fly-Generierung eine Funktion nach dem Schema FeldTyp generate(Position) machen, welche annehmen muss, dass alle umliegenden Positionen noch nicht bestimmt wurden, deshalb auch nicht ausgelesen werden können. Dazu müsstest du vom Spieler veränderte Abschnitte der Welt auch noch speichern, was aber nicht so den Aufwand darstellen sollte.

Grüße
RmbRT
"Dumm ist, wer dummes tut."

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

4

09.03.2016, 14:17

Danke für eure Denkanstöße, aber ich habe jetzt nicht den leisesten Schimmer, wie dass nachher als Code aussehen könnte.
Gibt es da irgendwelche Beispielscripte (am besten mit C++ und SFML) um das sich das ganze mal vorstellen zu können?
Habe wie gesagt über google nichts derartiges finden können.
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

5

09.03.2016, 17:08

Unter dem Link den ich dir gepostet habe findest du eine sehr ausführliche Erklärung sowie Pseudo-Code.

Aber um das nochmals zu verdeutlichen, hier entsprechender Code zu 2D-Perlin Noise:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  function Noise1(integer x, integer y)
    n = x + y * 57
    n = (n<<13) ^ n;
    return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
  end function

  function SmoothNoise_1(float x, float y)
    corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16
    sides   = ( Noise(x-1, y)  +Noise(x+1, y)  +Noise(x, y-1)  +Noise(x, y+1) ) /  8
    center  =  Noise(x, y) / 4
    return corners + sides + center
  end function

  function InterpolatedNoise_1(float x, float y)

      integer_X    = int(x)
      fractional_X = x - integer_X

      integer_Y    = int(y)
      fractional_Y = y - integer_Y

      v1 = SmoothedNoise1(integer_X,     integer_Y)
      v2 = SmoothedNoise1(integer_X + 1, integer_Y)
      v3 = SmoothedNoise1(integer_X,     integer_Y + 1)
      v4 = SmoothedNoise1(integer_X + 1, integer_Y + 1)

      i1 = Interpolate(v1 , v2 , fractional_X)
      i2 = Interpolate(v3 , v4 , fractional_X)

      return Interpolate(i1 , i2 , fractional_Y)

  end function


  function PerlinNoise_2D(float x, float y)

      total = 0
      p = persistence
      n = Number_Of_Octaves - 1

      loop i from 0 to n

          frequency = 2i
          amplitude = pi

          total = total + InterpolatedNoisei(x * frequency, y * frequency) * amplitude

      end of i loop

      return total

  end function


Auch wenn es nach Basic aussieht, sollte es doch möglich sein das in C++-Code umzuformen.

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

6

09.03.2016, 17:11

Vielen Dank, werd ich mal ausprobieren
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

Werbeanzeige