Questa è la sub per creare e inizializzare la fisica
Codice:
// Creazione gruppi fisici
crea_fisica:
// Avvia il motore fisico
NDB_NewtonCreate
// Crea un mondo di default
NDB_SetVector 1, -5000.0, -5000.0, -5000.0 // Parte da rivedere
NDB_SetVector 2, 5000.0, 5000.0, 5000.0 // Parte da rivedere
NDB_NewtonSetWorldSize
// Gravità
NDB_SetVector 0.0, -50.0, 0.0
NDB_SetStandardGravity
// Gruppi fisici
NDB_Group_Default = NDB_NewtonMaterialGetDefaultGroupID()
NDB_Group_Player = NDB_NewtonMaterialCreateGroupID()
// NDB_Group_Default > NDB_Group_Player
NDB_NewtonMaterialSetDefaultFriction NDB_Group_Default, NDB_Group_Player, 0.01, 0.01
NDB_NewtonMaterialSetDefaultElasticity NDB_Group_Default, NDB_Group_Player, 0.01
return
I 2 gruppi fisici servono solamente al giocatore principale per eliminare l'attrito, ma non li ho ancora usati.
Questa è la funzione che uso per creare il cubo. Non fare caso a ENT_Crea() e a ENT_getObjID(i), servono per aggiungere 1 entità alla lista delle entità e per prendere l'oggetto assegnato a quell'entità
Codice:
// Creazione di un cubo
function ENT_makeBox(sizex,sizey,sizez,x,y,z,anglex,angley,anglez)
// Crea lo spazio per un'entità
i = ENT_crea()
// Prendiamo l'oggetto dell'entità
obj = ENT_getObjID(i)
// Crea il cubo in darkbasic
make object box obj,sizex,sizey,sizez
position object obj, x,y,z
rotate object obj, anglex,angley,anglez
// Crea il cubo in newton
collIndex = NDB_NewtonCreateBox( sizex,sizey,sizez )
// Creo il rigidbody per la collissione
Body = NDB_NewtonCreateBody( collIndex )
arrEntita(i).bodyID = Body;
// Setto angolazione e posizione
NDB_BuildMatrix object angle x(obj), object angle y(obj), object angle z(obj) , object position x(obj) , object position y(obj)-size, object position z(obj)
NDB_NewtonBodySetMatrix Body
// Setto la massa e il momento di inerzia
mass# = 50
NDB_CalculateMIBoxSolid mass#, size, size, size
NDB_NewtonBodySetMassMatrix Body, mass#
// Rilascio la collisione
NDB_NewtonReleaseCollision collIndex
// ... e collego l'oggetto fisico a quello visuale.
NDB_BodySetDBProData body, obj
NDB_NewtonBodySetDestructorCallback Body
NDB_BodySetGravity Body, 1
endfunction i
Questa è la sub per caricare il mondo:
Codice:
carica_mondo:
cls
CENTER TEXT screen width()/2,screen height()/2, "Caricamento del mondo in corso...."
SYNC
// Step 1: Caricamento del mondo
objWorld = FreeObject()
load object "media\levels\ndb.dbo", objWorld
// Step 2: Creazione delle collisioni
Col = NDB_NewtonCreateTreeCollision( objWorld )
Room = NDB_NewtonCreateBody( Col )
// Step 3: Collegamento oggetti
NDB_BodySetDBProData Room, objWorld
NDB_NewtonBodySetDestructorCallback Room
// Rilascio memoria
NDB_NewtonReleaseCollision Col
// Caricamento dei dati del mondo
gosub carica_dati_mondo
return
Il ciclo di gioco è semplice:
Codice:
if shiftkey() = 1 and oldshift = 0
x# = -100
y# = 800
z# = 800
ENT_makeBox(50,50,50,x#,y#,z#,0,0,0)
endif
oldshift = shiftkey()
// Aggiorna la fisica
time# = NDB_GetElapsedTimeInSec()
NDB_NewtonUpdate time#
sync
E' davvero strano, fino a ieri funzionava tutto o.o