Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Practicando máxima compatibilidad  (Leído 404 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dixon

  • Habitual
  • *
  • Puntos: 107
  • Mensajes: 56
  • Agradecido: 6 veces
  • Juegos de educación gratis dixon 2019. Prov. 4:7
    • Ver Perfil
en: Noviembre 02, 2019, 02:08:10 am
Hola, gusto en saludarles.

Me encuentro desarrollando código con la máxima compatibilidad posible para todas las versiones del game maker, desde la versión 1.1 del año 1999 hasta la actual studio 2 y estos son los resultados:

El codigo de las figuras geometicas presentaba error en game maker studio pero fue corregido.

Si se coloca este código en un evento draw, se va a dibujar el siguiente personaje.
Código: [Seleccionar]
{

///simulando evento create dentro de un evento draw con variable score.

if(!score)
{
version=0
mousex=0
mousey=0

//background_color=c_black
font_color=c_green
//font_name="Courier New"
font_name="Arial"
font_size=12
pen_color=c_red
screen_width=480
screen_height=384



score=1
}
///evento draw
score+=1
if(score=3 && mousex=0)version=1

if(version)
{
mousex=mouse_x
mousey=mouse_y
}


//evento draw
dy=0

texto=mousex
draw_text(0,dy,texto)
dy+=12

texto=mousey
draw_text(0,dy,texto)
dy+=12

///dibujo
manx=mouse_x
many=mouse_y
//cabeza
draw_line(manx,many,manx+30,many)
draw_line(manx+30,many,manx+30,many+30)
draw_line(manx+30,many+30,manx,many+30)
draw_line(manx,many+30,manx,many)
///ojos y boca
draw_text(manx,many," 0 0")
draw_text(manx,many+14,"   -")
///tronco
draw_line(manx+15,many+30,manx+15,many+60)
draw_line(manx+15,many+60,manx+10,many+90)///pies isquierdo
draw_line(manx+15,many+60,manx+25,many+90)//pies derecho
draw_line(manx+15,many+40,manx+30,many+60)//brazo irquierdo
draw_line(manx+15,many+40,manx+5,many+60)//brazo derecho
}



Si se coloca este código en el evento draw, se crea una nave y un  control parqa moverla y disparar.
Código: [Seleccionar]
{

///simulando evento create dentro de un evento draw con variable score.

if(!score)
{
version=0
mousex=0
mousey=0

//background_color=c_black
font_color=c_green
//font_name="Courier New"
font_name="Arial"
font_size=12
pen_color=c_red
screen_width=480
screen_height=384

//nave
nx=100
ny=100
nv=5
disparo=0
bax=0
bay=0

score=1
}
///evento draw
score+=1
if(score=50 && mousex=0)version=1

if(version)
{
mousex=mouse_x
mousey=mouse_y
}


//evento draw
dy=0

texto=mousex
draw_text(0,dy,texto)
dy+=12

texto=mousey
draw_text(0,dy,texto)
dy+=12

texto=disparo
draw_text(0,dy,texto)
dy+=12

texto=nx
draw_text(0,dy,texto)
dy+=12

texto=ny
draw_text(0,dy,texto)
dy+=12

blx=10
bly=250
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){nx-=nv}

blx=130
bly=250
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){nx+=nv}

blx=70
bly=190
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){ny-=nv}

blx=70
bly=310
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){ny+=nv}

//boton central
blx=70
bly=250
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){if(!disparo){disparo=1;bax=nx;bay=ny}}

/////////////para disparar
if(disparo)
{
draw_text(bax,bay,"  0");
bay-=10
if(bay<0)disparo=0
}

////////limites de movimiento nave
if(nx<0)nx=0
if(nx>460)nx=460
if(ny>330)ny=330
if(ny<0)ny=0

draw_text(nx,ny,"  /\")
draw_text(nx,ny+12,"  ||")
draw_text(nx,ny+24," /||\")
draw_text(nx,ny+36," ---")
   
}


Formas geometricas: Este código nos muestra cómo se pueden dibujar las figuras geométricas básicas cumpliendo las regla de la geometría.
corregido
Código: [Seleccionar]
{

///simulando evento create dentro de un evento draw con variable score.

if(!score)
{
//background_color=c_black
font_color=c_green
pen_color=c_red
screen_width=480
screen_height=384
score=1
version="nueva"
mousex=0
mousey=0

///nave
ny=100
nx=100
nv=5

//circulo
//cr: radio
//crd: radio deformacion
//cd: direcsion
//ca: circulo angulos internos
cx=250
cy=150
cr=100
crd=0
cd=90
cdm=0
ca=45
p1x=0
p1y=0

}

///evento draw
score+=1
if(score<50 && !mousex=0)version="vieja"

if(score>50)
{
if(version="nueva")
{
mousex=mouse_x
mousey=mouse_y
}

}
else
{
draw_text(100,100,"Presione aquí para evitar errores en versiones viejas")
}

//evento draw
dy=0

texto="Radio: "+string(cr)
draw_text(0,dy,texto)
dy+=12

texto="Angulo: "+string(cdm)
draw_text(0,dy,texto)
dy+=12

texto="Angulo interno: "+string(ca)
draw_text(0,dy,texto)
dy+=12

blx=10
bly=250
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){cdm+=5;if(cdm>360)cdm-=360}

blx=130
bly=250
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){cdm-=5;if(cdm<0)cdm+=360}

