Problema Collisioni muro in FPS 3D

Argomenti riguardanti il D3D di GameMaker e librerie esterne.
Rispondi
Avatar utente
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Problema Collisioni muro in FPS 3D

Messaggio da tola22 »

salve ragazzi sto attualmente lavorando ad un FPS stile arena.. lunico problema da me riscontrato e con le collisioni con i muri che funzionano si.. ma purtroppo mi blocco nei muri e lo slittamento va e non va un po ci scivolo contro e un po mi blocco di continuo.. non capisco perché ora vi posto i codici di movimento.


questo sottostante e lo script scr_controls

Codice: Seleziona tutto

if!(gamepad_is_connected(0))
    {

                if(keyboard_check(ord("W")))  
                {
                
                    speed += 9.5;
                    
                }
                
                    if(keyboard_check(ord("S")))
                    {
                    
                        speed -= 9.5;
                        
                    }
                    
                    
                    speed = clamp(speed,-18,18);
                    
                    
             
               
                {
                var xn,yn;
                xn = x - sin(direction*pi/180) * dirs;
                yn = y - cos(direction*pi/180) * dirs;
                if not place_meeting(xn,yn,par_wall)
                { x = xn; y = yn; }
                }
                
                dirs -= dirs/4;
                
                 dirs += keyboard_check(ord("A"))*6;
                 dirs -= keyboard_check(ord("D"))*6;

                 
}
e nell'evento collisione con il muro ho messo questo

Codice: Seleziona tutto

  
    x = xprevious;
    y = yprevious;
        
    if ( !place_meeting(x+hspeed,y,other) ) {
        x += hspeed;
    } else {
        if ( !place_meeting(x,y+vspeed,other) ) {
            y += vspeed;    
        }
    }
sapete dirmi qualcosa di piu? devo risolvere perche il gioco sta prendendo forma bene e lunica cosa che proprio non mi torna e questa, cavolacci :spat:

grazie mille ragazzi :cappa:

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

Re: Problema Collisioni muro in FPS 3D

Messaggio da Jak »

Se il movimento lo calcoli per conto tuo non usare le variabili interne di GM altrimenti farai sia i tuoi movimenti sia quelli che GM fa normalmente, risultando in un movimento doppio rispetto a quello desiderato.
Probabilmente non si incastra per colpa del tuo codice ma proprio per colpa di game maker che ti sposta automaticamente in una posizione incastrata.
Siccome mi pare di capire che usi movimenti 2D o perlomeno un 3D stratificato( in modo tale da lavorare comunque in 2D), ti consiglio di usare le collisioni vettoriali piuttosto di quelle per pixel di GM (tra l'altro ora deprecate). Lascia che ci pensi il motore fisico a gestire tutto.
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
tola22
Membro
Messaggi: 185
Iscritto il: 11/03/2011, 0:00
Specialità: Drag and Drop
Uso: GM:Studio 1.4 Pro
Località: Svizzera
Contatta:

Re: Problema Collisioni muro in FPS 3D

Messaggio da tola22 »

potresti farmi un esempio pratico? non so da dove partire

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Problema Collisioni muro in FPS 3D

Messaggio da Alv »

Codice: Seleziona tutto

if!(gamepad_is_connected(0))
    {

                if(keyboard_check(ord("W")))  
                {
                
                    speed += 9.5;
                    
                }
                
                    if(keyboard_check(ord("S")))
                    {
                    
                        speed -= 9.5;
                        
                    }
                    
                    
                    speed = clamp(speed,-18,18);
                    
                    
             
               
                {
                var xn,yn;
                xn = x - sin(direction*pi/180) * dirs;
                yn = y - cos(direction*pi/180) * dirs;
                if not place_meeting(xn,yn,par_wall)
                { x = xn; y = yn; }
                }
                
                dirs -= dirs/4;
                
                 dirs += keyboard_check(ord("A"))*6;
                 dirs -= keyboard_check(ord("D"))*6;

                 
}
Qualcosa non quadra. Se moltiplichi per dirs, questo rappresenterà più una velocità che un angolo. Dovresti usare o direction o dirs al suo posto. Secondariamente, non dovresti testare la collisione con il muro, dal momento che hai gia impostato l'evento collisione.

Come diceva Jak, non devi usare le variabili built-in, altrimenti si verifica un movimento doppio. Il codice quindi diventa:

Codice: Seleziona tutto

if!(gamepad_is_connected(0))
    {

                if(keyboard_check(ord("W")))  
                {
                
                    sp+= 9.5;
                    
                }
                
                    if(keyboard_check(ord("S")))
                    {
                    
                        sp-= 9.5;
                        
                    }
                    
                    
                    sp= clamp(sp,-18,18);
                    
                    
                var xn,yn;
                xn = x - sin(dirs*pi/180) * sp;
                yn = y - cos(dirs*pi/180) * sp;
                { x = xn; y = yn; }
                
                 dirs += keyboard_check(ord("A"))*6;
                 dirs -= keyboard_check(ord("D"))*6;

                 
}
Se usi muri squadrati a 90 gradi, così già ti dovrebbe funzionare. Per muri in diagonale, devi annullare la componente della velocità ortogonale al muro (è un problemino di fisica).

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti