Terrain-Generator
Übersicht

![]() |
NiborBetreff: Terrain-Generator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nicht schlecht, auch schöne Farbgebung.
wär das nich was für den Bcc ![]() lg ComNik |
||
WIP: Vorx.Engine |
![]() |
Nibor |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
die "dutzenden leeren Zeilen" dienen der übersichtlichkeit.
meine projekte enthalten min genau so viele. (leerzeilen zählt man idr ja auch nicht als code ![]() |
||
![]() |
klin |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group