[B3D] Single Surface Wolken (realistisch)
Übersicht

KrischanBetreff: [B3D] Single Surface Wolken (realistisch) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo, ich gebe mal wieder was zum Besten. Herausgekommen ist eine kleine Wolkendemo. Die Mediendateien kann man sich entweder selbst machen oder die aus meiner Demo herunterladen. Bei mir auf meinem alten Notebook bekomme ich so ~200FPS:
Code: [AUSKLAPPEN] ; ----------------------------------------------------------------------------------------------------------------------
; ; Single Surface Wolken Demo ; ========================== ; ; by Krischan 20.09.2007 ; Version 1.0 ; ; Eine kleine Demo mit 8 verschiedenen Wolkenlayern. Einzelne Quads werden in je eine Surface hinzugefügt und diese dann ; mit der Wolkentextur gemappt. Die "Bewegung" der Layer erfolgt durch Löschung der Surface und Neuanlage der Quads pro ; Durchgang. Wenn das jemand eleganter lösen kann, nur her damit. ; ; Tasten: ; 1-8 Wolkenlayer 1-8 ausblenden ; F1 Jeden Layer zufällig einfärben ; SPACE Zufälliges Lichtambiente erzeugen ; ; Steuerung: ; Maus Herumschauen ; LMB Vorwärts ; RMB Rückwärts ; ; ---------------------------------------------------------------------------------------------------------------------- ; ; Thx to hectic aus dem Blitzforum für seinen "Skyhaubengenerator", der hier Verwendung findet sowie Mr. Keks für seine ; Function "AddToSurface" sowie Pongo aus der BB-Community für seine tollen Wolkentexturen (die ich etwas geändert habe) ; ; Skyhaubengenerator: http://www.blitzforum.de/forum/viewtopic.php?t=21983 ; AddToSurface: http://www.blitzforum.de/forum/viewtopic.php?t=20181 ; Wolkentexturen: http://www.andimages.com/proofs/pongo/blitz/clouds.zip ; ; ---------------------------------------------------------------------------------------------------------------------- ; Variablen ; ---------------------------------------------- layer = 8 ; Anzahl Wolkenlayer (je Layer eine Wolkentextur) max = 25 ; Anzahl Wolken pro Layer r = 1000 ; Range des Wolkenfeldes (-r,r) h1 = 20 ; Starthöhe der Wolken h2 = 100 ; Maximale Höhe der Wolken (je höher, desto mehr Range erforderlich!) m# = 0.05 ; Geschwindigkeit der Wolken scale1 = 20 ; Minimalgrösse einer Wolke scale2 = 50 ; Maximalgrosse einer Wolke (zu grosse Wolken gehen auf FPS!) rot1 = -180 ; Rotationswinkel Start rot2 = 180 ; Rotationswinkel Ende move# = 0.05 ; Mausgeschwindigkeit var# = 2.5 ; Varianz der Geschwindigkeit (1.0 = alle gleich schnell) skyh = 0 ; Höhe der Skybox über der Kamera sky$ = "skygen.png" ; Skytextur Graphics3D 1024,768,32,1 SetBuffer BackBuffer() ; Alles zufällig ; ---------------------------------------------- SeedRnd MilliSecs() ; Felder dimensionieren ; ---------------------------------------------- Dim x#(max,layer),y#(max,layer),z#(max,layer),sc#(max,layer),ro#(max,layer),mesh(layer),surf(layer),tex(layer),hl(layer) ; Layer vorbereiten, Texturen laden und zuweisen ; ---------------------------------------------- pivot = CreatePivot() For i=1 To layer mesh(i)=CreateMesh() surf(i)=CreateSurface(mesh(i)) tex(i)=LoadTexture("cloud"+i+".png",1+2) For j=1 To max x#(j,i)=Rnd(-r,r) ; X-Position y#(j,i)=Rnd(h1,h2) ; Y-Position z#(j,i)=Rnd(-r,r) ; Z-Position sc#(j,i)=Rnd(scale1,scale2) ; Grösse ro#(j,i)=Rnd(rot1,rot2) ; Rotation Next EntityTexture mesh(i),tex(i) EntityParent mesh(i),pivot hl(i)=1 Next ; Himmel ; ---------------------------------------------- sky_mesh=InitSkyHaube(sky$) ; Kamera, Licht und Nebel ; ---------------------------------------------- AmbientLight 255,255,255 cam=CreateCamera() PositionEntity cam,0,2,0 TurnEntity cam,0,90,0 CameraClsColor cam,255,255,255 CameraFogColor cam,255,255,255 CameraRange cam,1,r*2 CameraFogRange cam,0,r CameraFogMode cam,True ; Eine Plane als Boden ; ---------------------------------------------- plane=CreatePlane() PositionEntity plane,0,0,0 ptex=LoadTexture("grass.png") EntityTexture plane,ptex ScaleTexture ptex,4,4 ; Mauszeiger in die Mitte ; ---------------------------------------------- MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2) ; Hauptschleife ; ---------------------------------------------- While Not KeyDown(1) ; Kamerabewegung TurnEntity cam,MouseYSpeed(),0,0 RotateEntity cam, EntityPitch(cam),EntityYaw(cam)-MouseXSpeed(),0 MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2) MoveEntity cam,0,0,MouseDown (1)*move# MoveEntity cam,0,0,MouseDown (2)*-move# ; Alle Layer neu berechnen For i=1 To layer If KeyHit(1+i) Then hl(i)=1-hl(i) If hl(i)=0 Then HideEntity mesh(i) Else ShowEntity mesh(i) If hl(i)=1 Then ClearSurface(surf(i),1,1) For j=1 To max x#(j,i)=x#(j,i)+m#*Rnd(1,var#) : If x#(j,i)>=r Then x#(j,i)=-r : z#(j,i)=Rnd(-r,r) c=CreateQuad() PositionEntity c,x#(j,i),y#(j,i),z#(j,i) ScaleEntity c,sc#(j,i),sc#(j,i),sc#(j,i) RotateEntity c,90,0,ro#(j,i) AddToSurface(c,surf(i),mesh(i)) FreeEntity c Next EndIf Next ; SPACE = zufälliges Farbambiente erzeugen If KeyHit(57) Then c1=Rand(0,255) : c2=Rand(0,255) : c3=Rand(0,255) EntityColor sky_mesh,c1,c2,c3 EntityColor plane,c1,c2,c3 CameraClsColor cam,c1,c2,c3 CameraFogColor cam,c1,c2,c3 For i=1 To layer : EntityColor mesh(i),c1,c2,c3 : Next EndIf ; F1 = Layer farbig unterscheiden If KeyHit(59) Then For i=1 To layer : EntityColor mesh(i),Rand(0,255),Rand(0,255),Rand(0,255) : Next ; Sky und Pivot an Kamera hängen, die Layer werden nur leicht bewegt cx#=EntityX(cam) : cy#=EntityY(cam) : cz#=EntityZ(cam) PositionEntity pivot,cx#-(cx#/100),cy#-(cy#/100),cz#-(cz#/100) PositionEntity sky_mesh,cx#,cy#+25,cz# RenderWorld Text 0,0,"Tris: "+TrisRendered()+" Wolken: "+(layer*max) For i=1 To layer If hl(i)=1 Then t$="sichtbar" Else t$="unsichtbar" Text 0,(1+i)*16,"Layer "+i+": "+t$ Next Flip Wend ; ----------------------------------------------------------------- ; Ein Mesh mit seinen Daten zu einer Single Surface hinzufügen ; ----------------------------------------------------------------- Function AddToSurface(mesh, surf,singlesurfaceentity) Local vert[2] For s = 1 To CountSurfaces(mesh) surface = GetSurface(mesh,s) For i = 0 To CountTriangles(surface)-1 For i2 = 0 To 2 oldvert = TriangleVertex(surface,i,i2) TFormPoint VertexX(surface,oldvert),VertexY(surface,oldvert),VertexZ(surface,oldvert), mesh,singlesurfaceentity vert[i2] = AddVertex(surf,TFormedX(),TFormedY(),TFormedZ(),VertexU(surface,oldvert),VertexV(surface,oldvert)) Next AddTriangle(surf, vert[0], vert[1], vert[2]) Next Next End Function ; ----------------------------------------------------------------- ; Ein einfaches Quad erstellen ; ----------------------------------------------------------------- Function CreateQuad() quad=CreateMesh() brush=CreateBrush(255,255,255) v=CreateSurface(quad,brush) FreeBrush brush AddVertex ( v,-3,3,0,1,0) AddVertex ( v,3,3,0,0,0) AddVertex ( v,-3,-3,0,1,1) AddVertex ( v,3,-3,0,0,1) AddTriangle( v,0,1,2) AddTriangle( v,3,2,1) FlipMesh(quad) Return quad End Function ; ----------------------------------------------------------------- ; Skyhaube laden ; ----------------------------------------------------------------- Function InitSkyHaube(sky$) ;Sky-Mesh-Erstellen sky_mesh=CreateMesh() skytex=LoadBrush(sky$,0,6,6) sky_face=CreateSurface(sky_mesh,skytex) ;Sky-Mesh-Zusammen-Stellen v0=AddVertex(sky_face,-3,0,-3,0,6) v1=AddVertex(sky_face,-3,0,+3,0,0) v2=AddVertex(sky_face,+3,0,+3,6,0) v3=AddVertex(sky_face,+3,0,-3,6,6) v4=AddVertex(sky_face,-1,1,-1,2,4) v5=AddVertex(sky_face,-1,1,+1,2,2) v6=AddVertex(sky_face,+1,1,+1,4,2) v7=AddVertex(sky_face,+1,1,-1,4,4) ;Sky-Mesh-Triangulieren AddTriangle(sky_face,v1,v0,v4) AddTriangle(sky_face,v1,v4,v5) AddTriangle(sky_face,v2,v1,v5) AddTriangle(sky_face,v2,v5,v6) AddTriangle(sky_face,v3,v2,v6) AddTriangle(sky_face,v3,v6,v7) AddTriangle(sky_face,v0,v3,v7) AddTriangle(sky_face,v0,v7,v4) AddTriangle(sky_face,v5,v4,v7) AddTriangle(sky_face,v7,v6,v5) ;Sky-Mesh-Standard-Größe ScaleMesh sky_mesh,100,100,100 ; immer zuerst zeichnen EntityOrder sky_mesh,1 Return sky_mesh End Function |
||
![]() |
rctuner |
![]() Antworten mit Zitat ![]() |
---|---|---|
wo finde ich denn die Demo mit den Medien? Kannst du das nich komplett hochladen?
War wohl zu früh drann.. Hat er dann vermutlich editiert... |
||
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu [AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB] |
- Zuletzt bearbeitet von rctuner am Mi, Sep 26, 2007 21:28, insgesamt einmal bearbeitet
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ähm, wie wär's mit dem Link oben? | ||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine wirklich schöne Sache, verdient den Ausdruck realistisch. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Stevenehemals "Steven04" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, wirklich sehr sehr schick! ![]() Nur eine Frage: Was soll "Pivot" bringen? Ich kann keinen Sinn davon feststellen. Mfg Steven Edit: Außerdem gibt es das Problem, dass die Wolken immer vor meinen "Baum-Sprites" dargestellt werden. WBuffer ist eingeschaltet. Kann man da etwas gegen machen? |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Steven04 hat Folgendes geschrieben: Ja, wirklich sehr sehr schick!
![]() Nur eine Frage: Was soll "Pivot" bringen? Ich kann keinen Sinn davon feststellen. Edit: Außerdem gibt es das Problem, dass die Wolken immer vor meinen "Baum-Sprites" dargestellt werden. WBuffer ist eingeschaltet. Kann man da etwas gegen machen? Das mit dem Pivot hatte ich vergessen zu reaktivieren, mit der falschen Darstellung solltest Du die mesh(1-x) mit Entityorder nach der Skybox und vor Deinen Objekten zeichnen lassen. Darüber hinaus habe ich den Code noch weiter verbessert, hier die Version 1.1 (benutzt dieselben Mediadateien wie die erste). Neuerungen sind im Header beschrieben. Und wer es ganz schnell haben will sollte nur einen Layer, den aber mit ca. 200 Wolken gestopft benutzen: Code: [AUSKLAPPEN] ; ----------------------------------------------------------------------------------------------------------------------
; ; Single Surface Wolken Demo ; ========================== ; ; by Krischan 20.09.2007 ; Version 1.1 ; ; Eine kleine Demo mit 4 verschiedenen Wolkenlayern. Einzelne Quads werden in je eine Surface hinzugefügt und diese dann ; mit der Wolkentextur gemappt. Die "Bewegung" der Layer erfolgt durch Löschung der Surface und Neuanlage der Quads pro ; Durchgang. Wenn das jemand eleganter lösen kann, nur her damit. ; ; Tasten: ; 1-8 Wolkenlayer 1-8 ausblenden ; F1 Jeden Layer zufällig einfärben ; W Wireframe-Modus an/aus ; SPACE Zufälliges Lichtambiente erzeugen ; ; Steuerung: ; Maus Herumschauen ; Mausrad vor/zurück = Wolkengeschwindigkeit mehr/weniger ; LMB aufwärts ; MMB Wolkengeschwindigkeit Reset ; RMB abwärts ; Pfeiltasten vor/zurück/links/rechts ; ; ---------------------------------------------------------------------------------------------------------------------- ; ; Thx to hectic aus dem Blitzforum für seinen "Skyhaubengenerator", der hier Verwendung findet sowie Mr. Keks für seine ; Function "AddToSurface" sowie Pongo aus der BB-Community für seine tollen Wolkentexturen (die ich etwas geändert habe) ; ; Skyhaubengenerator: http://www.blitzforum.de/forum/viewtopic.php?t=21983 ; AddToSurface: http://www.blitzforum.de/forum/viewtopic.php?t=20181 ; Wolkentexturen: http://www.andimages.com/proofs/pongo/blitz/clouds.zip ; ; ---------------------------------------------------------------------------------------------------------------------- ; ; Changelog 1.0 > 1.1 ; =================== ; ; - ADD: Wireframe-Mode hinzugefügt (Taste W) ; - ADD: entfernungsabhängige Höhe eingebaut (ermöglicht niedrigeren Horizont und mehr Dreidimensionalität) ; - ADD: entfernungsabhängige Drehung eingebaut (rudimentär, sieht aber beinahe animiert aus) ; - ADD: zufällige Drehrichtung und Drehgeschwindigkeit der Wolken ; - ADD: Variable skysc für Skalierung des Sky ; - ADD: weiche Steuerung eingebaut ; - ADD: Plane"kollision" eingebaut ; - ADD: FPS Anzeige ; - ADD: Speedanzeige ; - ADD: Wolkengeschwindigkeit mit Mausrad beeinflussbar ; - ADD: Vsync Variable ; ; - FIX: "pivot" wurde nicht verwendet weil kein Quadparent vorhanden war :-) ; - FIX: Variable skyh wurde nicht verwendet ; - FIX: Wolken sind nicht mehr fullbright ; - FIX: weniger Layer verwendet (4 anstatt 8, sieht genauso gut aus und ist schneller) ; - FIX: Rotationswinkel eingegrenzt (45 anstatt 180 Grad) ; - FIX: Höhe angepasst (100 anstatt 20 Minimum, die Wolken waren zu nahe an der Kamera) ; - FIX: Flip ist nun nicht auf Vsync beschränkt ; - FIX: verschiedene Variablen auf optimale Werte gesetzt ; ; ---------------------------------------------------------------------------------------------------------------------- ; Variablen ; ---------------------------------------------- Global cam, player,move#,m#,morg#,pos Global cam_pitch#, cam_yaw# Global mvx#,mvy#,mvz#,targetpitch#,targetyaw# layer = 4 ; Anzahl Wolkenlayer (je Layer eine Wolkentextur) max = 50 ; Anzahl Wolken pro Layer r = 1000 ; Range des Wolkenfeldes (-r,r) h1 = 100 ; Starthöhe der Wolken h2 = 150 ; Maximale Höhe der Wolken (je höher, desto mehr Range erforderlich!) m# = 0.05 ; Geschwindigkeit der Wolken scale1 = 25 ; Minimalgrösse einer Wolke scale2 = 75 ; Maximalgrosse einer Wolke (zu grosse Wolken gehen auf FPS!) rot1 = -45 ; Rotationswinkel Start rot2 = 45 ; Rotationswinkel Ende rs# = 0.1 ; Rotationsgeschwindigkeit move# = 0.01 ; Spielergeschwindigkeit var# = 2.5 ; Varianz der Geschwindigkeit (1.0 = alle gleich schnell) skyh# = 1.75 ; Höhe der Skybox über der Kamera sky$ = "skygen.png" ; Skytextur skysc = 100 ; Skygrösse vsync = True ; Vsync True oder False Graphics3D 1024,768,32,1 ; Alles zufällig ; ---------------------------------------------- SeedRnd MilliSecs() ; Felder dimensionieren ; ---------------------------------------------- Dim x#(max,layer),y#(max,layer),z#(max,layer),sc#(max,layer),ro#(max,layer),rz#(max,layer),mesh(layer),surf(layer),tex(layer),hl(layer) ; Layer vorbereiten, Texturen laden und zuweisen ; ---------------------------------------------- pivot = CreatePivot() For i=1 To layer mesh(i)=CreateMesh() surf(i)=CreateSurface(mesh(i)) tex(i)=LoadTexture("cloud"+i+".png",2) For j=1 To max x#(j,i)=Rnd(-r,r) ; X-Position y#(j,i)=Rnd(h1,h2) ; Y-Position z#(j,i)=Rnd(-r,r) ; Z-Position sc#(j,i)=Rnd(scale1,scale2) ; Grösse ro#(j,i)=Rnd(rot1,rot2) ; Rotation rz#(j,i)=Rand(-1,1) ; Rotationsrichtung Next EntityTexture mesh(i),tex(i) EntityParent mesh(i),pivot hl(i)=1 Next ; Himmel ; ---------------------------------------------- sky_mesh=InitSkyHaube(sky$,skysc) ; Kamera, Licht und Nebel ; ---------------------------------------------- AmbientLight 255,255,255 player=CreatePivot() targetyaw=90 cam=CreateCamera(player) PositionEntity cam,0,2,0 CameraClsColor cam,255,255,255 CameraFogColor cam,255,255,255 CameraRange cam,1,r*2 CameraFogRange cam,0,r CameraFogMode cam,True c1=255 : c2=255 : c3=255 ; Eine Plane als Boden ; ---------------------------------------------- plane=CreatePlane() PositionEntity plane,0,0,0 ptex=LoadTexture("grass.png") EntityTexture plane,ptex ScaleTexture ptex,4,4 ; Mauszeiger in die Mitte ; ---------------------------------------------- MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2) morg#=m# ; Hauptschleife ; ---------------------------------------------- While Not KeyDown(1) ; Wolkengeschwindigkeit beeinflussen If pos Then m#=m#+(pos/100.0) If m#<=0 Then m#=0 ; Alle Layer neu berechnen For i=1 To layer If KeyHit(1+i) Then hl(i)=1-hl(i) If hl(i)=0 Then HideEntity mesh(i) Else ShowEntity mesh(i) If hl(i)=1 Then ClearSurface(surf(i),1,1) For j=1 To max x#(j,i)=x#(j,i)+m#*Rnd(1,var#) : If x#(j,i)>=r Then x#(j,i)=-r : z#(j,i)=Rnd(-r,r) : rz(j,i)=Rand(-1,1) c=CreateQuad(pivot) dist#=Sqr((EntityX(cam,0)-x#(j,i))^2+(EntityZ(cam,0)-z#(j,i))^2)/Sqr(h2-h1) PositionEntity c,x#(j,i),y#(j,i)-dist#,z#(j,i) ScaleEntity c,sc#(j,i),sc#(j,i),sc#(j,i) RotateEntity c,90,x#(j,i)*rz(j,i)*rs#,ro#(j,i) AddToSurface(c,surf(i),mesh(i)) FreeEntity c Next EndIf Next ; SPACE = zufälliges Farbambiente erzeugen If KeyHit(57) Then c1=Rand(0,255) : c2=Rand(0,255) : c3=Rand(0,255) EntityColor sky_mesh,c1,c2,c3 EntityColor plane,c1,c2,c3 CameraClsColor cam,c1,c2,c3 CameraFogColor cam,c1,c2,c3 For i=1 To layer : EntityColor mesh(i),c1,c2,c3 : Next EndIf ; F1 = Layer farbig unterscheiden If KeyHit(59) Then For i=1 To layer : EntityColor mesh(i),Rand(0,255),Rand(0,255),Rand(0,255) : Next ; W = Wireframe an/aus If KeyHit(17) Then wf=1-wf : WireFrame wf If wf=1 Then CameraClsColor cam,128,128,128 Else CameraClsColor cam,c1,c2,c3 EndIf ; Spielebewegung Playercontrols() ; Sky und Pivot an Spielepivot hängen, die Layer werden nur leicht bewegt cx#=EntityX(player) : cy#=EntityY(player) : cz#=EntityZ(player) PositionEntity pivot,cx#,cy#-(cy#/50.0),cz# PositionEntity sky_mesh,cx#,cy#+skyh#,cz# RenderWorld ; FPS counter FPS_C=FPS_C+1 If ms<MilliSecs() ms=MilliSecs()+1000 FPS=FPS_C FPS_C=0 EndIf ; Textausgabe wl=0 For i=1 To layer If hl(i)=1 Then t$="sichtbar" : wl=wl+1 Else t$="unsichtbar" Color 0,0,0 : Text 1,1+(1+i)*16,"Layer "+i+": "+t$ Color 255,255,255 : Text 0,(1+i)*16,"Layer "+i+": "+t$ Next Color 0,0,0 : Text 1,1,"FPS: "+FPS+" Tris: "+TrisRendered()+" Wolken: "+(wl*max)+"/"+(layer*max)+" Speed: "+m# Color 255,255,255 : Text 0,0,"FPS: "+FPS+" Tris: "+TrisRendered()+" Wolken: "+(wl*max)+"/"+(layer*max)+" Speed: "+m# Flip vsync Wend ; ----------------------------------------------------------------- ; Ein Mesh mit seinen Daten zu einer Single Surface hinzufügen ; ----------------------------------------------------------------- Function AddToSurface(mesh, surf,singlesurfaceentity) Local vert[2] For s = 1 To CountSurfaces(mesh) surface = GetSurface(mesh,s) For i = 0 To CountTriangles(surface)-1 For i2 = 0 To 2 oldvert = TriangleVertex(surface,i,i2) TFormPoint VertexX(surface,oldvert),VertexY(surface,oldvert),VertexZ(surface,oldvert), mesh,singlesurfaceentity vert[i2] = AddVertex(surf,TFormedX(),TFormedY(),TFormedZ(),VertexU(surface,oldvert),VertexV(surface,oldvert)) Next AddTriangle(surf, vert[0], vert[1], vert[2]) Next Next End Function ; ----------------------------------------------------------------- ; Ein einfaches Quad erstellen ; ----------------------------------------------------------------- Function CreateQuad(parent=0) quad=CreateMesh(parent) brush=CreateBrush(255,255,255) v=CreateSurface(quad,brush) FreeBrush brush AddVertex ( v,-3,3,0,1,0) AddVertex ( v,3,3,0,0,0) AddVertex ( v,-3,-3,0,1,1) AddVertex ( v,3,-3,0,0,1) AddTriangle( v,0,1,2) AddTriangle( v,3,2,1) FlipMesh(quad) Return quad End Function ; ----------------------------------------------------------------- ; Skyhaube laden ; ----------------------------------------------------------------- Function InitSkyHaube(sky$,skysc) ;Sky-Mesh-Erstellen sky_mesh=CreateMesh() skytex=LoadBrush(sky$,0,6,6) sky_face=CreateSurface(sky_mesh,skytex) ;Sky-Mesh-Zusammen-Stellen v0=AddVertex(sky_face,-3,0,-3,0,6) v1=AddVertex(sky_face,-3,0,+3,0,0) v2=AddVertex(sky_face,+3,0,+3,6,0) v3=AddVertex(sky_face,+3,0,-3,6,6) v4=AddVertex(sky_face,-1,1,-1,2,4) v5=AddVertex(sky_face,-1,1,+1,2,2) v6=AddVertex(sky_face,+1,1,+1,4,2) v7=AddVertex(sky_face,+1,1,-1,4,4) ;Sky-Mesh-Triangulieren AddTriangle(sky_face,v1,v0,v4) AddTriangle(sky_face,v1,v4,v5) AddTriangle(sky_face,v2,v1,v5) AddTriangle(sky_face,v2,v5,v6) AddTriangle(sky_face,v3,v2,v6) AddTriangle(sky_face,v3,v6,v7) AddTriangle(sky_face,v0,v3,v7) AddTriangle(sky_face,v0,v7,v4) AddTriangle(sky_face,v5,v4,v7) AddTriangle(sky_face,v7,v6,v5) ;Sky-Mesh-Standard-Größe ScaleMesh sky_mesh,skysc,skysc,skysc ; immer zuerst zeichnen EntityOrder sky_mesh,1 Return sky_mesh End Function ; ----------------------------------------------------------------- ; vertikale Begrenzung der Maus ; ----------------------------------------------------------------- Function ClampValue(Original#, low#, high#) If Original<low Then Return low If Original>high Then Return high Return Original End Function ; -------------------------------------------------------------------------------------------------- ; Spielersteuerung ; -------------------------------------------------------------------------------------------------- Function PlayerControls() mxspd# = MouseXSpeed()*0.25 myspd# = MouseYSpeed()*0.25 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 targetpitch = targetpitch + myspd targetpitch = ClampValue(targetpitch, -85,85) targetyaw = targetyaw - mxspd cam_pitch = cam_pitch + (targetpitch - cam_pitch)/8.0 cam_yaw = cam_yaw + (targetyaw - cam_yaw)/8.0 RotateEntity player,0,cam_yaw,0 RotateEntity cam,cam_pitch,0,0 If KeyDown(200) Then mvz=mvz+move# If KeyDown(208) Then mvz=mvz-move# If KeyDown(205) Then mvx=mvx+move# If KeyDown(203) Then mvx=mvx-move# If MouseDown(1) Then mvy=mvy+move# If MouseDown(2) And EntityY(player)>0 Then mvy=mvy-move# If MouseDown(3) Then m#=morg# pos=MouseZSpeed() TranslateEntity player,0,mvy,0 MoveEntity player,mvx,0,mvz ; weiche Bewegung mvx=mvx/1.01 mvy=mvy/1.01 mvz=mvz/1.01 ; Plane erreicht? Stop If (EntityY(player)-mvy#)<0 Then PositionEntity player,EntityX(player),0,EntityZ(player) End Function |
||
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke! Eine sehr schöne Sache, die wunderbar in mein aktuelles Projekt passt! ^^
Ich habe allerdings noch einen Bug gefunden: Die Geschwindigkeit aller Wolken wird in jedem Hauptschleifendurchlauf neu geändert. Das führt dazu, dass sich die Wolken im Großen und Ganzen immer gleichschnell bewegen, egal was man einstellt, dafür wird die Bewegung bei höherer Varianz stark ruckelig. Die Lösung ist aber einfach: 1.: Die Zeile Code: [AUSKLAPPEN] Dim x#(max,layer),y#(max,layer),z#(max,layer),sc#(max,layer),ro#(max,layer),rz#(max,layer),mesh(layer),surf(layer),tex(layer),hl(layer)
ergänzen durch Code: [AUSKLAPPEN] ,wolken_tempo#(max,layer)
2.: Die Zeile Code: [AUSKLAPPEN] wolken_tempo(j,i)=Rnd(1,var#) ; Geschwindigkeit der Wolke hinzufügen unter der Zeile Code: [AUSKLAPPEN] rz#(j,i)=Rand(-1,1) ; Rotationsrichtung
3.: Die Zeile Code: [AUSKLAPPEN] x#(j,i)=x#(j,i)+m#*Rnd(1,var#) : If x#(j,i)>=r Then x#(j,i)=-r : z#(j,i)=Rnd(-r,r) : rz(j,i)=Rand(-1,1) ändern in Code: [AUSKLAPPEN] x#(j,i)=x#(j,i)+m#*wolken_tempo(j,i) : If x#(j,i)>=r Then x#(j,i)=-r : z#(j,i)=Rnd(-r,r) : rz(j,i)=Rand(-1,1)
![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group