GameMaker smette di disegnare

Argomenti riguardanti il D3D di GameMaker e librerie esterne.
Rispondi
Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

GameMaker smette di disegnare

Messaggio da Cash »

Ho un mondo formato da blocchi 3D ognuno con altezza diversa e casuale. Appena apro il gioco divido la room in quadrati dove disegnerò poi il blocco con un numero scelto da me e poi creo un array bidimensionale dove le coordinate di ogni valore rappresentano uno di questi quadrati ed il valore l'altezza del blocco. Nel draw event con 2 cicli for faccio disegnare ogni blocco e fin qui non è un problema. Poi aggiungo il giocatore,questo può volare nella room con comandi da nave spaziale/aereo e anche questo va perfettamente,poi però voglio poter sparare,aggiungo il codice premo il tasto per sparare e GameMaker non disegna più niente,rimane l'ultimo frame disegnato eppure il gioco continua ad andare,nel debugger vedo che io posso ancora muovermi,lo sparo è stato creato e sta andando però non viene disegnato più niente. Provando a togliere l'oggetto che genera la mappa con i blocchi se si spara tutto funziona perfettamente,quindi l'unica cosa che mi viene in mente è che GM per risparmiare risorse smetta di disegnare,ma mi sembra strano che non dia nessun avviso e che un semplice

Codice: Seleziona tutto

d3d_draw_ellipsoid(x-2,y-2,depth-2,x+2,y+2,depth+2,tex,1,1,8)
causi tutto questo. Se volete vedere i codici che uso per generare la mappa:
Per crearla(usato solo 1 volta ad inizio gioco)

Codice: Seleziona tutto

var prec,maxHeight,xFor,yFor;
prec=argument1;
maxHeight=argument0;
xFor=floor(room_width/prec);
yFor=floor(room_height/prec);
for(i=0;i<(xFor);i++)
{
    for(j=0;j<yFor;j++)
    {
    global.arrayZpos[i,j]=irandom_range(maxHeight,0);
    }
}
Per disegnarla(ogni step)

Codice: Seleziona tutto

d3d_camera_projection()
///drawGenMap(prec);
var prec,xNum,yNum,arrayLenght;
prec=argument0;
xNum=floor(room_width/prec)
yNum=floor(room_height/prec)
arrayLenght=array_length_1d(global.arrayZpos);
for(i=0;i<xNum;i++)
{
    for(j=0;j<yNum;j++)
    {
        d3d_draw_block(prec*i-prec/2,prec*j-prec/2,0,prec*i+prec/2,prec*j+prec/2,global.arrayZpos[i,j],background_get_texture(tex_map),1,1);
    }
}
d3d_camera_projection (perchè non ho voglia di riscrivere tutto questo ogni volta)

Codice: Seleziona tutto

d3d_set_projection(obj_camera.x,obj_camera.y,obj_camera.depth,obj_camera.x+cos(degtorad(obj_camera.direction))*48,obj_camera.y-sin(degtorad(obj_camera.direction))*48,obj_camera.depth+obj_camera.pointZ,0,0,-1)
global.arrayZpos è l'array nel quale ho tutte le altezze dei blocchi
pointZ è una variabile che uso per vedere dove sta guardando il giocatore in verticale
yNum,xNum,xFor,yFor li uso per vedere quanti blocchi in verticale e orizzontale devo mettere nella room

L'unica cosa che mi viene in mente che potrei provare è far creare un modello 3D della mappa e far disegnare quello al posto di far disegnare ogni volta ogni singolo blocco

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: GameMaker smette di disegnare

Messaggio da Jak »

Mancano i codici per il movimento e lo sparo, è molto probabile stia li il problema. Dubito fortemente che sia un problema di game maker in quanto viene disegnato l'ultimo frame e nella maggior parte dei casi per problemi random dovrebbero venire problemi di altro tipo come gioco che si impianta o finestra nera.
E' molto più probabile che per qualche codice sbagliato che hai inserito lo sparo blocca l'update della proiezione o non aggiorna le variabili o boh. E' difficile risolvere il problema così, prova a postare il gmk se cè troppo codice in giro (caricalo su MEGA, mediafire, gdrive o quel che vuoi) inoltre prova a disegnare degli oggetti in movimento giusto per capire meglio quale sia il problema e se effettivamente game maker si blocca per ignote ragioni (in quel caso mi dispiace ma molto probabilmente dovrai rassegnarti)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: GameMaker smette di disegnare

