Singlesurface "Minecraft"-problem

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Infected

Betreff: Singlesurface "Minecraft"-problem

BeitragDo, Sep 05, 2013 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

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

Xeres

Moderator

BeitragDo, Sep 05, 2013 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

CO2

ehemals "SirMO"

BeitragDo, Sep 05, 2013 23:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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

BeitragMo, Sep 09, 2013 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

CO2

ehemals "SirMO"

BeitragMo, Sep 09, 2013 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy).


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)
WaitTimer(Timer)
Cls

If KeyDown(KEY_W) MoveEntity Camera,0,-10,0
If KeyDown(KEY_S) MoveEntity Camera,0,+10,0
If KeyDown(KEY_A) MoveEntity Camera,0,0,10
If KeyDown(KEY_D) MoveEntity Camera,0,0,-10

mousemove()

UpdateWorld()
RenderWorld()

Flip 0
Wend


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

BeitragMo, Sep 09, 2013 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir für die Antwort ! Smile
Waren wohl zwei Flüchtigkeitsfehler Very Happy

Leider hats nicht geholfen.. =/
 

Infected

BeitragMo, Sep 09, 2013 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy).


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)
WaitTimer(Timer)
Cls

If KeyDown(KEY_W) MoveEntity Camera,0,-10,0
If KeyDown(KEY_S) MoveEntity Camera,0,+10,0
If KeyDown(KEY_A) MoveEntity Camera,0,0,10
If KeyDown(KEY_D) MoveEntity Camera,0,0,-10

mousemove()

UpdateWorld()
RenderWorld()

Flip 0
Wend


So läuft es einigermaßen flüssig.

Der Hammer! Very Happy
Werd dann nochmal testen woran es genau lag! Smile
Danke 1000x Smile
 

CO2

ehemals "SirMO"

BeitragMo, Sep 09, 2013 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe Flip im Verdacht, irgendwas schwirrt mir dabei vor, kann dir aber nicht sagen, ob es das war Very Happy
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

BeitragMo, Sep 09, 2013 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hehe, ich guck dann, wie gesagt, mal Smile
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 Very Happy

Xeres

Moderator

BeitragMo, Sep 09, 2013 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

CO2

ehemals "SirMO"

BeitragDi, Sep 10, 2013 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gesagt: Ich bin nicht mehr so der 3D-Programmierer Smile 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
' Dies sind nur Beispiel-Variablen, die müsstest du noch durch deine eigenen Erweitern (Surface, etc.)
Field PositionX:Int
Field PositionY:Int
Field PositionZ:Int

' Konstruktor (Nur der einfachheit halber, Cubes können dann so erstellt werden: Global Cube:TCube = TCube.Create(PosX, PosY, PosZ)):
Function Create:TCube(PositionX:Int, PositionY:Int, PositionZ:Int)
Local ReturnMe:TCube = New TCube
ReturnMe.PositionX = PositionX ' Die erstellte Instanz erhält den PosX - Wert aus den Parametern des Konstruktors
ReturnMe.PositionY = PositionY ' Siehe oben
ReturnMe.PositionZ = PositionZ ' Siehe oben
Return ReturnMe ' Die erstellte Instanz mit "gefüllten" Werten zurückgeben
End Function

Method Draw(ModifierX:Int = 0, ModifierY:Int = 0, ModifierZ:Int = 0)
' Die Modifier-Parameter sind für den Aufruf in der Chunk-Draw-Methode (s.u.)
' Male den Cube an Position Self.PositionX + ModifierX, Self.PositionY + ModifierY, Self.PositionZ + ModifierZ
End Method
End Type

Type TChunk
Field PositionX:Int ' Chunk-PositionX in der gesamten Welt (Erleichtert das Rechnen)
Field PositionY:Int ' Chunk-PositionY in der gesamten Welt (Erleichtert das Rechnen)
Field PositionZ:Int ' Chunk-PositionZ in der gesamten Welt (Erleichtert das Rechnen)
Field Cubes:TCube[25, 25, 50] ' In dieses Array kommen alle Cubes des Chunks

Method Draw()
' Nun Male den Chunk (Alle Cubes im Array) ab der "Chunkposition", in etwa so:
For Local x:Int = 0 To 24 ' 1. Dimension (To-Wert an Länge der Dimension anpassen!)
For Local y:Int = 0 To 24 ' 2. Dimension (To-Wert an Länge der Dimension anpassen!)
For Local z:Int = 0 To 49 ' 3. Dimension (To-Wert an Länge der Dimension anpassen!)
If(Self.Cubes[x, y, z] <> Null) ' Existiert der Cube überhaupt?
Self.Cubes[x, y, z].Draw(Self.PositionX, Self.PositionY, Self.PositionZ) ' Rufe für jeden Existierenden Cube seine Methode Draw() auf (mit den Modifier-Parametern)
Next
Next
Next
Next
End Method
End Type


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 Smile) 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)
If(ChunkList <> Null) ' Wenn Die Chunklist existiert
' Um das malen Performanter zu gestalten, würde ich maximal 9 Chunks malen (Das Chunk, auf dem der Spieler steht + die 8 umliegenden) Dafür müsstest du auch noch Positionsabfragen usw. einbauen, aber auch das überlasse ich dir Wink
For Local x:TChunk = EachIn ChunkList ' Gehe alle in der Liste befindlichen Instanzen durch...
x.Draw() ' Und Führe dessen Draw()-Methode aus.
Next
EndIf
End Funktion


Sollte dir irgendetwas unklar sein, frag ruhig Wink
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

BeitragDi, Sep 10, 2013 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
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 Smile


Edit:

Soo.. hab leider noch nicht viel mehr zu sagen, aber dafür morgen Wink
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

BeitragSo, Okt 13, 2013 10:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group