Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Menú Mostrar Mensajes

Temas - Jeffrey Faper

#1
Videojuegos / Hagane
Septiembre 13, 2022, 11:41:49 PM
Ahora que tengo un poco mas de tiempo libre intente retomar los juegos que estoy creando y falle inmediatamente,falta de inspiracion supongo, asi que mejor decidi ponerme a jugar un juego de la super que me gusta mucho, Hagane, si nunca lo has jugado te lo recomiendo al 100%, y si ,es el tipico juego de accion y plataformas de la era de 16-bit sus diferencias con otros juegos del mismo genero son muy pocas he aqui algunas, como que el personaje es un tanque, literal la velocidad de caminar del personaje es tan lenta que dan ganas de arrancarse los pelos o inclinarte con tu mando hacia el lado en que camina para ver si avanza mas rapido, uy y el salto es una mierda parece que le pesan una tonelada sera por que es un cyborg cemental, es su deber repoblar la tierra, la verdad parece un mal juego con una dificultad abusiva, con muchos errores de diseño y bla bla bla nada mas fuera de la realidad simplemente es un juego que hay que masterizar existen dos maneras de jugar este juego una es usando todo de lo que dispone nuestro personaje que basicamente seria las piruetas ataque y rebotes en las paredes y otra el modo lento caminar poquito a poquito matando poquito a poquito, cualquiera que elijas esta bien aunque yo te recomendaria la primera y para demostrarlo un ejemplo:
stage 1.
al iniciar la pantalla giras al personaje hacia la izquierda.
y despues mantendras persionado el gatillo derecho, creo ,para dar piruetas hacia la derecha, y ya esta con solo hacer eso ya te sentiras pro en este juego
lo siguiente que tienes que aprender es hacer los ataques especiales entre otras cosillas y ya esta, estaras jugando como los programadores tenian pensado que la gente jugaria este juego, aqui les dejo un video de donde aprendi como jugarlo por si alguien le interesa no me salen todos los trucos pero es cuestion de practicar.



el punto de este post era compartir, primero el amor que le tengo a este juego y segundo un editable donde intente recrear al heroe de este juego no esta calcado al 100% pero bueno, para aquel que quiera hacer un juego con un personaje parecido a este y no tenga ni idea de como hacerlo tal vez esto le sirva,
eso si esta incompleto y no tiene todas las habilidades, tal vez lo termine
en un futuro ojala.

hagane.gmx:
https://drive.google.com/file/d/1u5dyuxRuQR1WhMG9rE6LUJpzu-yL5IpJ/view?usp=sharing


#2
Preguntas y respuestas / formula curva bezier?
Julio 26, 2022, 05:08:28 PM
estaba mirando videos y me tope con este tema de las curvas bezier y la verdad no entendi ni madres asi que esta es mi pregunta.
cual seria la formula para calcular una curva bezier de cuatro anclas?
otra pregunta para que sirven las curvas bezier ademas de crear animaciones chulas o cosas graficas, se podria usar para crear enemigos granaderos que disparen con mayor precision o tal vez patrones de enemigos para juegos shoot em'up sin necesidad de usar cos() y sin(), eso seria todo que tenga un buen dia y gracias por su tiempo.

Posible Solucion:
al parecer lo que buscaba en realidad se llama algoritmo de Casteljau aqui le dejo el link de donde saque lo que necesitaba: https://javascript.info/bezier-curve

y esta es la posible implementacion en gml , no se si sea la manera correcta de hacerlo ya que encontre un monton de ejemplos sobre como implementarlo pero este fue el que mas me gusto: https://www.khanacademy.org/computer-programming/bezierpointa-b-c-d-t/4551007698681856

//scrBezierPoint(a,b,c,d,t)
var a=argument0;
var b=argument1;
var c=argument2;
var d=argument3;
var t=argument4;
//4 puntos de control formula
var point = power((1-t),3)*a + power((1-t),2)*t*b + (1-t)*power(t,2)*c + power(t,3)*d;
return point;

