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.

Mensajes - Jeffrey Faper

1
En realidad space harrier fue creado con codigo pseudo 3d mientras que el modo7 de super nintendo solamente son rotaciones y escalado de sprites
la gente suele confundirlos, ademas es muy extraño que existan tutoriales para crear juegos pseudo 3d como space harrier, outzone, top gear pero no existan tutoriales usando las funciones 3d de Game Maker.
Aqui le dejo el tutorial e informacion  para el que le interese mas ese tema del pseudo 3d:
[spoiler]
http://www.extentofthejam.com/pseudo/espanol.html
[/spoiler]
[spoiler]
https://www.youtube.com/watch?v=AC4P11dhKQI
[/spoiler]

En cuanto a la pregunta puede echarle un vistazo a los tutoriales de Dragonite creo que es el unico tio que sube cosas relacionadas
con el 3d de Game Maker
[spoiler]
https://www.youtube.com/c/DragoniteSpam
[/spoiler]
y este tutorial de Game Maker 1 sobre como crear los backgrounds 3d de los juegos touhou
[spoiler]
https://www.youtube.com/watch?v=2P573Vsi25Q
[/spoiler]
2
Preguntas y respuestas / como implementar z-axis?
Junio 27, 2022, 06:33:00 AM
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
3
Preguntas y respuestas / script GM1 a GM2? resuelto
Junio 21, 2022, 11: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]
4
el error es que su variable no se ha establecido antes de leerla en pocas palabras no existe ese error siempre me pasa cuando me equivoco y escribo mal el nombre de una variable aunque hay mas razones para que surga este error, deberia buscar en la comunidad inglesa de game maker ahi siempre reciben errores de ese tipo
5
Juegos en desarrollo / Re: prinDX
Junio 15, 2022, 07:11:18 AM
He Añadido una sesion de tutoriales donde dice devlog spoiler , para aquellos que deseen crear un juego de accion y plataformas.
En realidad es practicamente el mismo codigo que estoy usando para crear este juego espero les sea de ayuda y logren cumplir sus metas....
6
Preguntas y respuestas / Como implementar zoom?
Junio 05, 2022, 08: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]



7
General / Re: Scripts indomables
Junio 04, 2022, 09:23:51 PM
Interesante. Este tio tiene tutoriales sobre generacion procedural muy buenos  y justamente tiene uno sobre el algoritmo flood_fill
tal vez le ayude a concretar su script de bote de pintura...

algoritmo floodfill:
https://refreshertowelgames-wordpress-com.translate.goog/2021/01/25/procedural-generation-in-gms-5-a-flood-of-fills/?_x_tr_sl=auto&_x_tr_tl=es&_x_tr_hl=es#slow

wiki algoritmo floodfill:
https://es.wikipedia.org/wiki/Algoritmo_de_relleno_por_difusi%C3%B3n
8
Me agrada mucho su juego es bonito pero muy dificil o tal vez soy muy mal jugador
pero bueno estos son algunos detalles que encontre.

1.Falta de remapeo de controles:
   No se me dificulta moverme con wasd, pero, la cosa cambia cuando intentas esquivar al mismo tiempo
   si no tiene planeado poner controles personalizados tal vez podria cambiar la tecla Q por la barra espaciadora
   ya que es mas facil usar el dedo pulgar en lugar del meñique

2.Dificultad desbalanceada
   Ya habia probado el juego con anterioridad y entiendo que el juego es un prototipo, pero me parecio mucho mas dificil esta version a pesar de las mejoras
   entonces solo hay una de dos opciones o soy muy malo o la dificultad esta desbalanceada
   por ejemplo este enemigo :
   
   es el demonio en persona,  le explico por que.
   1.no recibe daño
   2.dispara balas muy rapidas
   por lo general un enemigo con esas caracteristicas deberia disparar balas con una velocidad baja o media
   otro punto es que el jugador esta limitado a disparar horizontalmente, pero algunos enemigos se mueven rapidamente en diagonal hacia el
   eso deja al jugador con una desventaja horrible ya que tiene que decidir entre esquivar proyectiles o esquivar al enemigo
   en cambio si el jugador apuntara con el mouse esto seria mas sencillo ya que usaria la otra mano para apuntar y disparar
   mientras que con la otra mano se mueve  y esquiva cosas. si no quiere modificar nada la solucion es muy simple
   1.Agrege mas puntos de vida al jugador.
   En cuanto a las balas que rebotan le recomendaria que no abuse tanto de ellas lo mejor seria que combine
   enemigos que disparen balas normales o con diferentes patrones,  con uno o dos enemigos que disparen balas que rebotan.
   Puliendo este tipo de aspectos creo que tiene un buen juego entre manos, de hecho su juego me recuerda mucho a este juego llamado
   CometStrike echele un vistazo y mire la velocidad de las balas la velocidad de los enemigos:
   https://www.youtube.com/watch?v=BOKvm3n5vr0

