Minecraft Funktionen - SAMMELTHREAD :)

Previous topic - Next topic

Schranz0r





Hier könnt ihr alle Funktionen posten, die für einen Minecraft Clon von Bedeutung sein könnten!
Ob es nun für das Rendering oder eine einfache Routine ist.
Etvl. ergibt sich ja was gutes und ein oder zwei Projekte entstehen dadurch...

Ein richtiges 3D-Game würde GLBasic mal gut tun ;)

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

Gut dann fang ich mal an!

- Facepick/Objectpick
- Kleiner visueller Debug

Code (glbasic) Select
// --------------------------------- //
// Project: Linepick
// Start: Sunday, April 15, 2012
// IDE Version: 10.283


// SETCURRENTDIR("Media") // go to media files
SYSTEMPOINTER TRUE

CreateSurface()

LOCAL mx,my,b1,b2



WHILE TRUE
MOUSESTATE mx,my,b1,b2
X_MAKE3D 1,1000,45
X_CAMERA 0,10,50, 0,0,0

X_DRAWOBJ 1,0

IF PickObject(mx,my, 1,0)
DebugCollisionFace(1)
ENDIF

SHOWSCREEN
WEND
END



FUNCTION CreateSurface:
X_OBJSTART 1
X_OBJADDVERTEX 10,10,0, 0,0, RGB(0xff, 0xff, 0xff)
X_OBJADDVERTEX 10,-10,0, 0,0, RGB(0xff, 0xff, 0xff)
X_OBJADDVERTEX -10,10,0, 0,0, RGB(0xff, 0xff, 0xff)
X_OBJADDVERTEX -10,-10,0, 0,0, RGB(0xff, 0xff, 0xff)
X_OBJEND
ENDFUNCTION

FUNCTION PickObject:mousex, mousey, obj_id, frame=0 
LOCAL wx,wy,wz,wx2,wy2,wz2

X_SCREEN2WORLD mousex,mousey,0, wx,wy,wz
X_SCREEN2WORLD mousex,mousey,1, wx2,wy2,wz2

IF X_COLLISIONRAY(obj_id, frame, wx, wy, wz, (wx2-wx), (wy2-wy), (wz2-wz)) <> 0
RETURN TRUE
ENDIF

RETURN FALSE
ENDFUNCTION

FUNCTION DebugCollisionFace: obj_id

LOCAL face_id = X_GETCOLLISIONFACE()
LOCAL triangle[]
X_GETFACE obj_id, 0, face_id,triangle[]

FOR i = 0 TO 2
IF i = 2

X_LINE triangle[i][0], triangle[i][1], triangle[i][2],triangle[0][0], triangle[0][1], triangle[0][2],2, RGB(0xff, 0x00, 0x00)

ELSE

X_LINE triangle[i][0], triangle[i][1], triangle[i][2],triangle[i+1][0], triangle[i+1][1], triangle[i+1][2],2, RGB(0xff, 0x00, 0x00)

ENDIF

X_DOT triangle[i][0], triangle[i][1], triangle[i][2], 10,RGB(0x00, 0x00, 0xff)

NEXT 

ENDFUNCTION


[attachment deleted by admin]
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

#2
Movement in 3D ist nicht so einfach zu realisieren vorallen nicht in GLB :)
Hier ein Basicmovement für Platformspiele in 3D.

Sollte man das noch in Funktionen packen, was denkt ihr?

Code (glbasic) Select

InitMovement()

LOCAL ScreenX%=800, ScreenY%=600
SETSCREEN ScreenX,ScreenY,0

WHILE TRUE
SETMOUSE ScreenX/2, ScreenY/2
X_MAKE3D 1,1000,45
SetCamera()
DoMovement()

FOR i = 0 TO 10

X_DRAWAXES 0,0,i*100

NEXT

SHOWSCREEN
WEND
END


FUNCTION InitMovement:
GLOBAL phi_xy#=0, phi_xz#=90.0, Cam_x#=0, Cam_y#=0, Cam_z#=100, Cam_Speed#=1.8
ENDFUNCTION