//evento draw
//dibujar bezier curve points
var steps = 30;
for(var i=0; i<=steps; i++){
    var t_ = i/steps;
    var x_ = scrBezierPoint(256, 350, 40, 125, t_);
    var y_ = scrBezierPoint(325, 150, 50, 325, t_);
    draw_circle_colour(x_, y_, 2, c_red,c_red,0);
}
#3
Preguntas y respuestas / como implementar z-axis?
Junio 26, 2022, 11:33:00 PM
como dice el titulo cual seria la manera correcta de implementar la variable z en nuestros juegos 2d.
la forma mas simple que se me ocurrio fue con ds_grid pero la verdad no tengo ni idea sobre como usar eso.
la otra forma fue con lo que ya se usar osea place_meeting() y colisiones la verdad no consegui malos resultados pero tal vez exista una mejor manera de hacerlo
le agradezco por adelantado cualquier tip o ayuda y de paso le dejo el proyecto por si quiere echarle un vistazo.

isoScurge.gmx : https://drive.google.com/file/d/1enj_6AlgyDDuZ1Cen5URCerK-Ktc2Ev4/view?usp=sharing
#4
Preguntas y respuestas / script GM1 a GM2? resuelto
Junio 21, 2022, 04:24:22 PM
Hola a todos espero tenga un buen dia, tengo esta duda como convertiria este script en un script de GM2
[gml]
var initAngle,numbBullets,bulletAngle;
initAngle=argument0;
numbBullets=argument1; 
bulletAngle=360/numbBullets;

for(var i=initAngle; i<initAngle+360;  i+=bulletAngle){
    var thisBullet= instance_create(x, y, objBullet);
    thisBullet.sprite_index=sprBull0;
    thisBullet.direction=i;
    thisBullet.speed=2;
}
[/gml]
#5
Preguntas y respuestas / Como implementar zoom?
Junio 05, 2022, 01:56:54 PM
Hola tengo esta duda cual es la manera correcta de implementar zoom al juego, yo lo hago de le siguiente manera(mirar mas abajo).
Entonces me surgio una duda sera esta la manera correcta de realizarlo, que problemas me podria generarar al hacerlo de esta manera
pregunto por que he estado mirando tutoriales sobre el tema y lo hacen de manera diferente
bueno eso es todo si podria aclararme esa pequeña duda se lo agradezco por adelantado...

zoom the easy way:
[gml]
///OBJETO CAMARA
//event create
viewWidth=320;  //ancho de su view
viewHeight=240; //largo de su view
zoom=1;         //escalado de su view
target=0;       //que jugador perseguir
//zooming view
view_wview[0]=viewWidth*zoom;
view_hview[0]=viewHeight*zoom;

//evento Step
//ZOOM-OUT
if(keyboard_check(ord("Z"))){
    zoom+=0.1;
    view_wview[0]=viewWidth*zoom;
    view_hview[0]=viewHeight*zoom;
}
//ZOOM-IN
if(keyboard_check(ord("X"))){
    zoom-=0.1;
    view_wview[0]=viewWidth*zoom;
    view_hview[0]=viewHeight*zoom;
}

//evento End Step
//ASSIGNAR CAMARA A LIDER
var setLeader=instance_nearest(x+64,y,parPlayers);
//SEGUIR AL JUGADOR
if(instance_exists(objPlayer1) || instance_exists(objPlayer2)){
    target=setLeader;
   
    //clampear view al jugador y limites de la room
    var xvf=clamp(target.x-viewWidth*zoom/2,0,room_width*10-viewWidth);
    var yvf=clamp(target.y-viewHeight*zoom/2,0,room_height-viewHeight);
   
    //velocidad de la view
    var sv=0.5;
   
    //actualizar posicion de nuestra camara
    view_xview[0]=lerp(view_xview[0],xvf,sv);
    view_yview[0]=lerp(view_yview[0],yvf,sv);
}
//ACTUALIZAR POSICION OBJETO CAMARA
x=view_xview;
y=view_yview;
[/gml]

Zoom In/out View:
[spoiler]

[/spoiler]
Zoom In/Out Surface:
[spoiler]

[/spoiler]
Zoom In/Out Surface+View:
[spoiler]

[/spoiler]



#6
Autor del script: Jeffrey Faper
Nombre del script: scrGetSprite();
Breve descripción de su función: ayuda a controlar nuestras animaciones en 8 direcciones sin usar mucho IF.
Versiones usadas: Game Maker 1.4 .
Versión del script: 1.0;

