Terrain-Generator

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Nibor

Betreff: Terrain-Generator

BeitragDo, Mai 27, 2010 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieses kleine Programm generiert eine zufällige Heightmap und färbt die Karte abhängig von der Höhe ein:
Code: [AUSKLAPPEN]

SuperStrict

SeedRnd MilliSecs()

Global height:Float[513,513]

Type qt
   
   Field x:Int, y:Int
   Field sz:Int, amp:Float
   
   Function Create:qt()
      height=New Float[513,513]
   
      height[0,0]=Rnd(0,1.0)
      height[512,0]=Rnd(0,1.0)
      height[0,512]=Rnd(0,1.0)
      height[512,512]=Rnd(0,1.0)
      
      Local d:qt=New qt
      d.sz=512
      d.amp=1.0
      d.Fill()
      d.Split()
      
      For Local i:Int=0 Until 15
         Smooth()
      Next
   End Function
   
   
   Method Fill()
      If height[x+sz/2, y]=0 Then height[x+sz/2, y]=0.5*(height[x,y]+height[x+sz,y])*(1.0-amp)+Rnd(-0.5,1.0)*amp
      If height[x+sz/2, y+sz]=0 Then height[x+sz/2, y+sz]=0.5*(height[x,y+sz]+height[x+sz,y+sz])*(1.0-amp)+Rnd(-0.5,1.0)*amp
      
      If height[x, y+sz/2]=0 Then height[x, y+sz/2]=0.5*(height[x,y]+height[x,y+sz])*(1.0-amp)+Rnd(-0.5,1.0)*amp
      If height[x+sz, y+sz/2]=0 Then height[x+sz, y+sz/2]=0.5*(height[x+sz,y]+height[x+sz,y+sz])*(1.0-amp)+Rnd(-0.5,1.0)*amp

      height[x+sz/2, y+sz/2]=0.25*(height[x,y]+height[x+sz,y+sz]+height[x+sz,y]+height[x,y+sz])*(1.0-amp*0.38)+Rnd(-0.5,1.0)*amp*0.38
   End Method
   
   
   Method Split()
      If sz<=1 Then Return
      For Local s:Int=0 To 1
         For Local t:Int=0 To 1
            Local d:qt=New qt
            d.sz=sz/2
            d.x=x+d.sz*s
            d.y=y+d.sz*t
            d.amp=amp*0.7
            d.Fill()
            d.Split()
         Next
      Next
   End Method
   
   
   Function Smooth()
      Local st:Float[513,513]
      For Local x:Int=1 Until 512
         For Local y:Int=1 Until 512
            st[x,y]=height[x,y]*0.5+0.125*(height[x+1,y]+height[x,y+1]+height[x-1,y]+height[x,y-1])
         Next
      Next
      height=st
   End Function
   
   
   
   
End Type














Graphics(800,600)
qt.Create()

Repeat

For Local x:Int=0 Until 512
   For Local y:Int=0 Until 512
      Color(height[x,y])
      Plot(x,y)
   Next
Next


If KeyHit(KEY_ENTER) Then qt.Create()
If KeyDown(KEY_SPACE) Then qt.Smooth()








Flip
Until KeyHit(KEY_ESCAPE) Or AppTerminate()
End




Function Color(h:Float)
   h=Max(0.0, Min(1.0, h*1.5))
   h=0.5*(1.0+Sin(-90+h*180.0))
   
   Local r:Float, g:Float, b:Float
   Select True
      Case h<0.2
         b=0.5+h
         g=0.05
         r=0.05
      Case h<0.25
         b=0.5+h
         g=0.3+h
         r=0.2
      Case h<0.3
         r=0.9
         g=0.9+0.2*h
      Case h<0.7
         g=0.5+h*0.2
         r=0.1
      Default
         r=h
         g=h
         b=h
   End Select
   
   SetColor(r*255, g*255, b*255)
End Function
http://www.blitzforum.de/showcase/203/

ComNik

BeitragDo, Mai 27, 2010 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht schlecht, auch schöne Farbgebung.

wär das nich was für den Bcc Wink

lg
ComNik
WIP: Vorx.Engine

Nibor

BeitragFr, Mai 28, 2010 9:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja dachte ich zuerst auch, hatte dann aber keine Idee, die sich innerhalb der Beschränkungen (Codelimit) mit BlitzMax umsetzen lassen würde.
Und auf BB zurückzugreifen hatte ich dann keine lust.

Wenn man ein bisschen mit den Zahlen herumspielt gibt es auch ganz gute Ergebnisse.
http://www.blitzforum.de/showcase/203/

klin

BeitragFr, Mai 28, 2010 10:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn man die dutzenden leeren Zeilen weglässt, ist es schon erstaunlich, was man mit so wenig code alles anstellen kann.

Also ich finde es wirklich klasse.

MFG
Klin
 

da_poller

BeitragFr, Mai 28, 2010 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
die "dutzenden leeren Zeilen" dienen der übersichtlichkeit.

meine projekte enthalten min genau so viele.
(leerzeilen zählt man idr ja auch nicht als code Wink)

klin

BeitragFr, Mai 28, 2010 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich gibt es ja genau dafür Rem und dieses ' .
Dadurch wird es ebenfalls übersichtlich und man braucht nur mit Strg+F das bestimmte Wort zu suchen. Schon ist man direkt an dieser stelle wo man sucht.

Wenn ich viele leere Zeilen mache, bringt es mir nicht wirklich was. Ich kann mir dann im Kopf behalten: "Nach 14(*10) leeren Zeilen kommt nun der gesucht code", aber versuch das mal bei einem großen Projekt.
Und durch ' und Rems wird das schön Blau makiert und man kann auch direkt suchen.

Manche sehen es halt anders, aber so finde ich es einfach übersichtlicher.

MFG
Klin

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group