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: Sistema de trucos o cheats [Programación]  (Leído 4721 veces)

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

Desconectado Mgbu

  • Okupa
  • *
  • Puntos: 548
  • Mensajes: 817
  • Sexo: Masculino
  • Hola! (?)
    • Ver Perfil
en: Septiembre 25, 2012, 09:24:31 pm
Como vi que lo preguntaron bastante pero no hay un engine en esta sección hice uno bien simple:

Nombre del creador
Yo, Mgbu

Breve descripción de la función
Es un código que se fija continuamente si has escrito alguna de las palabras clave para ejecutar un código, en ese código podés darle más vida al jugador, darle municiones, puntos o lo que sea

Versión de GM utilizada
GM 8.0

Código de la función

Es un objeto que se fija continuamente si has escrito un truco para el juego.. Chequea cada vez que apretas una tecla desde la A a la Z, buscando si acabas de escribir el truco. Así que no hace falta apretar enter, abrir un cuadro de texto ni nada. Apenas uno termina de escribir la clave se ejecuta lo que uno quiere

Este es el código, esto va en un objeto obj_cheats (o como quieras llamarlo). Tiene que estar cuando lo necesitas, así que es bueno ponerlo en la primera room y hacerlo persistente. Pero cuidado que no se duplique!
Esto va en el evento Key Press>Any Key
//Seteamos los trucos, esto puede ir en create/////
cantcheats=3  //Cantidad de trucos               //
cheats[0]='medico'                               //
cheats[1]='rambo'                                //
cheats[2]='piratas'                              //
///////////////////////////////////////////////////

if keyboard_lastkey>=ord('A') and keyboard_lastkey<=ord('Z') { //Si la tecla apretada es una letra
    for (i=0;i<cantcheats;i+=1) { //Probar con cada truco
        largo=string_length(cheats[i]) //largo = largo del truco
        largoescrito=string_length(keyboard_string) //largoescrito = largo de keyboard_string
        escrito=string_copy(keyboard_string,largoescrito-largo+1,largo) //escrito = ultimos caracteres de keyboard_string (si el truco mide 6 se fija los ultimos 6, si el truco mide 5 se fija los ultimos 5 y así)
        if escrito=cheats[i] { //Si lo escrito es igual al truco
            switch (cheats[i])
            case medico: {
                //Codigo a ejecutar si se escribio "medico"
            }
            case rambo: {
                //Codigo a ejecutar si es "rambo"
            }
            case piratas: {
                //Codigo a ejecutar si es "piratas"
            }
        }
    }
}

Después de resumirlo queda mas lindo pero mas dificil de entender, esto es lo mismo que lo que escribí antes
//Seteamos los trucos, esto puede ir en create/////
cantcheats=3  //Cantidad de trucos               //
cheats[0]='medico'                               //
cheats[1]='rambo'                                //
cheats[2]='piratas'                              //
///////////////////////////////////////////////////

if keyboard_lastkey>=ord('A') and keyboard_lastkey<=ord('Z') { //Si la tecla apretada es una letra
    for (i=0;i<cantcheats;i+=1) { //Probar con cada truco
        if string_copy(keyboard_string,string_length(keyboard_string)-string_length(cheats[i])+1,string_length(cheats[i]))=cheats[i] { //Obtener lo último escrito y compararlo con el truco
            switch (cheats[i])
            case medico: {
                //Codigo a ejecutar si se escribio "medico"
            }
            case rambo: {
                //Codigo a ejecutar si es "rambo"
            }
            case piratas: {
                //Codigo a ejecutar si es "piratas"
            }
        }
    }
}

Luego lo que falta es escribir en los case, ahí pones lo que queres que se ejecute cuando se escribió el truco
« última modificación: Septiembre 26, 2012, 11:37:48 pm por Mgbu »

El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy

 


No Tienes Permisos Para Dar Puntos
point 23 Puntos

Usuarios que puntuaron el tema » shaoran (1 Pts) » Marron121 (3 Pts) » Silver_light (5 Pts) » Fenris78 (5 Pts) » Johann (5 Pts) » rogerskate (4 Pts) 


Desconectado Marron121

  • Adicto
  • *
  • Puntos: 564
  • Mensajes: 357
  • Sexo: Masculino
    • Ver Perfil