3.Enemigos aparecen en la cara del jugador
   Deberia poner una pequeña animacion antes de activar al enemigo asi el jugador podra evadirlo.

para finalizar,  en ocasiones al iniciar el nivel , el jugador queda atrapado entre las paredes
9
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..


10
la logica es la misma con la que mueves al jugador
valores negativos sumados a la x del jugador haran que se mueva hacia la izquierda
valores positivos sumados a la x del jugador haran que se mueva hacia la derecha
entonces puedes usar una variable para almacenar hacia que lado mira el personaje
y usarlo en tu variable de velocidad horizontal

por ejemplo:
[gml]
/*
sight=-1;// personaje mira hacia la izquierda.
sight=1; //personaje mira hacia la derecha.
*/
//suponiendo que la manera de inicializar su movimiento es esta
var horMove=(-keyLeft+keyRight);  //esto entrega -1 si se presiona la izquierda y  1 si se presiona la derecha.
if(horMove<>0){
   sight=horMove; //con esto ya tiene hacia donde esta mirando su personaje
}
//cuando ejecutes el ataque con desplazamiento simplemente  declaras tu velocidad horizontal de esta forma
hspd=sight*5;//el personaje dasheara hacia donde mira
[/gml]
quedaria algo asi:
11
No se si esta sea la forma correcta de hacerlo pero bueno por el momento funciona bien
enGranadero:
[gml]
//STEP EVENT
//SET TARGET
if(target==noone){
    var onRange1=(objPlayer1.x>=x-176 && objPlayer1.x<=x+176);
   
    image_index=0;
   
    if(instance_exists(objPlayer2)){
        var onRange2=(objPlayer2.x>=x-160 && objPlayer2.x<=x+160);
        //PLAYER 1 ON RANGE
        if(onRange1 && !onRange2){
            target=objPlayer1;
        }       
        //PLAYER 2 ON RANGE
        if(onRange2 && !onRange1){
            target=objPlayer2;
        }
        //RANDOM SET TARGET
        if(onRange1 && onRange2){
            target=choose(objPlayer1,objPlayer2);
        }
    }else{
        if(onRange1){
            target=objPlayer1;
        }
    }
}

if(target!=noone){ 
    enShotRate--;
    //MIRROR TARGET
    if(target.x<=x-16){
         enSight=-1;
    }
    if(target.x>=x+16){
        enSight=1;
    }
    //ATTACK ANIMATION
    if(enShotRate==20 || enShotRate==10){
        image_index++;
    }
    //LAUNCH GRENADE
    if(enShotRate<=0){
        var thisGrenade=instance_create(x,y,objEnBullets);
        thisGrenade.sprite_index=sprEGrenade;
        thisGrenade.speed=12;
        thisGrenade.direction=point_direction(x,y,target.x,y-650);
        thisGrenade.gravity=0.5;
        target=noone;
        enShotRate=60;
    }
}
[/gml]
12
Alguien sabe como hacer esto . me refiero a la curvatura que hace la granada
13
Creo que no es posible hacer eso ya que Game Maker se ejecuta en un entorno seguro, segun el manual dice que se  puede desactivar
el modo sandbox pero quien sabe
https://manual.yoyogames.com/Additional_Information/The_File_System.htm
14
 El error fue que estaba comprobando mal la colision en el scrMotion