Le ha pasado que esta creando un juego donde el jugador se mueve o apunta en 8 direcciones y de repente
se da cuenta que todo su codigo esta lleno de esto:
[gml]
if(direction==0)if(direction==45)if(direction==180)if(direction==0.20)if(direction==45)if(direction==0*25/0)if(direction==0)if(direction==45)if(direction==0)
if(direction==0)if(direction==45)if(direction==1200)if(direction==0.90)if(direction==45)if(direction==0)if(direction==0)if(direction==45)if(direction==0)
if(direction==0)if(direction==45)if(direction==1300)if(direction==010)if(direction==45)if(direction==0)if(direction==0)if(direction==45)if(direction==0)
if(direction==0)if(direction==45)if(direction==1200)if(direction==0.90)if(direction==45)if(direction==0)if(direction==0)if(direction==45)if(direction==0)
[/gml]
Bueno pos pare de sufrir que aqui le traigo una solucion simple a este problema.

Tutorial Como Usar el script:

1 - Primero necesitamos saber  en que  direccion esta apuntando o moviendose el jugador y lo haremos con las siguientes variables
[gml]
//EVENTO CREATE JUGADOR
/*
podemos usar estas variables, si usted quiere puede cambiarles el nombre o si ya tiene una variable que haga lo mismo
simplemente cambie la variable aiming del script por la suya..
*/
horMove=0;
verMove=0;
aiming=0;  //almacenara las 8 direcciones que serian 0, 45, 90, 135, 180, 225, 270, 315..
[/gml]

2 - En el evento step del jugador pondremos lo siguiente
[gml]
//ESTE CODIGO NOS DIRA EN QUE DIRECCION ESTA APUNTANDO O MOVIENDOSE EL JUGADOR
horMove=(-keyboard_check(vk_left)+keyboard_check(vk_right));
verMove=(-keyboard_check(vk_up)+keyboard_check(vk_down));
if (horMove!=0 || verMove!=0){
    aiming=point_direction(0,0,horMove,verMove);
}
[/gml]

Algo de debug para ver que todo funcione bien
[gml]
//DRAW_GUI EVENT
draw_set_colour(c_red);
draw_text(176,64,
"PLAYER 1"
+"#AIMING :"+string(aiming));
[/gml]


3 - Ahora ya podemos usar nuestro script el cual consta de un array que almacenara las 8 direcciones y su correspondiente sprite
ademas dividira las direcciones almacenadas en la variable aiming entre 45 para obtener el index del array y asi dibujar el sprite que deseado...
scrGetSprite():
[gml]
///scrGetSprite(0,45,90,135,180,225,270,315);
var sprArray;
var sprIndex;
var index;

index=floor(aiming/45.0);

sprArray[0]=argument0;
sprArray[1]=argument1;
sprArray[2]=argument2;
sprArray[3]=argument3;
sprArray[4]=argument4;
sprArray[5]=argument5;
sprArray[6]=argument6;
sprArray[7]=argument7;

sprIndex=sprArray[index];

return sprIndex;
[/gml]

Para finalizar un ejemplo de como usarlo,  como puede ver yo estoy usando una variable llamada sprindex por que estoy dibujando el personaje
con las funciones de dibujo de Game Maker - draw_text_ext() si usted usa sprite_index lo llamaria de la misma manera
sprite_index=scrGetSprite(sprAttack0, sprAttack45, sprAttack90, );
[gml]
//ESTADO CORRER DE  MI PERSONAJE
//RUNNING
    if(horMove<>0){     
        maxspdx=1.95375;
        //corriendo
        if(!shooting){
            imgspd+=0.2;
            sprindex=scrGetSprite(sprR_0180,sprR_45135,sprShootUp,sprR_45135,sprR_0180,sprR_225315,sprDuckShoot,sprR_225315);
        }
       //corriendo y disparando
        if(shooting){
            imgspd+=0.4;
            sprindex=scrGetSprite(sprRS_0180,sprRS_45135,sprShootUp,sprRS_45135,sprRS_0180,sprRS_225315,sprDuckShoot,sprRS_225315);
        }
    }
[/gml]


si tiene dudas o hay algun error no dude en comentar xd..


#7
Alguien sabe como hacer esto . me refiero a la curvatura que hace la granada
#8
Pues como dice el titulo alguien sabe como puedo hacer ese tipo de acciones usadas muy frecuentemente en juegos de konami.
ya tengo rampas de techo con objetos solidos y funcionan bien,  pero la verdad  no se como implementarlo con objetos a los cuales puedo atravesar desde cualquier lado les dejo  un ejemplo para que se de una mejor idea sobre lo que estoy hablando...