Respuesta #1 en: Septiembre 25, 2012, 10:25:40 pm
Podrías hacer uno para hacer Trofeos o logros? Me muero de ilusión por probarlo :D
Hablando del engine,esta muy bien explicado,y es bastante sencillo,me encanta  :-*

Jugador de muchos juegos y creador de algunos ;)
¿Buscas un guionista? Haz click aquí
 


Desconectado Mgbu

  • Okupa
  • *
  • Puntos: 548
  • Mensajes: 817
  • Sexo: Masculino
  • Hola! (?)
    • Ver Perfil
Respuesta #2 en: Septiembre 25, 2012, 10:30:57 pm
Para los trofeos o logros no creo que haga falta hacer nada. En el evento en donde ganas el logro haces que ganes el logro y listo XD
Podés guardar en un ini que logros ganaste y cuáles no para mostrarlos después

Gracias por pasar ;D

El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy

 


Desconectado Johann

  • Las cosas como son!
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 804
  • Mensajes: 919
  • Agradecido: 136 veces
  • Sexo: Masculino
  • First Class Soldier... 10 años en CGM, 5 como mod
    • Ver Perfil
Respuesta #3 en: Septiembre 26, 2012, 02:09:32 am
Tienes que usar execute_string, es decir, puedes encontrar otra forma de hacerlo sin esa funcion? tiene muy mala fama de ser lenta.

Cita de: Fenris78
Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: Calio
Somos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.
 


Desconectado Silver_light

Respuesta #4 en: Septiembre 26, 2012, 02:41:44 am
Hola Mgbu, tu Script es interesante, nunca había intentado ejecutar un script de esa forma, es más... ni siquiera sabía que se podía XD
 Vaya...

Mirando el comentario de Maitreya:
Tienes que usar execute_string, es decir, puedes encontrar otra forma de hacerlo sin esa funcion? tiene muy mala fama de ser lenta.
Supongo que podrías replazar la dicha linea:
 execute_string('scr_cheat_'+cheats[i]+'()') //Ejecutar un script
por:
script_execute(i);
puesto que la conicidencia se logra en el elemento i, verdad?

EDIT: De hecho, lo he comprobado y solo funcionaría si los indices de los scripts fueran creados en orden.
« última modificación: Septiembre 26, 2012, 02:56:19 am por Silver_light »

 


Desconectado Mgbu

  • Okupa
  • *
  • Puntos: 548
  • Mensajes: 817
  • Sexo: Masculino
  • Hola! (?)
    • Ver Perfil
Respuesta #5 en: Septiembre 26, 2012, 05:25:51 pm
Hola Mgbu, tu Script es interesante, nunca había intentado ejecutar un script de esa forma, es más... ni siquiera sabía que se podía XD
 Vaya...

Mirando el comentario de Maitreya:
Tienes que usar execute_string, es decir, puedes encontrar otra forma de hacerlo sin esa funcion? tiene muy mala fama de ser lenta.
Supongo que podrías replazar la dicha linea:
 execute_string('scr_cheat_'+cheats[i]+'()') //Ejecutar un script
por:
script_execute(i);
puesto que la conicidencia se logra en el elemento i, verdad?

EDIT: De hecho, lo he comprobado y solo funcionaría si los indices de los scripts fueran creados en orden.
Uuy, no sabia que era lenta, justo esa función (execute_string) me encanta porque hace de todo XD

Se puede reemplazar por un switch, algo así como:
if keyboard_lastkey>=ord('A') and keyboard_lastkey<=ord('Z') { //Si la tecla apretada es una letra
    for (i=0;i<cantcheats;i+=1) { //Probar con cada truco
        largo=string_length(cheats[i]) //largo = largo del truco
        largoescrito=string_length(keyboard_string) //largoescrito = largo de keyboard_string
        escrito=string_copy(keyboard_string,largoescrito-largo+1,largo) //escrito = ultimos caracteres de keyboard_string (si el truco mide 6 se fija los ultimos 6, si el truco mide 5 se fija los ultimos 5 y así)
        if escrito=cheats[i] { //Si lo escrito es igual al truco
            switch (cheats[i])
            case medico: {
                //Codigo a ejecutar si se escribio "medico"
            }
            case rambo: {
                //Codigo a ejecutar si es "rambo"
            }
            case piratas: {
                //Codigo a ejecutar si es "piratas"
            }
            execute_string('scr_cheat_'+cheats[i]+'()') //Ejecutar un script
        }
    }
}
¿Que les parece si lo cambio por eso?

