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]
(https://i.ibb.co/DGDZM6s/20220310-202055.gif)