blx=70
bly=190
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){cr+=5;if(cr>300)cr=300;}

blx=70
bly=310
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){cr-=5;if(cr<5)cr=5}

//boton central
blx=70
bly=250
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)

blx=200
bly=310
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){ca+=5;if(ca>360)ca=360}

blx=260
bly=310
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){ca-=5;if(ca<5)ca=5}

blx=400
bly=10
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
draw_text(blx+5,bly+15,"Trianulo")
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){cdm=330;ca=120;cr=100}

blx=400
bly=70
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
draw_text(blx+2,bly+15,"Cuadrado")
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){cdm=45;ca=90;cr=100}

blx=400
bly=130
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
draw_text(blx+2,bly+15,"Rombo")
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){cdm=30;ca=60;cr=100}

blx=400
bly=190
draw_line(blx,bly,blx,bly+50)
draw_line(blx,bly,blx+50,bly)
draw_line(blx+50,bly,blx+50,bly+50)
draw_line(blx,bly+50,blx+50,bly+50)
draw_text(blx+2,bly+15,"Circulo")
if(mousex>blx && mousex<blx+50 && mousey>bly && mousey<bly+50){ca=5;cr=100}

i=0
repeat(360/ca)
{
i+=ca
cd=i+cdm
p1x=floor((cx+(cr)*cos(cd*pi/180)));
p1y=floor((cy-(cr)*sin(cd*pi/180)));
p2x=floor((cx+(cr)*cos((cd+ca)*pi/180)));
p2y=floor((cy-(cr)*sin((cd+ca)*pi/180)));
draw_line(p1x,p1y,p2x,p2y);                                                                                                                                   
}


}

//triangulo
//angulo interno: 120
//angulo: 333

//cuadrado
//angulo interno: 90
//angulo: 45

//rombo
//angulo interno: 60
//angulo: 30

//circulo
//angulo interno: 5


Los objetivos a alcanzar a corto plazo son los siguientes:

1. Crear un sistema de colisiones independiente sin uso de mascaras, para comprender el principio de colisión.
2. Crear un sistema 3d básico independiente para todas las versiones, inclusive para las que no cuentan con funciones 3d.
3. Crear un ejemplo de plataforma esferica con gravedad 360 empleando el sistema de colisiones independiente el cual no toma en cuenta las máscaras.
4. Crear juegos codificados que no necesiten ser descargados: agrupar todo en un solo codigo que pueda ser pegado en un evento draw.
5. Multi plataforma: el juego codificado debe contar con la capacidad de ser exportados a cualquier plataforma sin requerir modificación alguna.
6. Crear juegos fusionables: lograr crear una herramienta que me permita fusionar dos juegos codificados para crear un tercero.
7. Multi desarrollo: crear un pequeño motor de desarrollo que me permita programar lo básico del Gmk en entornos cómo Android, linux, Mac, ipad, etc...
8. Multi motor: crear un programa básico que me permita transformar el código de Gmk en código para otros motores de desarrollo como unity, cryengine, godot, etc...

 Más detalles sobre la compatibilidad:

1. Game maker 1.1 no cuenta con draw_text() por lo tanto será descartada.
2. Game maker 1.4 si cuenta con draw_text()
3. El ancho de la room compatible para todas las versiones es 480x384 pixeles. Los pixeles finales no podrán observarse por lo tanto debe trabajarse en 479x383


4.Aunque las versiones anteriones a la 4 no usan mouse_x, se pueden adaptar.
5. Todas las versiones usan el draw_line(x,y,x2,y2)
6. Todas las versiones cuentan con la variable score


El siguiente código es compatible con todas las versiones desde la vieja 1.4 del año 2000 hasta la actual studio 2. Debe ser colocado en un evento draw. Este código solo fue creado para contemplar un poco de la compatibilidad existente en todas las versiones, si ejecutamos en cualquier version podremos ver como el mousex se adapta a todas las versiones. Hay que tener en cuenta que aunque una variable predeterminada del sistema como background_color o font_color, no se encuentren en todas las versiones, esto no quiere decir que vallan a generar errores, pues se convierten en variables declaradas.

