Pagina 1 di 1

Problema Collisioni muro in FPS 3D

Inviato: 01/12/2017, 20:40
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:

Re: Problema Collisioni muro in FPS 3D

Inviato: 02/12/2017, 10:47
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.

Re: Problema Collisioni muro in FPS 3D

Inviato: 03/12/2017, 17:02
da tola22
potresti farmi un esempio pratico? non so da dove partire

Re: Problema Collisioni muro in FPS 3D

Inviato: 10/07/2018, 20:53
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).