Creare Videogiochi - Game Developer

Versione completa: Problema con Newton
Al momento stai visualizzando i contenuti in una versione ridotta. Visualizza la versione completa e formattata.
Stò avendo uno strano problema con Newton o.o Allora.. io ho un livello, creo l'albero delle collisioni e fin qui tutto ok. Creo un cubo sia in darkbasic che con newton e ok. Provo: lo vedo scendere normalmente quindi la gravità funziona. Ho il debug attivo e quindi vedo anche le linee di collisione. Il problema è che il cubo cade sul mio livello, l'effetto fisico c'è e non c'è: il cubo inizia a girarsi ma non si ferma! Passa attraverso il livello e continua a scendere o.o

A qualcuno è già successo??

Zapetino

postami il source e vedo dove sta il problema
Questa è la sub per creare e inizializzare la fisica Smile
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à Wink


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

Zapetino

che bello !! un'altro che usa "//" al posto di "rem" in darkbasic pro !! XD
a parte gli scherzi sta sera lo controllo anche se ad una prima occhiata sembra abbastanza corretto
(06-01-2011, 05:36 PM)zapetino Ha scritto: [ -> ]che bello !! un'altro che usa "//" al posto di "rem" in darkbasic pro !! XD
a parte gli scherzi sta sera lo controllo anche se ad una prima occhiata sembra abbastanza corretto

xD Sono abituato con il C# e la sintassi del Java per questo metto i commenti in quel modo xD Infatti è corretto perchè funzionava, poi boh.. non sono riuscito a capire quale parte di codice ho modificato, magari intaccatto anche di poco, e non và più o.o

Se ti serve, questo è l'inizio del programma:
Codice:
// Gruppi fisici, utilizzati per la fisica
global NDB_Group_Default                                // Non modificare
global NDB_Group_Player                                    // Non modificare

// Variabili generali
global time# as float
dim arrEntita() as Entita                                // Insieme di tutte le entità
endGame as integer = 0                                    // Se viene messo ad 1, fà chiudere il gioco
currentCamera as integer  = 1                            // La telecamera iniziale
fog_enable as integer  = 0                                // Se impostato a 1, attiva la nebbia
fog_r# as integer = 255                                    // [Rosso] della nebbia
fog_g# as integer  = 255                                // [Verde] della nebbia
fog_b# as integer  = 255                                // [Blu] della nebbia
font_name$  as string = "Verdana"                         // Font da usare nel gioco
font_size#  as integer  = 12                            // Grandezza del font
sky_color = RGB(192,237,254)                            // Sky color
camera_range_view = 5000                                // La distanza massima per una telecamera

// Variabili NON MODIFICABILI
global objWorld = 0                            // E' l'id dell'oggetto del livello
global entPlayer = 0                        // E' l'id dell'entità del giocatore principale

Zapetino

ma ci stai scrivendo un engine per caso??
(06-01-2011, 08:01 PM)zapetino Ha scritto: [ -> ]ma ci stai scrivendo un engine per caso??

Si Smile Al momento supporta (supportava xD) la fisica e ho già l'editor di mappe come quello di FPS Creator Smile Adesso stò implementando altre cose vicino le entità Smile

Zapetino

mmmmmmmmm potresti postarlo o magari inviarmelo via pm ?? mi piacerebbe vederlo

comunque il source è apparentemente giusto prova a rivedere le collisioni del cubo, di solito il problema sta lì
(06-01-2011, 09:44 PM)zapetino Ha scritto: [ -> ]mmmmmmmmm potresti postarlo o magari inviarmelo via pm ?? mi piacerebbe vederlo

comunque il source è apparentemente giusto prova a rivedere le collisioni del cubo, di solito il problema sta lì

Appena correggo l'errore preparo l'editor (serve 3D World Studio) e ti mando una demo Smile Adesso provo a riscrivere tutte le collisioni Undecided

Edit
Ho trovato l'errore. Sul calcolo del momento di inerzia avevo messo delle variabili inesistenti :-P E' stato un errore di aggiornamento del codice in quanto per creare un rigidbody per il cubo avevo dato solo una dimensione (chiamata all'inizio "size") mentre poi ho cambiato e ho dato tre dimensioni (sizex,sizey,sizez) ma non ho modificato il momento di inerzia Smile

Zapetino

ah ecco credevo che quelle variabili le inizializzavi in un'altra parte del source.......
Adesso che funziona ho un'altro problema Tongue
Essendo che il giocatore è controllato da Newton (la fisica) come faccio a farlo muovere? Riesco a farlo girare per bene, ma muovere decentemente in avanti è un pò difficile....