FUNCTION SetCamera:
// Cam on x,y,z
X_CAMERA Cam_x,Cam_y,Cam_z, Cam_x+COS(phi_xz),Cam_y+SIN(-phi_xy),Cam_z+SIN(phi_xz)
ENDFUNCTION

FUNCTION DoMovement:
// pick the mouseaxis
LOCAL MA0 = MOUSEAXIS(0)
LOCAL MA1 = MOUSEAXIS(1)

//rotate smoothe
IF MA0 <> 0
INC phi_xz,MA0/10
ENDIF
IF MA1 <> 0
INC phi_xy,MA1/10
ENDIF

// only 360°
IF phi_xz > 359 THEN phi_xz = 0
IF phi_xz < 0 THEN phi_xz = 359

// Limit the up/down
IF phi_xy < -89.9 THEN phi_xy = -89.9
IF phi_xy > 89.9  THEN phi_xy = 89.9

IF KEY(42) // if shift pressed then run :)
Cam_Speed = 1.8
ELSE
Cam_Speed = 1 // set back to normal
ENDIF

IF KEY(17) // forward
INC Cam_z,SIN(phi_xz)*Cam_Speed
INC Cam_x,COS(phi_xz)*Cam_Speed
ENDIF
IF KEY(31) // back
DEC Cam_z,SIN(phi_xz)*Cam_Speed
DEC Cam_x,COS(phi_xz)*Cam_Speed
ENDIF
IF KEY(30) // left
INC Cam_z,SIN(phi_xz-90)*(Cam_Speed/2)
INC Cam_x,COS(phi_xz-90)*(Cam_Speed/2)
ENDIF
IF KEY(32) // right
INC Cam_z,SIN(phi_xz+90)*(Cam_Speed/2)
INC Cam_x,COS(phi_xz+90)*(Cam_Speed/2)
ENDIF
ENDFUNCTION




[attachment deleted by admin]
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

backslider

Mach doch mal nen T3dCamera - Type draus. :) Das wäre super!

Schranz0r

#4
damit man mehrere Cams benutzen kann?

EDIt:

Ich installier mir schnell Skype  :D
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

backslider

Eigentlich meinte ich, damit man sauber alle Funktionen und Variablen in einem Type hat.
Dann brauchste nur noch sagen "Kamera, bewege dich und drehe dich" und bums, passiert es. :D

Und man braucht keine "Angst" haben, dass man Variablen im eigenen Code verwendet, den die Cam benutzt.

kanonet

Falls ihr nicht alles neu schreiben wollt, ich habe da noch etwas alten Code rumliegen, habe ich mal zum einfachen bewegen von 3D Objekten geschrieben (Mathe ist im wesentlichen aus dem 3DES kopiert). Siehe ESlight_old.zip

Später habe ich das ganze dann zu einem richtigen, kleinen EntitySystem erweitert. Siehe ESlite.zip

Das erste ist einfach und kurz und sollte genau das enthalten, was ihr braucht - jedoch ist es ein sehr alter Stand, der längst gefixte Fehler enthält und bei dem ich nicht genau weiß, auf welchem Stand er überhaupt ist... Das zweite ist dagegen deutlich ausgereifter, aber als kleines EntitySystem eben auch deutlich umfangreicher, als ihr es vielleicht braucht. Außerdem ist auch das noch ganz stark WIP.
Aber vielleicht nützt es euch ja etwas und ihr könnt einfacher euer eigenes erstellen?

[attachment deleted by admin]
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Schranz0r

Hmm danke, aber ich machs lieber step by step
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

Chunks mit kleinen problem, übler Flaschenhals in der Objekterstellungsroutine...

mainfile
Code (glbasic) Select

// --------------------------------- //
// Project: Faces and Cubes
// Start: Saturday, September 01, 2012
//
// by Schranz0r
//
// www.glbasic.com
//
// IDE Version: 10.283



// All corners for a cube

// FRONT:

// 1-------3
//  | |
//  | |
//  | |
//  | |
// 2-------4