Messaggio da Cash »

Jak ha scritto:Mancano i codici per il movimento e lo sparo, è molto probabile stia li il problema. Dubito fortemente che sia un problema di game maker in quanto viene disegnato l'ultimo frame e nella maggior parte dei casi per problemi random dovrebbero venire problemi di altro tipo come gioco che si impianta o finestra nera.
E' molto più probabile che per qualche codice sbagliato che hai inserito lo sparo blocca l'update della proiezione o non aggiorna le variabili o boh. E' difficile risolvere il problema così, prova a postare il gmk se cè troppo codice in giro (caricalo su MEGA, mediafire, gdrive o quel che vuoi) inoltre prova a disegnare degli oggetti in movimento giusto per capire meglio quale sia il problema e se effettivamente game maker si blocca per ignote ragioni (in quel caso mi dispiace ma molto probabilmente dovrai rassegnarti)
Sono riuscito a risolvere,stranamente sembra che GM tralasciasse tutto ciò che veniva disegnato dopo i cubi eppure non so perchè. Comunque ho trasformato tutti i cubi in un unico modello 3D ed ora disegno direttamente quello e stranamente funziona(e le prestazioni sono aumentate di molto). Il resto del codice è questo,però non l'ho toccato quindi boh.
Spoiler
è tutto nello step event:

Codice: Seleziona tutto

if keyboard_check(ord("W"))
{
pointZ+=1;
}
if keyboard_check(ord("S"))
{
 pointZ-=1;
}
if keyboard_check(ord("A"))
{
direction-=3;
}
if keyboard_check(ord("D"))
{
direction+=3;
}
if keyboard_check(vk_space)&&spd<6
{
spd+=0.1;
}
else
{
if spd>0
spd-=0.3
if spd<0
spd=0
}
if keyboard_check_pressed(vk_shift)
instance_create(x,y,obj_sparo)
//Movimento spd
x+=spd*cos(degtorad(direction))
y-=sin(degtorad(direction))*spd
depth+=spd*sin(degtorad(pointZ))
spd è una variabile che alla fine è identica a quella integrata "speed"
Il codice del proiettile
Nel create

Codice: Seleziona tutto

spd=2;
direction=obj_camera.direction
pointZ=obj_camera.pointZ;
depth=obj_camera.depth
tex=background_get_texture(tex_sparo)
nello step

Codice: Seleziona tutto

x+=spd*cos(degtorad(direction))
y-=spd*sin(degtorad(direction))
depth+=spd*sin(degtorad(pointZ))
nel draw event

Codice: Seleziona tutto

d3d_camera_projection()
d3d_draw_ellipsoid(x-2,y-2,depth-2,x+2,y+2,depth+2,tex,1,1,8)
Se a qualcuno interessa il codice di sopra modificato
nel create insieme all'altro

Codice: Seleziona tutto

///drawGenMap(prec);
var prec,xNum,yNum,arrayLenght;
prec=argument0;
xNum=floor(room_width/prec)
yNum=floor(room_height/prec)
arrayLenght=array_length_1d(global.arrayZpos);
global.modelMap=d3d_model_create()
for(i=0;i<xNum;i++)
{
    for(j=0;j<yNum;j++)
    {
        d3d_model_block(global.modelMap,prec*i-prec/2,prec*j-prec/2,0,prec*i+prec/2,prec*j+prec/2,global.arrayZpos[i,j],1,1);
    }
}
e nel draw event

Codice: Seleziona tutto

d3d_camera_projection()
d3d_model_draw(global.modelMap,0,0,0,background_get_texture(tex_map))

darla
Newbie
Messaggi: 1
Iscritto il: 24/09/2014, 12:18
Uso: GM:Studio 1.4 Free
Contatta:

Re: GameMaker smette di disegnare

Messaggio da darla »

l' oggetto era a 0 di depth (quello da riprendere) e ho usato d3d_set_depth.
usavo un oggetto camera e d3d_set_projection per inquadrare l' altro oggetto.
ma comunque ho risolto, è bastato mettere nelle yto della camera un "-1"
DARLA

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti