Karte generieren

Anfängerfragen zum Programmieren mit PureBasic.
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Karte generieren

Beitrag von TheNewOne »

Hallo zusammen,
ich hätte (mal wieder) eine Frage. Ich bin (noch immer) dabei mir ein kleines Spiel zu basteln und bin gerade dabei einen Generator für meine Karten zu schreiben.
Ich wollte mal fragen ob es dafür irgendwo Tutorials oder ähnliches gibt (habe nämlich noch nichts gefunden). Bei mir habe ich es bis jetzt so gelöst das ich meinen Array einfach zufällig mit Zahlen beschreibe, die jeweils für einen bestimmten Block stehen (Bsp: Grass, Sand, Stein, Erze, ...), aber das sieht dann im Spiel nicht sehr natürlich aus. Wäre toll wenn mir jemand helfen könnte. :)
Win7, 64bit, PB 4.60
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Karte generieren

Beitrag von Bisonte »

Ich denke, dass was du suchst ist eine Tile Engine. Damit kannst du die Suchanfrage füttern, und sie schmeisst dir ne Menge raus ;)

Aber mein Favorit ist immer noch : Tile Engine- Bitte Helft mir
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Karte generieren

Beitrag von Derren »

Anscheinend hat er schon eine Tile-Engine und will jetzt eine zufällige Karte generieren.
Einfach mit Random die Tiles in die Karte schreiben sieht natürlich doof aus. Da kommt dann sowas bei raus (oberes Bild), wobei es aber aussehen sollte wie im unteren Bild

Bild

Ich denke es kommt ganz auf's Spiel drauf an, wie der Generator aufgebaut sein muss.

Willst du z.B. einen Terraria-Clone (oder 2D Minecraft) schreiben, könntest du die Landschaft mit einer Polynomfunktion beschreiben, die mit zufälligen Werten fütterst. Schluchten wären dann z.B. senkrechte Asymptoten. Wenn so eine Asymptote erkannt wird, generierst du einfach nochmal eine zufällige Zahl um die Tiefe fest zu legen (wenn ein Graph ein Höhenprofil darstellen soll wäre eine senkrechte Asymptote eine Schlucht die unendlich tief ist).
Sagen wir du willst dass 10% aller Steinblöcke Kohle sind, dann siehst du nach wie viele Steinblöcke in einem bestimmten Abschnitt (Chunk) sind und errechnest daraus die Anzahl der Flöze (ein Flöz besteht aus 4-8 Kohleblöcken z.B.). Dann wählst du zufällig Steinblöcke in diesem Chunk aus, ersetzt ihn mit Kohle und baust dein Flöz um diesem Block.
So ähnlich kannst du natürlich auch vorgehen wenn's doch eher ein Don't Starve -Clone werden soll.

Wenn's ein Super-Mario-Clone werden soll, würde ich dann doch eher dazu raten die Levels von Hand zu erstellen. So sind sie dann auf jeden Fall spielbar. Wenn du noch einen Level-Editor mitlieferst können ständig neue Levels von Spielern generiert werden.
Signatur und so
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: Karte generieren

Beitrag von TheNewOne »

@Bisonte eine Tile Engine hab ich selbst schon geschrieben, was ich brauche ist ein Generator der einen Array(x,y) mit verschiedenen IDs beschreibt (Und am Ende sollte die durch die Tile Engine gezeichnete Map einigermaßen natürlich aussehen).
@Derren Es soll eine art Terraria-Clone werden. Ich verstehe nicht ganz wie ich das mit den Polynomfunktionen umsetzen kann.
Win7, 64bit, PB 4.60
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Karte generieren

Beitrag von Derren »

Naja, wollte dir nur die "Prozedurale Generierung" aufzeigen. Such dir einen Funktionsplotter im Internet und spiel ein bißchen damit rum. Irgendwann wirst du schon eine oder mehrere Funktionen finden die halbwegs nach "Gelände" aussehen. Du wirst schnell merken welche Parameter die Landschaft hüglig oder flach macht etc.

