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
[gml]
//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) //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 { //Si lo escrito es igual al truco
switch (cheats)
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"
}
}
}
}
[/gml]
Después de resumirlo queda mas lindo pero mas dificil de entender, esto es lo mismo que lo que escribí antes
[gml]
//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)+1,string_length(cheats))=cheats { //Obtener lo último escrito y compararlo con el truco
switch (cheats)
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"
}
}
}
}
[/gml]
Luego lo que falta es escribir en los case, ahí pones lo que queres que se ejecute cuando se escribió el truco
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 :-*
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
Tienes que usar execute_string, es decir, puedes encontrar otra forma de hacerlo sin esa funcion? tiene muy mala fama de ser lenta.
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:
Cita de: Maitreya 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.
Supongo que podrías replazar la dicha linea:
[GML] execute_string('scr_cheat_'+cheats
+'()') //Ejecutar un script[/GML]
por:
[GML]script_execute(i);[/GML]
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.
Cita de: Silver_light 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:
Cita de: Maitreya 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.
Supongo que podrías replazar la dicha linea:
[GML] execute_string('scr_cheat_'+cheats+'()') //Ejecutar un script[/GML]
por:
[GML]script_execute(i);[/GML]
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:
[gml]
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
) //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 { //Si lo escrito es igual al truco
switch (cheats)
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+'()') //Ejecutar un script
}
}
}
[/gml]
¿Que les parece si lo cambio por eso?
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 (http://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
Cita de: Silver_light 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 (http://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
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:
Citarmediccomedicomedicomedico
El script entiende:
Citarmedicc
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.
Cita de: Fenris78 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:
Citarmediccomedicomedicomedico
El script entiende:
Citarmedicc
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:
[gml]
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í)
[/gml]
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?.
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
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
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
No uses tus poderes de administracion para limpiar las huellas en la base de datos de la comunidad! XD
¡PSST! a callar, que te banneo. XD
Yo uso algo diferente pero es efectivo y es
if(file_exists(keyboard_string)){
execute_file(keyboard_string);
global.var1="ejecutado";
}
else
{global.var1="noexiste"}
keyboard_string="";
:)
se ejecuta en un evento realse key enter ejecuta archivos de texto plano inclui un ejemplo de archivo en el gmk
Nota:solo escribe el nombre del cheat(es el mismo que el nombre del archivo) y presiona enter
Edito:
y en step
if(string_length(keyboard_string)=20){keyboard_string=""}
esto para evitar que la cadena sea infinita 8)
Me gusta la idea, no se me había ocurrido ejecutar código desde un archivo, pero el problema es que se necesita apretar Enter. Un hibrido de los dos engines estaria bueno :P
no de hecho esta bien por que si no nunca salfria el cheat osea como carajo sabras en el string que escribio un cheat XDDD XD XD
Mmmh, no se si entendi bien a lo que te referis.
El script sabe que escribiste un codigo porque esta chequeando constantemente (siempre) si se ha terminado de escribir un cheat, se da cuenta porque mira la ultima parte de keyboard_string
Como chequea siempre no hace falta apretar enter. Como mira la ultima parte de keyboard_string no hace falta borrarlo
Saludos :D