#9
Estaba intentando recrear las fisicas de sonic,  para usarlas en enemigos tipo tanque que puedan aderirse al terreno, pero falle rotundamente
me decidi a buscar algun tutorial y la verdad no hay mucho de donde escoger  los pocos que encontre me dieron algunos errores
asi que si alguien sabe como implementar ese tipo de colisiones se le agradece su ayuda.

Solucionado este tutorial me ayudo a entender un poco como funcionan las colisiones en un juego de Sonic

sanicPro_Test.gmz : https://drive.google.com/file/d/1IzHJcs9VWH3tcFfbI_7ltnxxSC8FGoTD/view?usp=sharing


Surgio este error que hace que nuestro tanque tenga ganas de hacer piss.


para solucionarlo  solo hay poner estas condiciones en el scrFindAngle
[gml]
while(k>0){
    if(!done1){
        if(hspd<>0 && collision_point(x1,y1,parSolid,1,1))
        ||(hspd<>0 && collision_point(x1,y1,parOneway,1,1)){
            done1=1;
            }
        if(onGround){
            x1+=asin;
            y1+=acos;
            }
        }
    if(!done2){
        if(hspd<>0 && collision_point(x2,y2,parSolid,1,1))
        ||(hspd<>0 && collision_point(x2,y2,parOneway,1,1)){
            done2=1;
            }
        if(onGround){
            x2+=asin;
            y2+=acos;
            }
        }
    if(done1 && done2){
        break;
        }
    k--;
}
[/gml]
y listo bueno eso creo....


#10
Preguntas y respuestas / script_execute ?
Abril 28, 2022, 04:34:36 PM
En el manual YoYo recomienda no usar script_execute por ser lento y ademas menciona que un uso intensivo puede generar bajo rendimiento
lo probe para controlar los estados del jugador de esta manera.

[gml]
//EVENTO CREATE PLAYER
//PLAYER ACTIONS
action=nova.stand;
state[nova.stand]=scrStand;
state[nova.move]=scrMoving;
state[nova.fall]=scrFalling;
state[nova.hitting1]=scrHitting1;
state[nova.hitting2]=scrHitting2;
state[nova.hitting3]=scrHitting3;
enum nova{stand,move,fall,hitting1,hitting2,hitting3};

//EVENTO STEP PERSONAJE
//EJECUTAR ESTADOS DEL PERSONAJE
script_execute(state[action]);
[/gml]
mi duda es, recomiendan el uso de esta funcion o es mejor usar switch statement
ya probe con ambas y la verdad no note muchas diferencias tal vez por que solamente lo esta ejecutando una sola instancia.
aqui le dejo el proyecto de prueba por si quiere echarle un vistazo...
Test_script_execute.gmz:  https://drive.google.com/file/d/10ftzbStkZ53BiXey2CvoJ_lnbsFAA6Qy/view?usp=sharing
#11
en mi juego estoy constantemente creando y destruyendo instancias, como enemigos, balas, explosiones
pensaba que  esa era la manera correcta de hacerlo, pues es lo que te enseñan en los tutoriales de youtube
pero hace poco me tope con esto llamado object pooling,  al parecer crear y destruir instancias genera problemas
de fragmentacion de memoria y en mi juego es evidente ese problema, ya que la memoria de la aplicacion
va aumentando con el tiempo no es algo exagerado pero tal vez en un futuro me podria causar problemas
entonces esta es mi pregunta es necesario implementar object pooling a todos los proyectos o depende del tipo de juego
y de paso como es que se implementa esta tecnica o magia oscura, se que se hace con ds_list pero no se como
gracias por su tiempo!!



#12
cuales son las diferencias entre crear una aplicacion con Windows y Windows(YYC)
#13
Estaba probando un nivel de mi juego de navecitas y todo marchaba bien hasta que me dio hambre y mejor decidi prepararme el desayuno, asi que deje el juego corriendo en el PC  y cuando regrese me di cuenta que el juego habia crasheado por falta de memoria
estas son mis preguntas:
la funcion game_restart no elimina la data de nuestro juego?
si no lo hace entonces para que sirve esta funcion?
si al final hay que hacerlo nosotros mismos en que casos recomiendan el uso de esta funcion?
#14
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]
#15
Juegos en desarrollo / prinDX
Marzo 05, 2022, 05:02:45 PM


prinDX


Plataformas


GM: Studio



DEVLOG + Tutorial Primer Personaje Accion y Plataformas:
[spoiler]
devlog1:
[spoiler]

[/spoiler]
devlog2:
[spoiler]
proyecto base descarga : https://drive.google.com/file/d/1CyKkdFar03yUjLD7PDUlUwJhD2IjOzec/view?usp=sharing