lo estaba haciendo asi: (vspd>=0 && !place_meeting(x,y,zipline)  &&  place_meeting(x,y+sign(vspd),zipline)
cuando la forma correcta era esta: (vspd>=0 && !place_meeting(x,y,zipline) && place_meeting(x,y-1,zipline)
He limpiado un poco el codigo aqui le dejo los scripts corregidos o el projecto.

contra3 ejemplo.gmx: https://drive.google.com/file/d/1WXXyTdO_M8gpTig6J6d9JsXom7KkZa7X/view?usp=sharing

scrMotion:
[spoiler]
[gml]
repeat(ceil(abs(hspd))){
    if(onGround){
        /*************************
        //SOLID_SLOPES_COLLISION//
        /************************/
        var cBlock=place_meeting(x+sign(hspd),y,parSolid);
        if(cBlock){
            //SOLID SLOPE UPWARD
            for(var i=0; i<5; i++;){
                if(!place_meeting(x+sign(hspd),y-i,parSolid)){             
                    y-=i;
                    break;
                }
            }
        }else{
            //SOLID SLOPE DOWNWARD
            for(var i=5; i>0; i--;){
                if(!place_meeting(x+sign(hspd),y+i,parSolid)){
                    if(place_meeting(x+sign(hspd),y+i+1,parSolid)){
                        y+=i;
                        break;
                    }
                }
            }
        }
        /*************************/
        //ONEWAY_SLOPES_COLLISION//
        /*************************/
        var cOneway=place_meeting(x+sign(hspd),y,parOneway) && !place_meeting(x,y+1,parSolid);
        if(place_meeting(x,y+1,otherBlock) && keyUp) || (!place_meeting(x,y+1,otherBlock)){
            if(cOneway){
                //ONEWAY SLOPE UPWARD
                for(var i=0; i<5; i++;){
                    if(!place_meeting(x+sign(hspd),y-i,parOneway)){             
                        y-=i;
                        break;
                    }
                }
            }else{
                //ONEWAY SLOPE DOWNWARD
                for(var i=5; i>0; i--;){
                    if(!place_meeting(x+sign(hspd),y+i,parOneway)){
                        if(place_meeting(x+sign(hspd),y+i+1,parOneway)){
                            y+=i;
                            break;
                        }
                    }
                }
            }
        }
    }
    /********************************/
    //CEILING_SOLID_SLOPES_COLLISION//
    /********************************/
    if(onCeils){
        var cCeils=place_meeting(x+sign(hspd),y,parSolid);
        if(cCeils){
            //CEILING SLOPE UPWARD
            for(var i=0; i<5; i++;){
                if(!place_meeting(x+sign(hspd),y+i,parSolid)){
                    y+=i;
                    break;
                }
            }
        }else{
            //CEILING SLOPE DOWNWARD
            for(var i=5; i>0; i--;){
                if(!place_meeting(x+sign(hspd),y-i,parSolid)){
                    if(place_meeting(x+sign(hspd),y-i-1,parSolid)){
                        y-=i;
                        break;
                    }
                }
            }
        }
    }
    /**************************/
    //ZIPLINE_SLOPES_COLLISION//
    /**************************/
    if(onZipline){
        var cZipline=place_meeting(x+sign(hspd),y,zipline) && !place_meeting(x,y+1,parOneway);
        if(cZipline){
            //ZIPLINE SLOPE UPWARD
            for(var i=0; i<5; i++;){
                if(!place_meeting(x+sign(hspd),y+i,zipline)){
                    y+=i;
                    break;
                }
            }
        }else{
            //ZIPLINE SLOPE DOWNWARD
            for(var i=5; i>0; i--;){
                if(!place_meeting(x+sign(hspd),y-i,zipline)){
                    if(place_meeting(x+sign(hspd),y-i-1,zipline)){
                        y-=i;
                        break;
                    }
                }
            }
        }
    }
    /************************/
    //SIDES_SOLID_COLLISIONS//
    /************************/
    if(!place_meeting(x+sign(hspd),y,parSolid)){
        x+=sign(hspd)
    }else{
        hspd=0;
        break;
    }
}

repeat(ceil(abs(vspd))){
    if(place_meeting(x,y+sign(vspd),parSolid))
    ||(place_meeting(x,y+sign(vspd),otherBlock))
    ||(vspd>=0 && !place_meeting(x,y,zipline) && place_meeting(x,y-1,zipline))
    ||(vspd>=0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+sign(vspd),parOneway)){
        vspd=0;
        break;
    }else{
        y+=sign(vspd);
    }
}
[/gml]
[/spoiler]

scrGrounded:
[spoiler]
[gml]
var cGround=(place_meeting(x,y+1,parSolid)
|| place_meeting(x,y-1,parSolid)
|| place_meeting(x,y+1,otherBlock)
|| place_meeting(x-1,y,wallBlock) && onWall
|| place_meeting(x+1,y,wallBlock) && onWall
|| !place_meeting(x,y,zipline) && place_meeting(x,y-1,zipline)
|| vspd>=0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+1,parOneway));
return cGround;
[/gml]
[/spoiler]

EVENTO STEP JUGADOR:
[spoiler]
[gml]
/*
ACTIVAR_ZIPLINE....COMO DIJO SOMNUS COMPROBAMOS SI ESTAMOS EN UN RIEL O ZIPLINE CON UNA BOLEANA YO LA LLAME onZipline
TAMBIEN NOS AYUDARA PARA CONTROLAR LAS ANIMACIONES  DEL PERSONAJE
*/
if(!place_meeting(x,y,zipline) && place_meeting(x,y-1,zipline) && !onZipline){
    onZipline=1;
    }
//COLGADO_EN_UN_ZIPLINE
if(onZipline){
     if(onWall || onCeils || !place_meeting(x,y-1,zipline) || place_meeting(x,y,zipline)){
        onZipline=false;
     }
}
[/gml]
[/spoiler]

15
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...