Du kannst auch einen riesigen Klotz aus If-Abfragen bauen.

Also starte mal 0,0 und mit Random erstellst du erstmal ein zufälliges Biom. Ein zweites Random erzeugt die Größe (z.B. 150-300 Blöcke). Dann erstellst du zufälliges Höhenprofil. Ein zufääliger X und Y Wert ergeben ein Steigungsdreieck. zB x=20 y=5 ergibt eine Steigung bei der pro 4 Blöcke nach Rechts sich die Höhe um 1 vergrößert. Danach erzeugst du eine neue Steigung. Sagen wir mal y=5 (über der Normalhöhe) ist das Maximum für dieses Biom, da es doch eher flach sein sollte. Das heißt du ignorierst jetzt alle positiven Y-Werte, oder änderst einfach den Min und Max-Parameter von Random. So bekommst du eine negatige Steigung.
Ja und so geht das ganze dann weiter. So baust du dir ein Höhenprofil. Dann gehst du wieder zurück zu 0,0 und "baust" Bäume und sonstiges Zeug. Außerdem verteilst du die Erze und Höhlen etc..
Signatur und so
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Re: Karte generieren

Beitrag von TheNewOne »

Ich hab mal einen kleinen Code dazu geschrieben, aber wenn ich diesen ausführen möchte lädt es nur. :?
Was habe ich falsch gemacht?

Code: Alles auswählen

InitSprite()
InitKeyboard()
Global Biom, Groesse, SteigungX, SteigungY, aktX = 0, lastY = 10, y

Global Dim Karte(160,90)

Procedure Generate()
  Repeat
    Biom = Random(3)
    If aktX <= 120
      Groesse = Random(40,20)
      aktX + Groesse
    Else
      Groesse = 160 - aktX
    EndIf
    For x = aktx - Groesse To aktX
      SteigungX = Random(3,1)
      SteigungY = Random(5,0)
      If Random(1) = 0
        y = lastY + Round(SteigungY/SteigungX,#PB_Round_Nearest)
      Else
        y = lastY - Round(SteigungY/SteigungX,#PB_Round_Nearest)
      EndIf
      If y < 0
        y = 0
      ElseIf y > 90
        y = 90
      EndIf
      lastY = y
      Karte(x,y) = Biom
    Next
  Until aktX = 160
EndProcedure

Procedure DrawMap()
  For x = 0 To 1600 Step 10
    For y = 0 To 900 Step 10
      DisplaySprite(Karte(x/10,y/10), x, y)
    Next
  Next
EndProcedure

OpenScreen(1600, 900, 32, "Test")

Generate()

CreateSprite(0, 10, 10)
If StartDrawing(SpriteOutput(0))
  Box(0,0,10,10,RGB(255,255,0))
  Box(1,1,8,8,RGB(0,0,0))
  StopDrawing()
EndIf
CreateSprite(1, 10, 10)
If StartDrawing(SpriteOutput(1))
  Box(0,0,10,10,RGB(255,0,0))
  Box(1,1,8,8,RGB(0,0,0))
  StopDrawing()
EndIf
CreateSprite(2, 10, 10)
If StartDrawing(SpriteOutput(2))
  Box(0,0,10,10,RGB(0,255,0))
  Box(1,1,8,8,RGB(0,0,0))
  StopDrawing()
EndIf
CreateSprite(3, 10, 10)
If StartDrawing(SpriteOutput(3))
  Box(0,0,10,10,RGB(0,0,255))
  Box(1,1,8,8,RGB(0,0,0))
  StopDrawing()
EndIf

Repeat
  FlipBuffers()
  ClearScreen(RGB(0, 0, 0))
  ExamineKeyboard()
  DrawMap()
  Delay(1)
Until KeyboardPushed(#PB_Key_Escape)
Win7, 64bit, PB 4.60
Antworten