[/spoiler]
devlog3:
[spoiler]
prinSprites: https://www.spriters-resource.com/fullview/22864/

[/spoiler]
devlog4:
[spoiler]

prinScripts : https://drive.google.com/file/d/1Xi0Nuni3DyEiW7E0NJA36re6L74EHLLK/view?usp=sharing
[/spoiler]

[/spoiler]

no he actualizado el ejecutable del juego lo mas probable es que lo haga cuando termine el primer mapa y su respectivo jefe de nivel.

todo esto esta en modo prueba asi que si quiere dar alguna recomendacion o encuentra algun error no dude en comentar






https://drive.google.com/file/d/1VkbsiePA8y7D9epCt2mzCPqksLHGScTB/view?usp=sharing



#16
necesito consejos para conseguir mejores animaciones, por el momento uso image_speed pero me estoy plantenado usar otro tipo de metodo..alguna recomendacion?
#17
el jugador no se queda encima de la plataforma, funciona bien con plataformas solidas
ya lo solucione me faltaba esto vspd>0 en el codigo de colisiones , ya funciona correctamente con ambos tipos de plataformas pero me surgio otra duda como hago para controlar velocidades  de plataforma menores a 1 como 0.5;

PLATAFORMAS MOVILES :
EDITABLE SI ENCUENTRA BUGS AVISE :
https://drive.google.com/file/d/1zF4Se-PHWXp8nTsLLBUh6S3TYtZhxEFq/view?usp=sharing
[spoiler]
[gml]
//creditos para youtuber Art Games and Tech
//EVENT CREATE
platformType = 0;
initx = x;
inity = y;
hspd = 0;
vspd = 0;
radius = 60;
platDir = 1;
platAng = irandom(360);

//EVENT END STEP
switch(platformType){

//HORIZONTAL PLATFORM
case 0:
var platormSpeed = 0.5;
if(platAng mod(360)==0){
    platAng =-platAng;
    }
    platAng += platormSpeed*platDir;
    hspd = initx+lengthdir_x(radius,platAng)-x;
   
    with(parPlayers){
        if(!place_meeting(x,y,other) && place_meeting(x,y+1,other)){
            if(!place_meeting(x+other.hspd,y,parSolid)){
                x += other.hspd;
                }
            }
    }
    x += hspd;   
break;

//VERTICAL PLATFORM
case 1:
var platormSpeed = 0.5;
if(platAng mod(360)==0){
    platAng =-platAng;
    }
    platAng += platormSpeed*platDir;
    vspd = ceil(inity+lengthdir_y(radius,platAng)-y);
   
    with(parPlayers){
        if(!place_meeting(x,y,other) && place_meeting(x,y+abs(other.vspd),other)){
            if(!place_meeting(x,y+other.vspd,parSolid)){
                y += other.vspd;
                }
            }
    }
    y += vspd;   
break;
   
//CIRCULAR PLATFORM
case 2:
var platormSpeed = 0.5;
if(platAng mod(360)==0){
    platAng =-platAng;
    }
    platAng += platormSpeed*platDir;
    hspd = initx+lengthdir_x(radius,platAng)-x;
    vspd = ceil(inity+lengthdir_y(radius,platAng)-y);
   
    with(parPlayers){
        if(!place_meeting(x,y,other) && place_meeting(x,y+1,other)){
            if(!place_meeting(x+other.hspd,y,parSolid)){
                x += other.hspd;
                }
            }
        if(!place_meeting(x,y,other) && place_meeting(x,y+abs(other.vspd),other)){
            if(!place_meeting(x,y+other.vspd,parSolid)){
                y += other.vspd;
                }
            }
    }
    x += hspd;
    y += vspd;   
break;
}
[/gml]
[/spoiler]
#18
Estoy trasteando con shaders,  me parecen increibles pero la mayoria de documentacion esta en ingles asi que lo poco que tengo son shaders de la pagina shaderToy convertidos a shaders  Game Maker 2 uno de estos cambia la tonalidad de la imagen por tiempo y el otro es un shader tipo waves ondas
la duda que tengo es como combinar ambos efectos,  trate de hacer un solo shader con ambos efectos pero siempre me arrojaban errores y ni idea de como solucionarlo
PROYECTO:
https://drive.google.com/file/d/1v31QgyNM6fKaxZmWWslwiFNOWyrP9P3-/view?usp=sharing