// BACK:

// 5-------7
//  | |
//  | |
//  | |
//  | |
// 6-------8

GLOBAL V1 AS TVector
V1.SET(.5,.5,-.5)
GLOBAL V2 AS TVector
V2.SET(.5,-.5,-.5)
GLOBAL V3 AS TVector
V3.SET(-.5,.5,-.5)
GLOBAL V4 AS TVector
V4.SET(-.5,-.5,-.5)

GLOBAL V5 AS TVector
V5.SET(.5,.5,.5)
GLOBAL V6 AS TVector
V6.SET(.5,-.5,.5)
GLOBAL V7 AS TVector
V7.SET(-.5,.5,.5)
GLOBAL V8 AS TVector
V8.SET(-.5,-.5,.5)


// Create the surfaces with the vectors
GLOBAL SURFACE_FRONT AS TSurface
SURFACE_FRONT.SET(V1,V2,V3,V4)
GLOBAL SURFACE_BACK AS TSurface
SURFACE_BACK.SET(V5,V6,V7,V8)
GLOBAL SURFACE_LEFT AS TSurface
SURFACE_LEFT.SET(V5,V6,V1,V2)
GLOBAL SURFACE_RIGHT AS TSurface
SURFACE_RIGHT.SET(V3,V4,V7,V8)
GLOBAL SURFACE_TOP AS TSurface
SURFACE_TOP.SET(V5,V1,V7,V3)
GLOBAL SURFACE_BOTTOM AS TSurface
SURFACE_BOTTOM.SET(V6,V2,V8,V4)


// create a testchunk
GLOBAL TESTCHUNK AS TChunk
TESTCHUNK.Test_Chunk() // set something in the chunk
TESTCHUNK.Set_Surfaces() // place the surfaces to create the empty shell!
TESTCHUNK.CREATE_CHUNK_OBJ() // create the object so we can render it

// var for a simple rotation
LOCAL phi
WHILE TRUE
// simple 3D-Stuff :D
X_MAKE3D 0.0001, 1000, 45
X_CAMERA 0,30,-30, 0,0,0

// increase the rotation
INC phi, .5

// for orientation we draw a axes
X_DRAWAXES 0,0,0

// rotate
X_ROTATION phi, 1,1,1

//draw our testchunk
X_DRAWOBJ TESTCHUNK.chunk_ID, 0

// flip that crap to the screen :D
SHOWSCREEN
WEND
END



surface.gbas
Code (glbasic) Select

// --------------------------------- //
// Project: Faces and Cubes
// Start: Saturday, September 01, 2012
// IDE Version: 10.283


// Vector Type
TYPE TVector
x#;y#;z# // 3D Position
FUNCTION SET: x#, y#, z# // set position
self.x = x
self.y = y
self.z = z
ENDFUNCTION
ENDTYPE


// Surface Type
TYPE TSurface
vec[4] AS TVector // 4 vectors in a surface
FUNCTION SET: v1 AS TVector, v2 AS TVector, v3 AS TVector, v4 AS TVector // set surface
self.vec[0] = v1
self.vec[1] = v2
self.vec[2] = v3
self.vec[3] = v4
ENDFUNCTION
ENDTYPE

// Pewwww.... the Chunk-Crap!
// from now on i hate chunks!
TYPE TChunk
chunksize_x%=20; chunksize_y%=20; chunksize_z%=20 // chunksize x,y,z to keep the dynamic
faces[] AS TSurface // "open" array to store all surfaces we need in this chunk
chunk%[] // the chunkarray, here we have normal integers! Example: 0,1,0,1,1,1,2,3...
chunk_ID% // the modelID of the chunk to create the object and draw it
FUNCTION Test_Chunk: // lets test the CHUNK!
REDIM self.chunk[self.chunksize_x+2][self.chunksize_y+2][self.chunksize_z+2] // Resize the array, and make it 2,2,2 bigger (1 left, 1 right, 1 top, 1 bottom, 1 front, 1 back) thats easier for us to handle