Código: [Seleccionar]
{

///simulando evento create dentro de un evento draw con variable score.

if(!score)
{
background_color=c_black
font_color=c_green
screen_width=480
screen_height=384
score=1
version="nueva"
mousex=0
mousey=0
}

///evento draw
score+=1
if(score<100 && !mousex=0)version="vieja"

if(score>100)
{
if(version="nueva")
{
mousex=mouse_x
mousey=mouse_y
}
}
else
{
draw_text(100,100,"Presione aquí para evitar errores en versiones viejas")
}

//evento draw
dy=0

texto=version
draw_text(0,dy,texto)
dy+=12

texto=mousex
draw_text(0,dy,texto)
dy+=12

texto=mousey
draw_text(0,dy,texto)
dy+=12

}

La intención no es solo que el código sea compatible, sino que el código debe contener todo los recursos del juegos. De esta forma, para adquirir el juego no es necesario que se descargue la aplicación, solo se copia el código y se pega en un evento draw y listo. Para lograr esto he recurrido al ACII ART.

|\-----/|
| o_o |
 \_^_/

      \        /\
        )     (  =')*
       (     /    )
         \(___)|

     |\___/,|          (`\
     |_ _     |.----------.) )
    ( T       )            /
 (((  ^_    (((  / (((_/

__
.---'----`-.__
'-O-----O---'

__
.---'----`-.__
'-O-----O---'

       __!__
_____(_)_____
       !  !  !

             -----|-----
*>=====[_]L)
                -'-`-




El código final que se pretende obtener, en teoría será compatible para todas las versiones del Gmk y prodrá ser exportado para las distintas plataformas sin necesidad de modificación alguna. Entre estas plataformas se encuentra android. Hay que entender que para programar para pantallas táctiles no es indispensable crear los controles táctiles o teclas virtuales en objetos gui en game maker studio, pues con entender que la posición del dedo en la pantalla es la posición del ratón eso es suficiente.

Por ahora necesito entender el origen de los arrays, porque al no poder utilizarlos en versiones viejas tendré que imitarlos y creo que eso es posible con condiciones if, por que al parecer un array es el resultado de un conjunto de if.

Agradecería cualquier idea.

Aqui voy colocando las variables y funciones que son compatibles para todas las versiones:

1. x
2. y
3. score
4. draw_text(xpos,ypos,string)
5. draw_line(x,y,x2,y2)
6. random(n)

Aquí voy agregando algunos recursos:

Página web para descargar todas las versiones del gmk sin infringir ninguna ley.
gamemaker.cc
« última modificación: Noviembre 19, 2019, 05:56:31 pm por dixon »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Silver_light

Respuesta #1 en: Noviembre 02, 2019, 01:09:18 pm
Me parece una idea interesante sin embargo, me pregunto porqué alguien querría que un código portable a versiones tan viejas?
A no ser que esté programando en una PC de los 90, no creo que fuera conveniente XD


Los arrays no están formados por ifs. Son espacios de memoria adyacentes, que agrupan un tipo de dato homogéneo.(Al menos los arrays estáticos de toda la vida.)
Aún así puedes, simular un array utilizando ifs.

La forma en que se me ocurre, es declarar cierto número de variables que funcionen como índices. A saber:
espacio1 = 0;
espacio2 = 0;
espacio3 = 0;
espacio4 = 0;
espacio5 = 0;
Dónde se puede apreciar claramente la limitación más grande, que sería un fixed array. O un vector de tamaño fijado. Desconozco si existe en GM1
alguna función para crear variables en tiempo de ejecución. Así ,asumiré que no la hay.

Una vez declarada nuestra lista de variables, podrías crear un script que tome como parámetro el índice de la posición y retorne/escriba el valor:
scr_getVector( index);
var i = argument[0];
if (i<0 || i >5) exit; //estaría bien colocar un cartel de aviso al usuario

if (i==1)
    return espacio1;
if (i==2)
    return espacio2
if (i==3)
    return espacio3
if (i==4)
    return espacio4
if (i==5)
    return espacio5;
Y para guardar valores dentro del array:
scr_setVector( index , value );
var i = argument[0];

if (i<0 || i>5) exit;
if (i==1)
    espacio1 = value;
if (i==2)
    espacio2 = value;
if (i==3)
    espacio3 = value;
if (i==4)
    espacio4 = value;
if (i==5)
    espacio5 = value;
 

 
Los siguientes usuarios dieron las gracias a este tema: dixon