SHADER DISCO:
[spoiler]
[gml]
//shDisco
/*
//EVENT CREATE OBJECT:
sh_res  = shader_get_uniform(shDisco,"iResolution");
sh_time = shader_get_uniform(shDisco,"iGlobalTime");


//DRAW_EVENT OBJECT:
shader_set(shDisco)
shader_set_uniform_f(sh_res,512,512,0);
shader_set_uniform_f(sh_time,current_time/1000);
draw_self();
shader_reset()

*/

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

uniform float iGlobalTime;
uniform vec3 iResolution;

void main( void )
{
    //Inputs
    float gridRows = 1.0;
    float gridCols = 1.0;
    float satFactor = 0.5;
    float movingSpeed = 2.0;
   
   
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = 1.0/iResolution.xy;
   
    //We find out in which grid the pixel is
    int pixCol = int(uv.x*gridCols);
    int pixRow = int(uv.y*gridRows);
   
    // Time varying pixel color
    vec3 col = satFactor + satFactor*cos(iGlobalTime*movingSpeed+vec3(pixCol,pixRow,pixCol)+vec3(0,2,4));

    // Output to screen
    gl_FragColor = vec4(col,1.0)* texture2D(gm_BaseTexture, v_vTexcoord );
}
[/gml]
[/spoiler]

SOLUCION PROBLEMA :
al dibujar el backgroundWaves con el shader waves activado, se dibujaba la pagina de textura completa en lugar de solo el background
la solucion fue simple dibujar el backgroundWave en una surface y pasar lo dibujado en dicha surface al shader quedando nuestro evento de dibujo de esta manera
[spoiler]
[gml]
//evento draw
    //SHADER WAVES-----------------------------------------------
    //CREATE WAVES SURFACE:
    if(!surface_exists(surfWaves)){
       surfWaves = surface_create(room_width, room_height);
       }
       //draw wave sprite to waves surface:
       surface_set_target(surfWaves);
       draw_background_tiled_ext(backgroundWav,0,0,1,1,c_white,1);
       surface_reset_target();
       
       //DRAW SHADER SURFACE TO SCREEN
       shader_set(shWave);
       shader_set_uniform_f(sh_wtime,current_time/1000);
       shader_set_uniform_f(sh_wscale,mouse_x,5);
       shader_set_uniform_f(sh_wfactor,0.05,0.1);
       draw_surface(surfWaves,0,0);
       shader_reset();
[/gml]
[/spoiler]

SHADER WAVES:
[spoiler]
[gml]
//shWave
/*
//EVENT CREATE
sh_wtime =  shader_get_uniform(shWave,"time");
sh_wscale = shader_get_uniform(shWave,"Scale");
sh_wfactor = shader_get_uniform(shWave,"Factor");

//EVENT DRAW
shader_set(shWave)
shader_set_uniform_f(sh_wtime,current_time/1000);
shader_set_uniform_f(sh_wscale,10,5);
shader_set_uniform_f(sh_wfactor,0.05,0.1);
shader_reset();
*/

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

uniform float time;
uniform vec2 Scale;   // 10,5
uniform vec2 Factor; // 0.05, 0.1

void main() {
     
     vec2 texCoord = v_vTexcoord;
     texCoord.x = texCoord.x+cos(texCoord.y*Scale.x+time*Factor.x)*Factor.y;
     texCoord.y = texCoord.y+sin(texCoord.x*Scale.y+time*Factor.x)*Factor.y;
     
     gl_FragColor = texture2D(gm_BaseTexture, texCoord);
}
[/gml]
[/spoiler]



#19
es la primera vez que intento agregar dos jugadores , ya tengo casi todo listo, pero surgio una duda como controlar la camara   
SOLUCION : usar la funcion mean
[gml]
          //DOS JUGADORES UNA CAMARA...
           view_xview = ((mean(P1.x,P2.x)-view_wview/2)+view_xview*5)/6;
           view_yview = ((mean(P1.y,P2.y)-view_hview/2)+view_yview*5)/6;

[/gml]
plataformas 2 jugadores :  https://drive.google.com/file/d/1zkOHIF5ZABHBGiZIvm5_42D04HwYHNkh/view?usp=sharing
#20
Cuales son las diferencias entre estos eventos  tal vez el evento step es el que tengo mas claro de todos esots, pero el resto de ellos jamas los he usado mucho menos sabria en que tipo de circunstancias seria mas  util usar uno u otro