FOR x = 1 TO self.chunksize_x // all 6 sides must be empty! Thats why 1 to chunksize !
FOR y = 1 TO self.chunksize_x
FOR z = 1 TO self.chunksize_x
self.chunk[x][y][z] = RND(1) // fill in some "stones"(what ever...) :D
NEXT
NEXT
NEXT

ENDFUNCTION

FUNCTION Set_Surfaces:

FOR x = 1 TO self.chunksize_x // the 6 sides are empty, so we don't care! (1 to chunksize)
FOR y = 1 TO self.chunksize_y
FOR z = 1 TO self.chunksize_z
IF self.chunk[x][y][z] = 1 // is this block not empty, we have a "stone"-Block
IF self.chunk[x][y+1][z] = 0  //check up
DIMPUSH self.faces[], SURFACE_TOP
self.SET_FACE_OFFSET(LEN(self.faces[])-1,x-self.chunksize_x/2,y-self.chunksize_y/2,z-self.chunksize_z/2) // set the offset of the surface, and center the chunk!
ENDIF
IF self.chunk[x][y-1][z] = 0  //check down
DIMPUSH self.faces[], SURFACE_BOTTOM
self.SET_FACE_OFFSET(LEN(self.faces[])-1,x-self.chunksize_x/2,y-self.chunksize_y/2,z-self.chunksize_z/2) // same shit again
ENDIF
IF self.chunk[x+1][y][z] = 0  //check left
DIMPUSH self.faces[], SURFACE_LEFT
self.SET_FACE_OFFSET(LEN(self.faces[])-1,x-self.chunksize_x/2,y-self.chunksize_y/2,z-self.chunksize_z/2) // and again
ENDIF
IF self.chunk[x-1][y][z] = 0  //check right
DIMPUSH self.faces[], SURFACE_RIGHT
self.SET_FACE_OFFSET(LEN(self.faces[])-1,x-self.chunksize_x/2,y-self.chunksize_y/2,z-self.chunksize_z/2) // and again
ENDIF
IF self.chunk[x][y][z-1] = 0  //check before
DIMPUSH self.faces[], SURFACE_FRONT
self.SET_FACE_OFFSET(LEN(self.faces[])-1,x-self.chunksize_x/2,y-self.chunksize_y/2,z-self.chunksize_z/2) // ahhhh i'm tired
ENDIF
IF self.chunk[x][y][z+1] = 0  //check behind
DIMPUSH self.faces[], SURFACE_BACK
self.SET_FACE_OFFSET(LEN(self.faces[])-1,x-self.chunksize_x/2,y-self.chunksize_y/2,z-self.chunksize_z/2) // HA! now its done! we check all six sides if there a empty("AIR"/nothing) Block
ENDIF // and set a surface in this direction to create the "empty shell"
ENDIF
NEXT
NEXT
NEXT

ENDFUNCTION

FUNCTION SET_FACE_OFFSET: surfacenum, x%, y%, z% // offset the surface and tweak it -0.5 to set it into the "real" center... maybe we remove the centershit... if we dont need it?!
FOR i = 0 TO 3
INC self.faces[surfacenum].vec[i].x, x-.5
INC self.faces[surfacenum].vec[i].y, y-.5
INC self.faces[surfacenum].vec[i].z, z-.5
NEXT
ENDFUNCTION

// here we have a HUGE!!!!! bottleneck!!!!!!!!
FUNCTION CREATE_CHUNK_OBJ: // with this function we create the 3D-Object
self.chunk_ID = GENX_OBJ() // get a free object-ID
X_OBJSTART self.chunk_ID // start the magic
FOREACH t IN self.faces[] // loop all the surfaces
X_OBJNEWGROUP // every surface we need a new group
FOR i = 0 TO 3 // 4 corners per surface
X_OBJADDVERTEX t.vec[i].x, t.vec[i].y, t.vec[i].z, 0,0, RGB(0xc0, 0xc0, 0xc0)+RND(40) //set the Vertex
NEXT

NEXT
X_OBJEND // end of the magic
ENDFUNCTION

ENDTYPE



I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard