Marzo 11, 2022, 03:25:25 AM Ultima modificación: Marzo 11, 2022, 04:38:04 AM por Jeffrey Faper
No se si esto va aqui pero bueno. Andaba por youtube viendo tutoriales para distraerme pero  al mirar la seccion de comentarios  algo me hizo sentir muy triste y eso fue que los chavos de hoy quieren todo en la mano asi que aqui esta, como hacer slopes invertidos como en el ori o invertir la gravedad,  en realidad es muy simple solo hay que invertir los + y los - de nuestro codigo base de colision contra blockes y agregar una boleana y he aqui como debe lucir nuestro script de colisiones
recuerda cambiar el image_yscale de tu personaje
[gml]
//evento create  creamos la variable grvzero
grvzero = 1;  // -1 = gravedad invertida ... 1 = gravedad normal;

//EVENTO STEP aplicar gravedad al jugador usando el scrApproach + la nueva variable grvzero
if(!onGround){
        vspd = scrApproach(vspd, vspdMax, grvspd/grvzero);
}

///scrApproach(a,b,amount)
/******************************************
/ Increments a value by a given shift but**
/ never beyond the end value             **
******************************************/
if(argument0<argument1){
   return  min(argument0+argument2,argument1);
   }else{
         return  max(argument0-argument2,argument1);
        }

///scrMotion();
/*******************************************************   
/* HORIZONTAL COLLISION CHECK                         **
/******************************************************/
repeat(abs(hspd)){
    //GRAVEDAD NORMAL
    if(grvzero==1){
        var block = place_meeting(x+sign(hspd),y,parSolid);
        //SOLID SLOPE UPWARD
        if(block){
            for(var i=1; i<=maxslp; i++;){
                if(!place_meeting(x+sign(hspd),y-i,parSolid)){
                    y -= i;
                    break;
                    }
                }
            }else{//SOLID SLOPE UPWARD
                    for(var i=maxslp; i>=1; i--;){
                        if(!place_meeting(x+sign(hspd),y+i,parSolid)){
                            if(place_meeting(x+sign(hspd),y+i+1,parSolid)){
                                y += i;
                                break;
                                }
                            }
                        }
                    }
        }
    //GRAVEDAD INVERTIDA
    if(grvzero==-1){
        var block = place_meeting(x+sign(hspd),y,parSolid);
        //SOLID SLOPE UPWARD
        if(block){
            for(var i=1; i<=maxslp; i++;){
                if(!place_meeting(x+sign(hspd),y+i,parSolid)){
                    y += i;
                    break;
                    }
                }
            }else{//SOLID SLOPE UPWARD
                    for(var i=maxslp; i>=1; i--;){
                        if(!place_meeting(x+sign(hspd),y-i,parSolid)){
                            if(place_meeting(x+sign(hspd),y-i-1,parSolid)){
                                y -= i;
                                break;
                                }
                            }
                        }
                    }
        }     
    //ONEWAY SLOPE CONDITIONS
    if(!place_meeting(x,y+1,parSolid)   && !place_meeting(x,y+1,overOneway))
    ||(!place_meeting(x,y+1,overOneway) &&  place_meeting(x,y+1,parSolid)   && keyUp)
    ||(!place_meeting(x,y+1,parSolid)   &&  place_meeting(x,y+1,overOneway) && keyUp){
   
    var oneway = place_meeting(x+sign(hspd),y,parOneway);
    //ONEWAY SLOPE UPWARD
    if(oneway){
       for(var i=1; i<=maxslp; i++;){
           if(!place_meeting(x+sign(hspd),y-i,parOneway)){
              y -= i;
              break;
              }
           }
       }else{//ONEWAY SLOPE DOWNWARD
          for(var i=maxslp; i>=1; i--;){
              if(!place_meeting(x+sign(hspd),y+i,parOneway)){
                 if(place_meeting(x+sign(hspd),y+i+1,parOneway)){
                    y += i;
                    break;
                    }
                 }
              }
         }
    }
    //LIMIT PLAYER TO CAMERA BORDERS
    if(x+sign(hspd)<=view_xview+16) || (x+sign(hspd)>=view_xview+view_wview-16){
       hspd = 0;
       }
   
    //LEFT-RIGHT SOLID COLISION CHECK
    if(!place_meeting(x+sign(hspd),y,parSolid)){
       x += sign(hspd);
       }else{
              hspd = 0;
              break;
       }
}
/*******************************************************   
/* VERTICAL COLLISION CHECK                           **
/******************************************************/
repeat(abs(vspd)){
    if(place_meeting(x,y+sign(vspd),parSolid)){
       vspd = 0;
       break;
       }
    if(vspd>0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+sign(vspd),parOneway)){
       vspd = 0;
       break;
       }
    if(vspd>0 && !place_meeting(x,y,overOneway)&& place_meeting(x,y+sign(vspd),overOneway)){
       vspd = 0;
       break;
       }else{
              y += sign(vspd);
       }
}
[/gml]