Singlesurface "Minecraft"-problem
Übersicht BlitzMax, BlitzMax NG Allgemein
InfectedBetreff: Singlesurface "Minecraft"-problem |
Do, Sep 05, 2013 18:40 Antworten mit Zitat |
|
---|---|---|
Hallo!
Zuerst einmal: nein, ich habe nicht vor den 10000. minecraft clone zu veröffentlichen, das ganze dient lediglich zur übung, und um etwas tiefer in die 3d programmierung mit blitzmax (b3d) einzusteigen. Ich hab, anhand der informationen die ich so aufgeschnappt habe, versucht einfach mal drauflos zu machen, ohne groß tutorials oder ähnliches zu lesen, zu diesem thema. Ich wette, es gibt einige Dinge, bei denen sich einige von euch an den Kopf fassen und denken "was soll das?", aber dennoch werde ich einfach mal den code hier posten, und hoffen, dass jemand den fehler findet. Augenscheinlich werden alle würfel erstellt, und die triangles auch, allerdings bleibt der Bildschirm schwarz. wahrscheinlich hab ich einfach komplett falsch gedacht, und es ist humbug was ich da fabriziert hab. Ich möchte auch nicht nach berichtigtem code betteln, sondern einfach wissen, was ihr meint woran der fehler liegen könnte Also, hier der Code: main Code: [AUSKLAPPEN] Import sidesign.minib3d
Graphics 1920,1080,32,2,1 SeedRnd MilliSecs() Include "functions.bmx" '######### ######### ########### ############## ####### ########### Types ###### ################# ######################### ####### ############# Type CubeTemp ' Würfel Template Field x:Int Field y:Int Field z:Int Field vertex[8] End Type Type Chunk ' Chunk Template; standart size: x=25,z=25,y=200 Field x:Int Field y:Int Field id:Int Field cubes[26,26,202] End Type '########## ################### ################################# ################### ############################# ############## ########### '########## ################ #################### ############# Variables ################ ############### ################### ################ Global world:TMesh,surface:TSurface Global chunklist:TList = CreateList() Global cubelist:TList = CreateList() Global TempVertex[7] '######## ###################### ##################################### ########################################## ############### ############ createworld(1,1) Local Texture:TTexture=LoadTexture("tex.bmp") EntityTexture World,Texture,0,0 Local Camera=CreateCamera() PositionEntity Camera,0,200,0 Local Light=CreateLight() PositionEntity light,0,200,0 RotateEntity Light,60,30,10 FirstDrawSurface While Not KeyHit(KEY_ESCAPE) UpdateWorld() RenderWorld Flip Wend End functions: Code: [AUSKLAPPEN] Function createWorld(worldX:Int,worldZ:Int)
Local mx:Int=0,my:Int=0, M_id:Int=0' Lokale Variable world=CreateMesh(Parent) surface=CreateSurface(world) For mx = 1 To worldX ' Erstellen der benötigten Chunks For my = 1 To worldZ CreateChunk(mx,my,M_id) m_id = m_id + 1 Next Next End Function Function FirstDrawSurface() Local mx:Int=0,my:Int=0,mz:Int=0 For currentChunk:Chunk = EachIn chunklist For mx = 1 To 25 For mz = 1 To 25 For my = 1 To 200 newcube:CubeTemp = New CubeTemp newcube.x = mx newcube.y = my newcube.z = mz newcube.vertex[0] = AddVertex(Surface,(mx*2)+1,(my*2)+1,(mz*2)-1) newcube.vertex[1] = AddVertex(Surface,(mx*2)-1,(my*2)+1,(mz*2)-1) newcube.vertex[2] = AddVertex(Surface,(mx*2)-1,(my*2)+1,(mz*2)+1) newcube.vertex[3] = AddVertex(Surface,(mx*2)+1,(my*2)+1,(mz*2)+1) newcube.vertex[4] = AddVertex(surface,(mx*2)+1,(my*2)-1,(mz*2)+1) newcube.vertex[5] = AddVertex(surface,(mx*2)+1,(my*2)-1,(mz*2)-1) newcube.vertex[6] = AddVertex(surface,(mx*2)-1,(my*2)-1,(mz*2)-1) newcube.vertex[7] = AddVertex(surface,(mx*2)-1,(my*2)-1,(mz*2)+1) If currentChunk.cubes[mx,mz,my] = 1 If currentChunk.cubes[mx,mz,my+1] = 0 AddTriangle(Surface,newcube.vertex[0],newcube.vertex[2],newcube.vertex[1]) AddTriangle(Surface,newcube.vertex[0],newcube.vertex[2],newcube.vertex[3]) EndIf EndIf Next Next Next Next EndFunction Function CreateChunk(mx:Int,my:Int,m_id:Int) Local countx:Int=1,county:Int=1,countz:Int=1,rndcount:Int=0 newchunk:Chunk = New Chunk newchunk.x = mx newchunk.y = my newchunk.id = m_id For countx = 1 To 25 For countz = 1 To 25 For county = 1 To 80 newchunk.cubes[countx,countz,county] = 1 Next For county = 81 To 90 If newchunk.cubes[countx,countz,county-1] = 1 newchunk.cubes[countx,countz,county] = Rnd(0,1) Else newchunk.cubes[countx,countz,county] = 0 EndIf Next For county = 91 To 200 If newchunk.cubes[countx,countz,county-1] = 1 rndcount = Rnd(0,10) If rndcount > 6 newchunk.cubes[countx,countz,county] = 1 Else newchunk.cubes[countx,countz,county] = 0 EndIf Else newchunk.cubes[countx,countz,county] = 0 EndIf Next Next Next ListAddLast(chunklist,newchunk) EndFunction |
||
XeresModerator |
Do, Sep 05, 2013 22:46 Antworten mit Zitat |
|
---|---|---|
Ich habe in deine langen Kommentarzeilen Leerzeichen nacheditiert. Nicht jeder hat super-Breitbild und leider zerschießt das das Forenlayout.
Ich bitte nach Möglichkeit darauf zu achten und bedanke mich für dein Verständnis. |
||
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) |
CO2ehemals "SirMO" |
Do, Sep 05, 2013 23:00 Antworten mit Zitat |
|
---|---|---|
Ich bin jetzt nicht mehr so ganz in der 3D-Programmierung drin, da ich seit 2 Jahren nicht mehr damit arbeite, aber einer meiner Fehler war ständig, das ich die Kamera entweder so positioniert habe, dass die World nicht mehr in der Kamera-Range lag oder ich einfach die Kamera falsch rotiert habe (das quasi die Welt "hinter" der Kamera lag, etc.)
Du könntest das mal Testen, indem du sofort zu Anfang einen Block direkt vor der Kamera platziert, um eben Positions- und Rotationsfehler auszuschließen... Tipp: Mach einen FPS Timer, um den Prozessor nicht unnötig zu belasten, denn so führt der Prozessor die Befehle in der Hauptschleife so schnell er kann aus, das Resultat sind 100% Auslastung. Zudem würde ich auch einmal pro Schleifendurchlauf die Screen Clearen (Cls), denn sonst werden die neu gerenderten Sachen einfach zu den Sachen hinzugemalt, die bereits auf dem Screen sind, und das sieht dann nicht mehr so gut aus |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
Infected |
Mo, Sep 09, 2013 0:26 Antworten mit Zitat |
|
---|---|---|
Also das ursprüngliche problem ist gelöst..
Jetzt tut sich ein neues auf.. Hab mir nun doch ein Paar Sachen angeschaut, und mehr und mehr begriffen.. teshalber hab ich nun folgendes erstellt.. es funktioniert soweit.. aber die Welt ist irgendwie.. um 90° gedreht.. und man hat sehr sehr geringe FPS. Vielleicht kann mir dabei jemand helfen.. http://www.dudecraft.de/ablage/mct.rar <- code/exe/"textur" main Code: [AUSKLAPPEN] Import sidesign.minib3d
Graphics3D 1920,1080,32,2,1 SeedRnd MilliSecs() Include "mapgenerator.bmx" Include "functions.bmx" Type T_MouseLook Field resetX% Field resetY% Field speedX% 'use these if using turnentity Field speedY% Field pitch:Float 'use these if using rotateentity Field yaw:Float Method Init(rX% , rY%) resetX = rx resetY = ry End Method Method Pollmouse() speedX = resetX - MouseX() speedY = resetY - MouseY() yaw :- Float(-speedX) / 10 pitch :+ Float(-speedY) / 10 MoveMouse(resetX,resetY) End Method Method flush() speedX = 0 speedY = 0 MoveMouse(resetX,resetY) End Method End Type Global mlook:T_MouseLook=New t_mouselook '+++++ Globals +++++' Global MapSizeX:Int ' Mapsize in Chunks (16x16x200) Global MapSizeZ:Int ' Mapsize " Global World, Surface Global CubeList:TList = CreateList() Global ChunkList:TList = CreateList() Global V[25] Global CubeM[17,17,26] World=CreateMesh(Parent) Surface=CreateSurface(World) '+++++ Types +++++' Type Chunk Field X Field Z Field Cubes[20,20,35] EndType Type Cube Field x#[24],y#[24],z#[24],tu[24],tv[24],V[24] Field absoluteX,absoluteY,absoluteZ EndType generatemap(3,3) init_cubes mlook.init(512,350) ' or width & height*.5 etc mlook.flush() 'kills any initial movements MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2 FlushMouse() Rebuild() Local Texture:TTexture=LoadTexture("tex.bmp") TextureBlend Texture,2 EntityTexture World,Texture,0,0 Global Camera=CreateCamera() PositionEntity Camera,0,0,-40 Local Light=CreateLight() RotateEntity Light,60,30,10 Local Timer=CreateTimer(60) While Not KeyHit(KEY_ESCAPE) If KeyDown(KEY_W) MoveEntity world,0,-10,0 If KeyDown(KEY_S) MoveEntity world,0,+10,0 If KeyDown(KEY_A) MoveEntity world,0,0,10 If KeyDown(KEY_D) MoveEntity world,0,0,-10 mousemove RenderWorld() Flip Wend End worldgenerator Code: [AUSKLAPPEN] Function GenerateMap(sizeX,sizeZ)
Local mx:Int,mz:Int,nx:Int,nz:Int,ny:Int,rndcount:Int MapSizeX = sizeX MapSizeZ = SizeZ For mx = 1 To sizeX For mz = 1 To sizeZ NewChunk:Chunk = New Chunk NewChunk.x = mx NewChunk.z = mz For nx = 1 To 16 For nz = 1 To 16 For ny = 1 To 10 ' Bodenschicht NewChunk.Cubes[nx,nz,ny] = 1 Print NewChunk.Cubes[nx,nz,ny] Next For ny = 11 To 15 ' mittelschicht If NewChunk.Cubes[nx,nz,ny-1] = 1 rndcount = Rnd(1,10) If rndcount > 5 NewChunk.Cubes[nx,nz,ny] = 1 Else newchunk.Cubes[nx,nz,ny] = 0 EndIf Else newchunk.Cubes[nx,nz,ny] = 0 EndIf Print NewChunk.Cubes[nx,nz,ny] Next For ny = 16 To 25 ' Luftschicht If NewChunk.Cubes[nx,nz,ny-1] = 1 rndcount = Rnd(1,10) If rndcount > 7 NewChunk.Cubes[nx,nz,ny] = 1 Else newchunk.Cubes[nx,nz,ny] = 0 EndIf Else newchunk.Cubes[nx,nz,ny] = 0 EndIf Print NewChunk.Cubes[nx,nz,ny] Next Next Next ListAddLast(chunklist,newchunk) Next Next EndFunction Function MCreateCube(X#=0,Y#=0,Z#=0,ax,ay,az) ';============================================ NewCube:Cube=New Cube ';============================================TOP V[00]=AddVertex(Surface,X#-1,Y#+1,Z#+1,0,1) V[01]=AddVertex(Surface,X#+1,Y#+1,Z#+1,1,1) V[02]=AddVertex(Surface,X#+1,Y#+1,Z#-1,1,0) V[03]=AddVertex(Surface,X#-1,Y#+1,Z#-1,0,0) ';============================================BOTTOM V[04]=AddVertex(Surface,X#-1,Y#-1,Z#-1,0,1) V[05]=AddVertex(Surface,X#+1,Y#-1,Z#-1,1,1) V[06]=AddVertex(Surface,X#+1,Y#-1,Z#+1,1,0) V[07]=AddVertex(Surface,X#-1,Y#-1,Z#+1,0,0) ';============================================FRONT V[08]=AddVertex(Surface,X#-1,Y#+1,Z#-1,0,0) V[09]=AddVertex(Surface,X#+1,Y#+1,Z#-1,1,0) V[10]=AddVertex(Surface,X#+1,Y#-1,Z#-1,1,1) V[11]=AddVertex(Surface,X#-1,Y#-1,Z#-1,0,1) ';============================================BACK V[12]=AddVertex(Surface,X#+1,Y#+1,Z#+1,0,0) V[13]=AddVertex(Surface,X#-1,Y#+1,Z#+1,1,0) V[14]=AddVertex(Surface,X#-1,Y#-1,Z#+1,1,1) V[15]=AddVertex(Surface,X#+1,Y#-1,Z#+1,0,1) ';============================================Left V[16]=AddVertex(Surface,X#-1,Y#+1,Z#+1,0,0) V[17]=AddVertex(Surface,X#-1,Y#+1,Z#-1,1,0) V[18]=AddVertex(Surface,X#-1,Y#-1,Z#-1,1,1) V[19]=AddVertex(Surface,X#-1,Y#-1,Z#+1,0,1) ';============================================Right V[20]=AddVertex(Surface,X#+1,Y#+1,Z#-1,0,0) V[21]=AddVertex(Surface,X#+1,Y#+1,Z#+1,1,0) V[22]=AddVertex(Surface,X#+1,Y#-1,Z#+1,1,1) V[23]=AddVertex(Surface,X#+1,Y#-1,Z#-1,0,1) ';============================================ VertexNormal (Surface,V[00],0,+1,0) VertexNormal (Surface,V[01],0,+1,0) VertexNormal (Surface,V[02],0,+1,0) VertexNormal (Surface,V[03],0,+1,0) VertexNormal (Surface,V[04],0,-1,0) VertexNormal (Surface,V[05],0,-1,0) VertexNormal (Surface,V[06],0,-1,0) VertexNormal (Surface,V[07],0,-1,0) VertexNormal (Surface,V[08],0,0,-1) VertexNormal (Surface,V[09],0,0,-1) VertexNormal (Surface,V[10],0,0,-1) VertexNormal (Surface,V[11],0,0,-1) VertexNormal (Surface,V[12],0,0,+1) VertexNormal (Surface,V[13],0,0,+1) VertexNormal (Surface,V[14],0,0,+1) VertexNormal (Surface,V[15],0,0,+1) VertexNormal (Surface,V[16],-1,0,0) VertexNormal (Surface,V[17],-1,0,0) VertexNormal (Surface,V[18],-1,0,0) VertexNormal (Surface,V[19],-1,0,0) VertexNormal (Surface,V[20],+1,0,0) VertexNormal (Surface,V[21],+1,0,0) VertexNormal (Surface,V[22],+1,0,0) VertexNormal (Surface,V[23],+1,0,0) ';============================================ AddTriangle(Surface,V[00],V[01],V[03])'TOP AddTriangle(Surface,V[01],V[02],V[03])'TOP AddTriangle(Surface,V[04],V[05],V[07])'BOTTOM AddTriangle(Surface,V[05],V[06],V[07])'BOTTOM AddTriangle(Surface,V[08],V[09],V[11])'FRONT AddTriangle(Surface,V[09],V[10],V[11])'FRONT AddTriangle(Surface,V[12],V[13],V[15])'BACK AddTriangle(Surface,V[13],V[14],V[15])'BACK AddTriangle(Surface,V[16],V[17],V[19])'Left AddTriangle(Surface,V[17],V[18],V[19])'Left AddTriangle(Surface,V[20],V[21],V[23])''Right AddTriangle(Surface,V[21],V[22],V[23])'Right ';============================================ For i=0 To 23 NewCube.x[i]=VertexX(Surface,V[i]) NewCube.y[i]=VertexY(Surface,V[i]) NewCube.z[i]=VertexZ(Surface,V[i]) NewCube.tu[i]=VertexU(Surface,V[i]) NewCube.tv[i]=VertexV(Surface,V[i]) NewCube.V[i]=V[i] Next newcube.absolutex = ax newcube.absolutey = ay newcube.absolutez = az ';============================================ ListAddLast (CubeList, NewCube) End Function Function init_Cubes() For newchunk:chunk = EachIn chunklist For x = 1 To 16 For y = 1 To 16 For z = 1 To 25 CubeM[x,y,z] = MCreateCube(x*2-16,y*2-25,z*2-16,x,y,z) Next Next Next Next EndFunction functions Code: [AUSKLAPPEN] Function Rebuild()
ClearSurface(Surface) For chunkx:chunk=EachIn ChunkLIst ' ;=========================== For M_Cube:Cube=EachIn CubeList If chunkx.cubes[m_cube.absolutex,m_cube.absolutey,m_cube.absolutez]=1 If chunkx.cubes[m_cube.absolutex,m_cube.absolutey+1,m_cube.absolutez]=0 ';============================================ For i=0 To 3 V[i]=AddVertex(Surface,M_Cube.x[i],M_Cube.y[i],M_Cube.z[i],M_Cube.tu[i],M_Cube.tv[i]) Next VertexNormal (Surface,V[00],0,+1,0) VertexNormal (Surface,V[01],0,+1,0) VertexNormal (Surface,V[02],0,+1,0) VertexNormal (Surface,V[03],0,+1,0) AddTriangle(Surface,V[00],V[01],V[03]) AddTriangle(Surface,V[01],V[02],V[03]) EndIf If chunkx.cubes[m_cube.absolutex,m_cube.absolutey-1,m_cube.absolutez]=0 ';============================================ For i=4 To 7 V[i]=AddVertex(Surface,M_Cube.x[i],M_Cube.y[i],M_Cube.z[i],M_Cube.tu[i],M_Cube.tv[i]) Next VertexNormal (Surface,V[04],0,-1,0) VertexNormal (Surface,V[05],0,-1,0) VertexNormal (Surface,V[06],0,-1,0) VertexNormal (Surface,V[07],0,-1,0) AddTriangle(Surface,V[04],V[05],V[07]) AddTriangle(Surface,V[05],V[06],V[07]) EndIf If chunkx.cubes[m_cube.absolutex,m_cube.absolutey,m_cube.absolutez-1]=0 ';============================================ For i=8 To 11 V[i]=AddVertex(Surface,M_Cube.x[i],M_Cube.y[i],M_Cube.z[i],M_Cube.tu[i],M_Cube.tv[i]) Next VertexNormal (Surface,V[08],0,0,-1) VertexNormal (Surface,V[09],0,0,-1) VertexNormal (Surface,V[10],0,0,-1) VertexNormal (Surface,V[11],0,0,-1) AddTriangle(Surface,V[08],V[09],V[11]) AddTriangle(Surface,V[09],V[10],V[11]) EndIf If chunkx.cubes[m_cube.absolutex,m_cube.absolutey,m_cube.absolutez+1]=0 ';============================================ For i=12 To 15 V[i]=AddVertex(Surface,M_Cube.x[i],M_Cube.y[i],M_Cube.z[i],M_Cube.tu[i],M_Cube.tv[i]) Next VertexNormal (Surface,V[12],0,0,+1) VertexNormal (Surface,V[13],0,0,+1) VertexNormal (Surface,V[14],0,0,+1) VertexNormal (Surface,V[15],0,0,+1) AddTriangle(Surface,V[12],V[13],V[15]) AddTriangle(Surface,V[13],V[14],V[15]) EndIf If chunkx.cubes[m_cube.absolutex-1,m_cube.absolutey,m_cube.absolutez]=0 ';============================================ For i=16 To 19 V[i]=AddVertex(Surface,M_Cube.x[i],M_Cube.y[i],M_Cube.z[i],M_Cube.tu[i],M_Cube.tv[i]) Next VertexNormal (Surface,V[16],-1,0,0) VertexNormal (Surface,V[17],-1,0,0) VertexNormal (Surface,V[18],-1,0,0) VertexNormal (Surface,V[19],-1,0,0) AddTriangle(Surface,V[16],V[17],V[19]) AddTriangle(Surface,V[17],V[18],V[19]) EndIf If chunkx.cubes[m_cube.absolutex+1,m_cube.absolutey,m_cube.absolutez]=0 ';============================================ For i=20 To 23 V[i]=AddVertex(Surface,M_Cube.x[i],M_Cube.y[i],M_Cube.z[i],M_Cube.tu[i],M_Cube.tv[i]) Next VertexNormal (Surface,V[20],+1,0,0) VertexNormal (Surface,V[21],+1,0,0) VertexNormal (Surface,V[22],+1,0,0) VertexNormal (Surface,V[23],+1,0,0) AddTriangle(Surface,V[20],V[21],V[23]) AddTriangle(Surface,V[21],V[22],V[23]) EndIf EndIf ';============================================ ' ;============================================ ';============================================ Next Next ';=========================== ' End Function Function mousemove() mlook.pollmouse() If mlook.pitch > 85 Then mlook.pitch = 85 If mlook.pitch < -85 Then mlook.pitch = -85 RotateEntity camera, mlook.pitch, 0, 0 RotateEntity camera,0,mlook.yaw,0 End Function |
||
CO2ehemals "SirMO" |
Mo, Sep 09, 2013 16:41 Antworten mit Zitat |
|
---|---|---|
Was mir direkt auffällt, bevor ich weiter im Code lese: Du erstellst oberhalb der Hauptschleife (While Not Keyhit(KEY_ESCAPE)) einen Timer. Das ist schön, er wird nur nie genutzt. baue folgende Zeile in die Hauptschleife ein (egal wo, ich würde Sie aber ganz oben einbauen):
BlitzMax: [AUSKLAPPEN] WaitTimer(Timer)
Nun "zwingst" du den Prozessor dazu nicht mehr als 60 mal die Schleife pro Sekunde durchzulaufen. Das zweite: Du "säuberst" immernoch nicht den Screen via Cls. Das Problem, was ich oben auch schon beschrieben hatte ist, das dann alles, was auf den Screen gemalt wird auch auf dem Screen bleibt, d.h.: Irgendwann hast du ein buntes etwas auf dem Bildschirm. Ich denke auch, dass das die Schnelligkeit beeinflusst (ohne das ich mir jetzt den Code angesehen habe, weiteres folgt ). So, habe jetzt mal vorsichtig einen Blick drauf geworfen, sieht aber soweit ganz gut aus. Das einzige was ich geändert habe, war, dass ich in der Hauptschleife nicht die World verschoben habe, wenn eine Taste gedrückt wurde, sondern die Kamera. Des weiteren habe ich um die Kameraposition zu richten, in der Funktion mousemove() jeweils Roll auf -90 gestellt, was zwar schon besser aussieht, aber immernoch nicht das gelbe vom Ei ist. Ich überlasse es dir, da den richtigen Wert zu finden. Darüber hinaus habe ich die Befehle Waittimer() und Cls() in die Hauptschleife eingebaut und aus dem Flip ein Flip 0 gemacht. Folglich sieht die Hauptschleife nun wie folgt aus BlitzMax: [AUSKLAPPEN] While Not KeyHit(KEY_ESCAPE) So läuft es einigermaßen flüssig. |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
- Zuletzt bearbeitet von CO2 am Mo, Sep 09, 2013 16:57, insgesamt einmal bearbeitet
Infected |
Mo, Sep 09, 2013 16:45 Antworten mit Zitat |
|
---|---|---|
Danke dir für die Antwort !
Waren wohl zwei Flüchtigkeitsfehler Leider hats nicht geholfen.. =/ |
||
Infected |
Mo, Sep 09, 2013 17:31 Antworten mit Zitat |
|
---|---|---|
CO2 hat Folgendes geschrieben: Was mir direkt auffällt, bevor ich weiter im Code lese: Du erstellst oberhalb der Hauptschleife (While Not Keyhit(KEY_ESCAPE)) einen Timer. Das ist schön, er wird nur nie genutzt. baue folgende Zeile in die Hauptschleife ein (egal wo, ich würde Sie aber ganz oben einbauen):
BlitzMax: [AUSKLAPPEN] WaitTimer(Timer)
Nun "zwingst" du den Prozessor dazu nicht mehr als 60 mal die Schleife pro Sekunde durchzulaufen. Das zweite: Du "säuberst" immernoch nicht den Screen via Cls. Das Problem, was ich oben auch schon beschrieben hatte ist, das dann alles, was auf den Screen gemalt wird auch auf dem Screen bleibt, d.h.: Irgendwann hast du ein buntes etwas auf dem Bildschirm. Ich denke auch, dass das die Schnelligkeit beeinflusst (ohne das ich mir jetzt den Code angesehen habe, weiteres folgt ). So, habe jetzt mal vorsichtig einen Blick drauf geworfen, sieht aber soweit ganz gut aus. Das einzige was ich geändert habe, war, dass ich in der Hauptschleife nicht die World verschoben habe, wenn eine Taste gedrückt wurde, sondern die Kamera. Des weiteren habe ich um die Kameraposition zu richten, in der Funktion mousemove() jeweils Roll auf -90 gestellt, was zwar schon besser aussieht, aber immernoch nicht das gelbe vom Ei ist. Ich überlasse es dir, da den richtigen Wert zu finden. Darüber hinaus habe ich die Befehle Waittimer() und Cls() in die Hauptschleife eingebaut und aus dem Flip ein Flip 0 gemacht. Folglich sieht die Hauptschleife nun wie folgt aus BlitzMax: [AUSKLAPPEN] While Not KeyHit(KEY_ESCAPE) So läuft es einigermaßen flüssig. Der Hammer! Werd dann nochmal testen woran es genau lag! Danke 1000x |
||
CO2ehemals "SirMO" |
Mo, Sep 09, 2013 17:35 Antworten mit Zitat |
|
---|---|---|
Ich habe Flip im Verdacht, irgendwas schwirrt mir dabei vor, kann dir aber nicht sagen, ob es das war | ||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
Infected |
Mo, Sep 09, 2013 17:46 Antworten mit Zitat |
|
---|---|---|
Hehe, ich guck dann, wie gesagt, mal
Was sagst du sonst zu dem code? Meinst du man könnte irgendwo noch speicher/leistung sparen? Macht irgendwas keinen sinn? Mir gehts dabei wie gesagt darum zu lernen, wie man am besten mit größeren mengen dieser daten umgeht, und alles dennoch gut läuft etc. mir gehts nicht darum ein tolles spaßíges spiel zu programmieren |
||
XeresModerator |
Mo, Sep 09, 2013 19:17 Antworten mit Zitat |
|
---|---|---|
Ich bitte auch darauf zu achten, keine Doppelposts zu machen (besser editieren) und das Zitieren ganzer Beiträge - zumal der Zusammenhang klar sein sollte - zu lassen.
Wenn sich miniB3d genauso verhält wie B3D, dann kannst du das Cls sparen, da das Rendern den kompletten Kamerabereich überschreibt (es sei denn, man benutzt CameraClsMode). Funktionen, Listen usw. kannst du auch im passenden Type kapseln - wenn du den globalen Namensraum etwas leeren wolltest. Gutes gelingen ansonsten. |
||
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) |
CO2ehemals "SirMO" |
Di, Sep 10, 2013 17:40 Antworten mit Zitat |
|
---|---|---|
Wie gesagt: Ich bin nicht mehr so der 3D-Programmierer Trotzdem: Mir ist aufgefallen, das du immer sofort das gesamte Chunk malst, also auch Würfel die gar nicht sichtbar sind. Man könnte das optimieren, indem man nur die Würfel eines Chunks malt, die auch wirklich sichtbar sind. Dies ist aber eher etwas für Programmierer, die schon tiefer in der Materie sind. Ist halt nur ein Vorschlag.
Des weiteren verstehe ich nicht, warum du Global eine Cube-List erstellst, wo du doch schon ein 3-Dimensionales Array in der Typedefinition von Chunk hast. Den Variablennamen zufolge sollten da ja alle Cubes des Chunks enthalten sein (Ich habe mich nicht mit dem Code tiefer beschäftigt, ist mir beim durchlesen nur ins Auge gefallen). Wozu also eine Globale Cubelist, wenn du eine Chunklist hast, in der wahrscheinlich alle Chunks sind, die wiederum je ein Array enthalten mit allen Cubes im Chunk? Auch würde ich zum einen die Typdefinition des Cubes um eine Methode Draw() erweitern, die den Cube an seine eigenen Positionen malt (Quasi die "externe" Mal-Funktion leeren und in die einzelnen Typen auslagern). Zum anderen würde ich danach die Typdefinition des Chunks um die selbe Methode erweitern. Als Pseudo-Code ausgedrückt BlitzMax: [AUSKLAPPEN] Type TCube So hättest du dir Funktionen gespart, die außerhalb der Typendefinition liegen (Ist leichter zu warten und zu erweitern). Um einen Cube zu malen empfiehlt es sich, eine Funktion DrawCube(PositionX:Int, PositionY:Int, PositionZ:Int) (falls es die nicht schon gibt) zu erstellen, die einen Cube an der Position [PositionX, PositionY, PositionZ] malt, welche du dann in der Draw()-Methode des Cube-Types aufrufst (mit den o.g. Parametern). Um nun eine Welt bestehend aus mehreren Chunks zu erstellen, würde ich eine Globale Liste erstellen (es bietet sich der Name "ChunkList" an ) und diese mit Instanzen des Typs TChunk füllen (mit den entsprechenden Positionen in der Gesamtwelt) (dafür musst du natürlich pro Chunk in meinem Beispiel 25 x 25 x 50 Cubes (mit den entsprechenden Positionen im Chunk) erstellen, was ich über einen Konstruktor im TChunk-Typ am besten lösen lässt (Dort würde ich eine Liste mit 25 x 25 x 50 Einträgen übergeben). Nachdem alle Chunks initialisiert wurden, kannst du über eine externe Funktion alle Instanzen in der ChunkList malen, Beispiel BlitzMax: [AUSKLAPPEN] Function DrawWorld(ChunkList:TList) Sollte dir irgendetwas unklar sein, frag ruhig |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
Infected |
Di, Sep 10, 2013 19:37 Antworten mit Zitat |
|
---|---|---|
Hey! Danke für die ausführliche antwort!
Werde erstmal nur auf eine Frage eingehen, der rest folgt später wenn ich mich genauer damit beschäftigt habe Zitat: Man könnte das optimieren, indem man nur die Würfel eines Chunks malt, die auch wirklich sichtbar sind.
Die funktion Rebuild() ist der eigentliche Kern. Der sorgt dafür, dass im endeffekt was auf dem Bildschirm zu sehen ist. Dort werden(wenn ich nichts falsch gemacht habe) nur die Seiten der Würfel gemalt, die im endeffekt auch sichtbar sind. Wenn du das programm startest, und in die "welt" hinein gehst, siehst du das sehr gut Edit: Soo.. hab leider noch nicht viel mehr zu sagen, aber dafür morgen Wäre wirklich wirklich dankbar, wenn mir jemand einen anhaltspunkt gibt.. wie ich das texturieren gestalte. Also .. es gibt ja verschiedene blockarten etc Wie bestimme ich, welche textur wo auf dem surface gezeichnet wird? |
||
AnniXa |
So, Okt 13, 2013 10:30 Antworten mit Zitat |
|
---|---|---|
ich hab das bei meinen cubemaps immer so gelöst das ich eine atlas textur hatte für die flächen, und in den block eigenschaften habe ich immer faktoren gehabt wie sehr die UV map verschoben wird.
dieser faktor wurde beim erstellen der surface einfach auf alle UV coorss für en jeweiligen block angerechnet. so konnte ich in blender gemütlich meine blöcke etc zusammenschrauben, uv mappen (halt immer nur in der linken oberen ecke) und muste dann in der datei welche die block eigenschaften beschreibt nur noch angeben wie sehr die UV für diese art von block verschoben werden sollte. |
||
|moonForge|
Ich bin Pokémon Meisterin seit 1998! |
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group