[B3D] Schneeflocken
Übersicht

![]() |
ToeBBetreff: [B3D] Schneeflocken |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nachdem mein andere Beitrag gelöscht wurde, aus einem grund den ich immernoch nicht verstehe, mach ich hier einen neuen Threath auf mit verbessertem Code.
Folgende Functionen und Constante meiner Engine könnt ihr nutzen (Die anderen auch, haben aber nix mit der Engine zu tun ![]() Functionen (Könnte man verändern, wenn man sachen anders haben will) CreateSnow(Anzahl=1) Anzahl - Anzahl der Schneeflocken Erstellt Schneeflocken, ist ratsam städig aufzurufen mit einer kleinen azhal an schneeflocken (dann kommen immer wieder welche dazu) UpdateSnow( ) Bewegt bzw. Malt die ganzen Schnee-Particle. Immer vor RenderWorld aufrufen (In der Schleife) CountSnow( ) Gibt die aktuelle anbzahl aller schnee-Particle wieder. Sollte nicht bei zu hiher particlezahl verwendet werden, geht sehr auf die Geschwindigkeit CountSnowRendered Macht das gleiche wie CountSnow nur das es nur die Particle zählt, die gerendert worden sind. Constanten (Veränderbar / der gegebenheit anpassbar) MaxSnow - Maximale anzahl an Schnee-Particlen XSnowSize - Maximaler Radius (von 0 an) in X-Richtung. In diesem Radius werden die Particle erstellt YSnowSize - Maximale Starthöhe der Particle SnowRange - Maximaler Abstand zur Camera (Danach wird nicht mehr eingezeichet) YSnowMin - minimale Starthöhe der Particle Ohne Pix kopier ich nix : Code: [AUSKLAPPEN] Graphics3D 800,600,32,1
SetBuffer BackBuffer() SeedRnd MilliSecs() Global CAM = CreateCamera() CameraRange CAM,0.1,1000 PositionEntity CAM,0,1,0 Global SnowMesh = CreateMesh(CAM) Global SnowSurf = CreateSurface(SnowMesh) Global SnowText = CreateSnowTex() EntityTexture SnowMesh,SnowText EntityBlend SnowMesh,3 Const MaxSnow = 10000 Const XSnowSize = 25 Const YSnowSize = 25 Const ZSnowSize = 25 Const SnowRange = 100 Const YSnowMin = 0 Dim Snow#(MaxSnow,7) CameraClsColor CAM,0,100,200 CameraFogMode CAM,1 CameraFogColor CAM,255,255,255 CameraFogRange CAM,10,1100 Global plane = CreatePlane() ;PositionEntity plane,0,-10,0 Global PlaneText = CreatePlaneTex() EntityTexture plane,planeText Global SKY = CreateSphere(80) ScaleEntity SKY,1000,1000,1000 FlipMesh SKY Global SkyText = CreateSKYTex() EntityTexture SKY,SkyText Global NewSnowMs Const NewSnowTime = 500 Global CountSnowVar,CountSnowRenderedVar,cs_Mls Repeat FPS_Tmp = FPS_Tmp + 1 If FPS_Mls <= MilliSecs() - 999 Then FPS = FPS_Tmp : FPS_Tmp = 0 : FPS_Mls = MilliSecs() TurnEntity CAM,MouseYSpeed()/3,0,0 TurnEntity CAM,0,-MouseXSpeed()/3,0,1 MoveEntity CAM,0,0,(KeyDown(17) - KeyDown(31)) / 10.0 MoveMouse 400,300 If NewSnowMs <= MilliSecs() - NewSnowTime CreateSnow(10) NewsSnowMs = MilliSecs() EndIf UpdateSnow() PositionEntity SKY,EntityX(CAM),EntityY(CAM),EntityZ(CAM) UpdateWorld() RenderWorld() If cs_Mls <= MilliSecs() - 1000 CountSnowVar = CountSnow() CountSnowRenderedVar = CountSnowRendered() cs_Mls = MilliSecs() EndIf Text 1,1,"FPS:"+FPS+"|SNOW:"+CountSnowVar+"|RENDERED:"+CountSnowRenderedVar Flip Until KeyHit(1) End ;_________________________________________________________________________ Function CreateSnow(anz=1) For i = 1 To anz akt = -1 For sn = 0 To MaxSnow If Snow(sn,0) = 0 akt = sn : Exit Next If akt = -1 Then akt = Rand(0,MaxSnow) Snow(akt,0) = 1 ;ON SnowWinkl = Rand(360) Snow(akt,1) = Sin(SnowWinkl) * Rnd(0,XSnowSize) ; X Snow(akt,2) = Rnd(YSnowMin,YSnowSize) ; Y Snow(akt,3) = Cos(SnowWinkl) * Rnd(0,ZSnowSize) ; Z Snow(akt,4) = Rnd(-0.01,-0.005) ;SY Snow(akt,5) = Rand(0,0) ;Bild Snow(akt,6) = Rnd(0.0101,0.0501) ; Scale Next End Function Function UpdateSnow() ClearSurface SnowSurf For i = 0 To MaxSnow If Snow(i,0) = 1 XX# = Snow(i,1) YY# = Snow(i,2) ZZ# = Snow(i,3) SY# = Snow(i,4) Bild= Snow(i,5) SC# = Snow(i,6) XX# = XX# + Rnd(-0.01,0.01) YY# = YY# + SY# ZZ# = ZZ# + Rnd(-0.01,0.01) Snow(i,1) = XX# Snow(i,2) = YY# Snow(i,3) = ZZ# TFormPoint(XX,YY,ZZ,0,CAM) snow(i,7) = 0 ZZ# = TFormedZ() If ZZ > 0 And ZZ < SnowRange XX# = TFormedX() If XX# < ZZ*2 And XX > -ZZ*2 YY# = TFormedY() If YY < ZZ*2 And YY > -ZZ*2 ;If Bild = 0 Then ;uv_U1# = 0:uv_V1# = 0:uv_U2# = 0.5:uv_V2# = 0.5 AddSnow(XX,YY,ZZ,SC) snow(i,7) = 1 EndIf EndIf EndIf If Snow(i,2) < 0 Snow(i,0) = 0 EndIf Next End Function ;_________________________________________________________________________ Function CountSnowRendered() Local SnowAnz = 0 For i = 1 To MaxSnow If snow(i,0) = 1 If snow(i,7) = 1 SnowAnz = SnowAnz + 1 EndIf Next Return SnowAnz End Function Function CountSnow() Local SnowAnz = 0 For i = 0 To MaxSnow If Snow(i,0) = 1 SnowAnz = SnowAnz + 1 Next Return SnowAnz End Function ;_________________________________________________________________________ Function AddSnow(xx#,yy#,zz#,sc#) v0 = AddVertex(SnowSurf,XX-SC,YY-SC,ZZ,0,0) v1 = AddVertex(SnowSurf,XX+SC,YY-SC,ZZ,1,0) v2 = AddVertex(SnowSurf,XX-SC,YY+SC,ZZ,0,1) v3 = AddVertex(SnowSurf,XX+SC,YY+SC,ZZ,1,1) AddTriangle(SnowSurf,v2,v1,v0) AddTriangle(SnowSurf,v2,v3,v1) End Function ;_________________________________________________________________________ Function CreateSnowTex() Local SnowTex = CreateTexture(64,64) Local TexBuff = TextureBuffer(SnowTex) Color 255,255,255 LockBuffer TexBuff For i = 0 To 32 Step 1 c = ((32-i)*8) col = 1*$1000000 + c*$10000 + c*$100 + c For j = 0 To 360 WritePixelFast(32-Cos(j)*i,32-Sin(j)*i,col,TexBuff) Next Next UnlockBuffer TexBuff Return SnowTex End Function Function CreatePlaneTex() Local PlTex = CreateTexture(128,128) Local PlBuf = TextureBuffer(PlTex) LockBuffer PlBuf For xx = 0 To 128 For yy = 0 To 128 WritePixel xx,yy,(1*$1000000+0*$10000+176*$100+0),PlBuf Next Next For i = 64 To 44 Step -1 c = i * 4 col = 1*$1000000+0*$10000+c*$100+0 For j = 0 To i WritePixel 64-i,64-j,col,PlBuf WritePixel 64+i,64-j,col,PlBuf WritePixel 64-i,64+j,col,PlBuf WritePixel 64+i,64+j,col,PlBuf WritePixel 64-j,64-i,col,PlBuf WritePixel 64-j,64+i,col,PlBuf WritePixel 64+j,64-i,col,PlBuf WritePixel 64+j,64+i,col,PlBuf Next Next UnlockBuffer PlBuf Color 0,255,0 SetBuffer PlBuf Rect 0,0,128,128,0 SetBuffer BackBuffer() Color 255,255,255 ScaleTexture PlTex,5,5 Return PlTex End Function Function CreateSKYTex() Local SkyTex = CreateTexture(1024,1024) Local SkyBuf = TextureBuffer(SkyTex) SetBuffer SkyBuf Color 0,100,200 Rect 0,0,1024,1024 Color 255,255,255 For i = 1 To Rand(5,10) xx = Rand(0,1024) yy = Rand(0,1024) For j = 1 To Rand(5,10) r = Rand(-200,200) rad = Rand(50,200) Oval xx+r,yy+r,rad,rad Next Next SetBuffer BackBuffer() Return SkyTex End Function Ich hoffe es gefällt euch und dieser Threath wird nicht sofort gelöscht -.- Wüsste gern auch mal wei schnell das so bei euch laüft (Flip 0) lg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hätte es so gemacht, dass man nicht immer neue Flocken per CreateSnow(Anzahl) erstellen muss, sondern, dass man eine Feste Anzahl von Flocken hat, die einfach immer wieder, wenn sie den Boden berührt haben, nach oben gesetzt werden. Wäre praktischer. Also mit CreateSnow(1000) würden immer 1000 Schneeflocken um dich rumschwirren ... | ||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
mhmh.... Okay danke für den Tipp, versuch ich mal ![]() lg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
SYSThern |
![]() Antworten mit Zitat ![]() |
---|---|---|
bei meiner engine kannst du konstsnt so viele flakes erstelln wie man will
sie werdenauch nicht mehr gelöscht und es gibt auch regen... ruckelt immer noch wahrscheinlich wurde dein thread gelöscht weil du sozusagen den code von sparxs kritisiert hast um deinen eigenen besser zustellen_--sorry wenn ich mich da irre aso fps am anfang 400 dan ganz schnell auf 200 winVista 8600gt 2*1,86ghz 2gb ram |
||
Tools and Programms
-------------------- www.systhern.de |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ne der Threath von ihm hat mich nur dazu ANGEREGT, eine schnellere Version zu schreiben. Das ruckeln kann aber auch davov kommen, das ich die X bzw. Z Position immer + eine ZuffallsZahl zähle, d.h. es ist keine Flüssige bewegung, änder ich aber noch.
Danke fürs Testen ^^ lg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei mir (64Mb Onboard-Karte) läufts bei 10000 Flocken mit 16 FPS... | ||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
So, ich habe jetzt Folgendes geändert :
-CreateSnow jetzt VOR der schleife, erstellt z.b. 15000 Schneeflocken und dass wars -UpdateSnow setzt jetzt die heruntergefallenden Schneeflocken wieder hoch -Schneflocken werden um die Camera herum erstellt, dadurch gibt es keine schneefreie zone ^^ -Schneeflocken werden jetzt mit Sinus (Sin) gleichmäßig hin und her bewegt, sieht besser aus und ruckelt nicht so ![]() Code: [AUSKLAPPEN] Graphics3D 800,600,32,1
SetBuffer BackBuffer() SeedRnd MilliSecs() Global CAM = CreateCamera() CameraRange CAM,0.1,1000 PositionEntity CAM,0,1,0 Global SnowMesh = CreateMesh(CAM) Global SnowSurf = CreateSurface(SnowMesh) Global SnowText = CreateSnowTex() EntityTexture SnowMesh,SnowText EntityBlend SnowMesh,3 Global MaxSnow = 1000 Const XSnowSize = 50 Const YSnowSize = 50 Const ZSnowSize = 50 Const SnowRange = 10 Const YSnowMin = 0 Dim Snow#(MaxSnow,7) CameraClsColor CAM,0,100,200 CameraFogMode CAM,1 CameraFogColor CAM,255,255,255 CameraFogRange CAM,10,110 Global plane = CreatePlane() ;PositionEntity plane,0,-10,0 Global PlaneText = CreatePlaneTex() EntityTexture plane,planeText Global SKY = CreateSphere(80) ScaleEntity SKY,100,100,100 FlipMesh SKY Global SkyText = CreateSKYTex() EntityTexture SKY,SkyText Global NewSnowMs Const NewSnowTime = 500 Global CountSnowVar,CountSnowRenderedVar,cs_Mls CreateSnow(15000) Repeat FPS_Tmp = FPS_Tmp + 1 If FPS_Mls <= MilliSecs() - 999 Then FPS = FPS_Tmp : FPS_Tmp = 0 : FPS_Mls = MilliSecs() TurnEntity CAM,MouseYSpeed()/3,0,0 TurnEntity CAM,0,-MouseXSpeed()/3,0,1 MoveEntity CAM,0,0,(KeyDown(17) - KeyDown(31)) / 10.0 MoveMouse 400,300 UpdateSnow() PositionEntity SKY,EntityX(CAM),EntityY(CAM),EntityZ(CAM) UpdateWorld() RenderWorld() If cs_Mls <= MilliSecs() - 1000 CountSnowVar = CountSnow() CountSnowRenderedVar = CountSnowRendered() cs_Mls = MilliSecs() EndIf Text 1,1,"FPS:"+FPS+"|SNOW:"+CountSnowVar+"|RENDERED:"+CountSnowRenderedVar Flip 0 Until KeyHit(1) End ;_________________________________________________________________________ Function CreateSnow(anz=1000) anz = anz - 1 MaxSnow = anz Dim snow(anz,7) For i = 0 To anz Snow(i,0) = 1 ;ON SnowWinkl = Rand(360) Snow(i,1) = EntityX(CAM)+Sin(SnowWinkl) * Rnd(0,XSnowSize) ; X Snow(i,2) = Rnd(YSnowMin,YSnowSize) ; Y Snow(i,3) = EntityZ(CAM)+Cos(SnowWinkl) * Rnd(0,ZSnowSize) ; Z Snow(i,4) = Rnd(-0.01,-0.005) ;SY Snow(i,5) = Rand(0,360) ;Bild Snow(i,6) = Rnd(0.0101,0.0501) ; Scale Next End Function Function UpdateSnow() ClearSurface SnowSurf For i = 0 To MaxSnow If Snow(i,0) = 1 XX# = Snow(i,1) YY# = Snow(i,2) ZZ# = Snow(i,3) SY# = Snow(i,4) SC# = Snow(i,6) Snow(i,5) = (Snow(i,5) + 1) Mod 360 XX# = XX# + Sin(Snow(i,5))*0.001 YY# = YY# + SY# ZZ# = ZZ# + Sin(Snow(i,5))*0.001;Rnd(-0.01,0.01) Snow(i,1) = XX# Snow(i,2) = YY# Snow(i,3) = ZZ# TFormPoint(XX,YY,ZZ,0,CAM) snow(i,7) = 0 ZZ# = TFormedZ() If ZZ > 0 And ZZ < SnowRange XX# = TFormedX() If XX# < ZZ*2 And XX > -ZZ*2 YY# = TFormedY() If YY < ZZ*2 And YY > -ZZ*2 ;If Bild = 0 Then ;uv_U1# = 0:uv_V1# = 0:uv_U2# = 0.5:uv_V2# = 0.5 AddSnow(XX,YY,ZZ,SC) snow(i,7) = 1 EndIf EndIf EndIf If Snow(i,2) < -2.5 SnowWinkl = Rand(360) SnowWinkl = Rand(360) Snow(i,1) = EntityX(CAM)+Sin(SnowWinkl) * Rnd(0,XSnowSize) Snow(i,2) = Rnd(YSnowMin,YSnowSize) Snow(i,3) = EntityZ(CAM)+Cos(SnowWinkl) * Rnd(0,ZSnowSize) EndIf EndIf Next End Function ;_________________________________________________________________________ Function CountSnowRendered() Local SnowAnz = 0 For i = 1 To MaxSnow If snow(i,0) = 1 If snow(i,7) = 1 SnowAnz = SnowAnz + 1 EndIf Next Return SnowAnz End Function Function CountSnow() Return (MaxSnow+1) End Function ;_________________________________________________________________________ Function AddSnow(xx#,yy#,zz#,sc#) v0 = AddVertex(SnowSurf,XX-SC,YY-SC,ZZ,0,0) v1 = AddVertex(SnowSurf,XX+SC,YY-SC,ZZ,1,0) v2 = AddVertex(SnowSurf,XX-SC,YY+SC,ZZ,0,1) v3 = AddVertex(SnowSurf,XX+SC,YY+SC,ZZ,1,1) AddTriangle(SnowSurf,v2,v1,v0) AddTriangle(SnowSurf,v2,v3,v1) End Function ;_________________________________________________________________________ Function CreateSnowTex() Local SnowTex = CreateTexture(64,64) Local TexBuff = TextureBuffer(SnowTex) Color 255,255,255 LockBuffer TexBuff For i = 0 To 32 Step 1 c = ((32-i)*8) col = 1*$1000000 + c*$10000 + c*$100 + c For j = 0 To 360 WritePixelFast(32-Cos(j)*i,32-Sin(j)*i,col,TexBuff) Next Next UnlockBuffer TexBuff Return SnowTex End Function Function CreatePlaneTex() Local PlTex = CreateTexture(128,128) Local PlBuf = TextureBuffer(PlTex) LockBuffer PlBuf For xx = 0 To 128 For yy = 0 To 128 WritePixel xx,yy,(1*$1000000+0*$10000+176*$100+0),PlBuf Next Next For i = 64 To 44 Step -1 c = i * 4 col = 1*$1000000+0*$10000+c*$100+0 For j = 0 To i WritePixel 64-i,64-j,col,PlBuf WritePixel 64+i,64-j,col,PlBuf WritePixel 64-i,64+j,col,PlBuf WritePixel 64+i,64+j,col,PlBuf WritePixel 64-j,64-i,col,PlBuf WritePixel 64-j,64+i,col,PlBuf WritePixel 64+j,64-i,col,PlBuf WritePixel 64+j,64+i,col,PlBuf Next Next UnlockBuffer PlBuf Color 0,255,0 SetBuffer PlBuf Rect 0,0,128,128,0 SetBuffer BackBuffer() Color 255,255,255 ScaleTexture PlTex,5,5 Return PlTex End Function Function CreateSKYTex() Local SkyTex = CreateTexture(1024,1024) Local SkyBuf = TextureBuffer(SkyTex) SetBuffer SkyBuf Color 0,100,200 Rect 0,0,1024,1024 Color 255,255,255 For i = 1 To Rand(5,10) xx = Rand(0,1024) yy = Rand(0,1024) For j = 1 To Rand(5,10) r = Rand(-200,200) rad = Rand(50,200) Oval xx+r,yy+r,rad,rad Next Next SetBuffer BackBuffer() Return SkyTex End Function Bei mir laüft dieser Code mit ~25 FPS... lg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
- Zuletzt bearbeitet von ToeB am So, Okt 19, 2008 10:41, insgesamt einmal bearbeitet
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
20 FPS. Wenn man jetzt noch bei jedem Schleifendurchlauf kleine weiße Kreise auf die Bodentextur zeichnet, wirds noch echter... | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group