El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy

 


Desconectado Silver_light

Respuesta #6 en: Septiembre 26, 2012, 10:44:25 pm
Acerca de la funcion maligna(?
Cito: (Lease en inglés)
Citar
They make execution of your game slower. When Game Maker starts, it converts all scripted GML into a byte-coded representation, by verifying the syntax, checking the parameters and converting them into something that GM can execute much faster. Your game runs faster because this first step of interpretation of your programming takes place the start of the executable, and not while it is actually running the game. But execute_string() and execute_file() always apply this parsing during the game, when these commands are called. This can introduce a performance drop in your game, especially when used in continuously (step, draw) and semi-continuously (key, collision) triggered events.
Lo he sacado de:www.gmc.yoyogames.com/index.php?showtopic=322492
 
 Viendo que es una funcion sumamente lenta, suponiendo para juegos más complejos, utilizar Switch no está mal, sin embargo sería engorroso, pero de todas formas no creo que afecte el rendimiento como lo haría execute_string, a menos que tengas miles de Cheat's XD
 P/D: por cierto, agregaste nuevamente execute_string() debajo de todo el Switch

 


Desconectado Mgbu

  • Okupa
  • *
  • Puntos: 548
  • Mensajes: 817
  • Sexo: Masculino
  • Hola! (?)
    • Ver Perfil
Respuesta #7 en: Septiembre 26, 2012, 11:33:42 pm
Acerca de la funcion maligna(?
Cito: (Lease en inglés)
Citar
They make execution of your game slower. When Game Maker starts, it converts all scripted GML into a byte-coded representation, by verifying the syntax, checking the parameters and converting them into something that GM can execute much faster. Your game runs faster because this first step of interpretation of your programming takes place the start of the executable, and not while it is actually running the game. But execute_string() and execute_file() always apply this parsing during the game, when these commands are called. This can introduce a performance drop in your game, especially when used in continuously (step, draw) and semi-continuously (key, collision) triggered events.
Lo he sacado de:www.gmc.yoyogames.com/index.php?showtopic=322492
 
 Viendo que es una funcion sumamente lenta, suponiendo para juegos más complejos, utilizar Switch no está mal, sin embargo sería engorroso, pero de todas formas no creo que afecte el rendimiento como lo haría execute_string, a menos que tengas miles de Cheat's XD
 P/D: por cierto, agregaste nuevamente execute_string() debajo de todo el Switch
Esta bien, lo voy a cambiar, va a ser mejor, total no complica nada
Dejé el execute_string abajo... porque me olvide de sacarlo XD

El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy

 


Desconectado Fenris78

Respuesta #8 en: Septiembre 27, 2012, 01:51:12 pm
Me gusta el script, es muy ingenioso.

Es sencillo, util y muy facil de implementar. Enhorabuena.

Si he entendido bien como funciona (estoy un poco oxidado ultimamente), hay una cosa que no me termina de gustar y es que por lo que veo, hace un chequeo constante de la entrada de teclado sin comprobar cuanto tiempo pasa entre pulsaciones. Si uno se confunde escribiendo, o pulsa una tecla de mas, el script termina por no saber cuando el usuario a vuelto a intentar meter un cheat.

Si escribo:

Citar
mediccomedicomedicomedico

El script entiende:

Citar
medicc
omedic
omedic

y te puedes llevar todo el tiempo que quieras escribiendolo que no lo vas a conseguir nunca.

podrias solucionar el problema añadiendo un testeo tras pulsar la ultima tecla del codigo correcto mas largo. Si no coincide, limpias el array y comienzas de cero. Tambien puedes hacer lo mismo si pasan mas de x segundos entre pulsaciones, ya que se entiende que el usuario esta iniciando otro intento. De esta forma tambien ahorras espacio en el array y velocidad de proceso. Tal y como esta diseñado ahora mismo, el array continua creciendo indefinidamente con cada entrada de teclado.
« última modificación: Septiembre 27, 2012, 02:11:36 pm por Fenris78 »

 


Desconectado Mgbu

  • Okupa
  • *
  • Puntos: 548
  • Mensajes: 817
  • Sexo: Masculino
  • Hola! (?)
    • Ver Perfil
Respuesta #9 en: Septiembre 27, 2012, 07:18:38 pm
Me gusta el script, es muy ingenioso.

Es sencillo, util y muy facil de implementar. Enhorabuena.

Si he entendido bien como funciona (estoy un poco oxidado ultimamente), hay una cosa que no me termina de gustar y es que por lo que veo, hace un chequeo constante de la entrada de teclado sin comprobar cuanto tiempo pasa entre pulsaciones. Si uno se confunde escribiendo, o pulsa una tecla de mas, el script termina por no saber cuando el usuario a vuelto a intentar meter un cheat.

Si escribo:

Citar
mediccomedicomedicomedico

El script entiende:

Citar
medicc
omedic
omedic

y te puedes llevar todo el tiempo que quieras escribiendolo que no lo vas a conseguir nunca.

podrias solucionar el problema añadiendo un testeo tras pulsar la ultima tecla del codigo correcto mas largo. Si no coincide, limpias el array y comienzas de cero. Tambien puedes hacer lo mismo si pasan mas de x segundos entre pulsaciones, ya que se entiende que el usuario esta iniciando otro intento. De esta forma tambien ahorras espacio en el array y velocidad de proceso. Tal y como esta diseñado ahora mismo, el array continua creciendo indefinidamente con cada entrada de teclado.
Gracias por las felicitaciones, dan ganas de hacer más scripts :D

Lo del error no pasa, porque se fija los ultimos 6 caracteres del keyboard_string, no los multiplos de 6 (si el truco mide 6 caracteres). Fijate en esta parte del código:
escrito=string_copy(keyboard_string,largoescrito-largo+1,largo) //escrito = ultimos caracteres de keyboard_string (si el truco mide 6 se fija los ultimos 6, si el truco mide 5 se fija los ultimos 5 y así)

El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy

 


Desconectado Fenris78

Respuesta #10 en: Septiembre 28, 2012, 01:48:21 am
Mmmm... pues tienes razon, no se yo en que estaria pensando. XD

De todas formas si que seria buena cosa que limpiar el array pasado un tiempo entre pulsaciones, porque si no va a seguir creciendo indefinidamente con cada entrada de teclado, ¿no?.



Desconectado Mgbu

  • Okupa
  • *
  • Puntos: 548
  • Mensajes: 817
  • Sexo: Masculino
  • Hola! (?)
    • Ver Perfil
Respuesta #11 en: Septiembre 28, 2012, 02:33:27 am
Me estas confundiendo :P
El unico array que encontre es cheats[], ese array solamente tiene a los trucos. Lo que uno teclea se guarda en keyboard_string, que solo guarda los ultimos 1024 caracteres

El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy

 


Desconectado Texic

  • Moderadores globales
  • Legendario
  • *
  • Puntos: 1213
  • Mensajes: 2.158
  • Agradecido: 3 veces
  • Sexo: Masculino
  • I Have The Fire!
    • Ver Perfil
Respuesta #12 en: Septiembre 28, 2012, 05:25:55 pm
1024 es el máximo de la variable keyboard_string por defecto, el string del código sólo agarra los últimos X caracteres (donde X es el largo del string de código que se está verificando). Y no hay intervalo entre intentos, el keyboard_string agarra todas las teclas que toques. Lobo, no sé exactamente qué habrás tomado, pero definitivamente está afectando tu sistema cognitivo XD




 


Desconectado Fenris78

Respuesta #13 en: Septiembre 28, 2012, 05:34:57 pm
Bufff...

Que palo, me acabo de dar cuenta de que esa lista (keyboard_string) no se puede limpiar. Y yo pensando "que desperdicio de memoria, si solo quiero seis caracteres ¿acaso se infla hasta el infinito?"

Esto nunca ha ocurrido, vosotros no estabais aqui y esto esta escrito con tinta invisible. XD

« última modificación: Septiembre 28, 2012, 05:37:19 pm por Fenris78 »

 


Desconectado Mgbu

  • Okupa
  • *
  • Puntos: 548
  • Mensajes: 817
  • Sexo: Masculino
  • Hola! (?)
    • Ver Perfil
Respuesta #14 en: Septiembre 28, 2012, 06:48:14 pm
No uses tus poderes de administracion para limpiar las huellas en la base de datos de la comunidad! XD

El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy