Creo que es posible con argumentos, pero o se hacerlo ni donde colocarlo.

¿Cuál es tu nivel de GML? Porque lo que te voy a escribir a continuación te puede parecer chino xD

Lo primero es desechar por completo detectar las teclas directamente. En su lugar, debes tener variables que almacenen el valor de las constantes que equivalen a cada tecla. Comencemos con un esquema de control de 4 botones y flechas direccionales. Definamos las siguientes variables en el evento Create del objeto de control que vayas a usar en tu juego:

global.dpad[0] = vk_left;
global.dpad[1] = vk_right;
global.dpad[2] = vk_up;
global.dpad[3] = vk_down;
global.button[0] = ord("Z");
global.button[1] = ord("X");
global.button[2] = ord("C");
global.button[3] = vk_enter;


Teniendo definidas las variables y su valor, ahora podemos guardar el valor de la tecla que queramos cambiar en algún lado :D

Para cambiar el valor de una tecla, te recomiendo llamar a un script que consista en lo siguiente:

var last_key;
last_key = 0;
io_clear();
while ((last_key == 0))
{
io_handle();
if (keyboard_key != 0)
{
last_key = keyboard_key;
}
}
global.button[argument0] = last_key;


Donde argument0 corresponde al botón que quieres cambiar dentro del array global.button.
De antemano, te digo que esto va a pausar el juego hasta que el jugador presione una tecla. Para crear un tiempo de respuesta entre que el jugador elija cambiar la tecla y finalmente la presione podrías utilizar una alarm, y para crear una tecla para que el jugador elija no cambiar la tecla basta con programar una excepción, que indique que si el jugador presiona cierta tecla el ciclo while se rompa sin cambiar el valor de la variable last_key.

Ojalá te haya sido de ayuda :D me avisas si necesitas esto en un ejemplo.

el ejemplo seria excelente amigo gracias apenas entiendo lo que dices

Acá va el ejemplo :)

La mayoría de los cambios en el código (como global.font, el screen_refresh() y el screen_redraw(), la variable keychange y cosas así) son meramente cambios estéticos, y sirven para mostrar en pantalla el texto :)

Ojalá te sirva.

Excelete gracias hombre entonces debo añadir una variable global para cada tecla?

Al menos para cada tecla que quieras utilizar dentro del juego, sí. Necesitas guardar el valor de alguna forma y utilizar éstas variables en la interacción jugador-juego en lugar de las constantes predefinidas o referencias directas a los keycodes.

Personalmente me parece mucho más limpio utilizar un array para las teclas direccionales y otro para el resto de las teclas, pero en realidad puedes hacerlo utilizando sólo un array, o una estructura de datos como un mapa o una lista, pero lo cierto es que necesitas guardarlas en algún lado.

Si te interesa cómo hacerlo en una estructura de datos, te puedo hacer un ejemplo :D la gracia de las estructuras de datos es que como existen funciones nativas para convertirlas en un string, guardarlas y cargarlas desde archivos externos no es para nada difícil, haciendo que programar el guardado de la configuración sea sencillo :)

Si maestro, iluminame con tus conocimientos que noo entendi mucho de lo que dijiste, de verdad lamento tanta molestia pero estoy seguro que un dia estuviste igual gracias por ayudarme, agradeceria muucho si me ayudaras

Perdon calio por responder a la pregunta pero aprovecho ahora que fatalfury está conectado para explicarle y que no espere demasiado.

Veras fatalfury sí necesitas una variable global para cada tecla, pero calio te recomienda usar arrays. Los arrays son como varias variables pero que se distinguen por usar números. Por ejemplo.

[gml]
//quieres almacenar 5 nombres pero en lugar de usar 5 variables usas un array con 5 slots.
nombre[0]="Juan";
nombre[1]="Pepe";
nombre[3]="Oswaldo"
//De esté modo cuando quieras por ejemplo dibujar el nombre de pepe lo haces de este modo.
draw_text(0,0, nombre[1]);
//no parecen de mucha utilidad de esté modo pero en realidad son MUY utiles.
[/gml]

Okey aquí calio te dice que uses un array para almacenar las flechas de direcciones y otro para almacenar las demás teclas. Ejemplo.

[gml]
//para las direcciones
tDir[0]=vk_left;
tDir[1]=vk_right;
tDir[2]=vk_up;
tDir[3]=vk_down;
//para cualquier otra tecla
tecla[0]=ord("z");
tecla[1]=ord("x");
[/gml]
Entonces en el evento step o el que necesites usas algo como estó.
[gml]
//Tecla de movimiento a la izquierda.
if keyboard_check(tDir[0]){
     x-=3;
}
//Tecla de movimiento a la Derecha.
if keyboard_check(tDir[1]){
     x+=3;

}
//Tecla de movimiento asía arriba.
if keyboard_check(tDir[2]){
     y-=3;
}

//Tecla de movimiento asía abajo.
if keyboard_check(tDir[3]){
     y+=3;
}

if keyboard_check(tecla[0]){
     //Codigo de ataque o lo que quieras
}
if keyboard_check(tecla[1]){
     //Codigo de salto o lo que quieras
}
[/gml]

entonces calio en su ejemplo te proporciona un script te proporciona un script que se llama set_key y lo usas de esté modo cuando quieras cambiar de teclas por las preferidas por el usuario.

[gml]
//para las direcciones
tDir[0]=set_key();
tDir[1]=set_key();
tDir[2]=set_key();
tDir[3]=set_key();
//para cualquier otra tecla
tecla[0]=set_key();
tecla[1]=set_key();
[/gml]
Y listo de ese modo todas las teclas serán las preferidas por el usuario.

Edit: Perdon Calio justo acabo de ver que te conectaste y es que me lleve un rato contestando el mensaje...

No te preocupes, estoy muerto de sueño y apenas puedo contarme los dedos de una mano. Explicarle a alguien el uso de arrays sería una brutalidad y probablemente sólo acabe sembrando caos xD y tampoco es que yo sea el único que por derecho puede contestar dudas, no por nada esto es una comunidad ;) en tu posición hubiese hecho lo mismo.

Es una muy buena explicación, y es verdad que al principio pueden parecer una tontería, porque para qué usar un array que sea boton[0] y boton[1] si puedo hacer dos variables que se llamen boton1 y boton2. Sin embargo, un array es una sola variable almacenando distintos valores en diferentes espacios, como si fuese una cajonera de variables, por lo que además de ser código mucho más ordenado te permite hacer cosas como:

for (n = 0; n < 100; n += 1)
{
array[n] = n*n;
}

Sin arrays, tendrías que hacer esto:

variable1 = 0;
variable2 = 1;
variable3 = 4;
variable4 = 9;
variable5 = 16;
...
variable97 = 9216;
variable98 = 9409;
variable99 = 9604;
variable100 = 9801;

Cien líneas de código aburrido y lineal frente a cuatro líneas de un ciclo sencillo que hace exactamente lo mismo :D

¿Por qué estaba hablando de esto? Ah, sí. Teclas.

Imaginate quieres hacer una opción que te haga elegir consecutivamente nuevas teclas para cada botón en tu juego. Sin arrays tendrías que escribir muchas líneas de código para hacer referencia a cada variable por separado, sin embargo si usas un array sencillamente puedes hacer un ciclo for que haga esto por ti.

for (n = 0; n < 4; n += 1)
{
mensaje = string("Presiona una nueva tecla para el botón ") + string(n + 1);
keyboard_wait();
set_key(n);
}
//y luego en draw
draw_text(0,0,mensaje);


Por cierto... la única corrección que haría a la magistral explicación de brunoxzx es que el script set_key() no devuelve ningún valor, por lo que hacer que usarlo así

tDir[1]=set_key();

va a dejar las variables vacías. O quizás tire un error, no se. Es script se utiliza sencillamente llamándolo y pasándole como argumento el índice (el numerito que va entre corchetes) del array al que la tecla corresponde. Me pareció que era más sencillo hacerlo así, aunque hacer que devuelva un valor en lugar de definir el valor dentro del script mismo lo hace más dinámico, a decir verdad... Quizás lo reformule y lo ponga en el foro de Scripts :D si lo hago, te doy los agradecimientos correspondientes, brunoxzx. Pero primero debería dormir.

muchachos, no puedo negar que me han sacado de las dudas mas fuertes que tenia (que ahora pensandolo eran respuestas sencillas jeje)alcanzo a entender lo que me quieren decir de verdad de verdad muchas gracias de verdad gracias intentare hacer lo que pueda. muchachos no se como agradecerles, y si me surge otra duda disculpenme si?

Cita de: calio en Enero 16, 2013, 06:41:43 PM
va a dejar las variables vacías. O quizás tire un error, no se. Es script se utiliza sencillamente llamándolo y pasándole como argumento el índice (el numerito que va entre corchetes) del array al que la tecla corresponde. Me pareció que era más sencillo hacerlo así, aunque hacer que devuelva un valor en lugar de definir el valor dentro del script mismo lo hace más dinámico, a decir verdad... Quizás lo reformule y lo ponga en el foro de Scripts :D si lo hago, te doy los agradecimientos correspondientes, brunoxzx. Pero primero debería dormir.
Agradecimientos correspondientes? de que hablas? yo solo lo hice así por que creí que lo habías hecho de ese modo, te lo digo enserio no me des agradecimiento alguno el script es tuyo.


Cita de: fatalfury en Enero 16, 2013, 07:31:30 PMy si me surge otra duda disculpenme si?
No te preocupes tener dudas es algo humano y este foro es para contestarlas no importa que tan ridículamente largas o extrañas sean siempre y cuando vallan relacionadas con gm o la comunidad aunque claro siempre puedes usar el buscador o google antes de hacer tu pregunta.

Muchachos esta excelente muchas gracias pero me estrelle con un problema seguro muy tonto pero entiendanme muchachos...

pero ya tengo programado el personaje con ciertos controles, con eventos de key pressed y keyboard pero me encontre con la duda...

como hago para cambiar lo que ya tengo programado a lo que el jugador quiere elegir, y funcione igual debo eliminar los eventos del teclado pero como los reemplazo...

y...
como pedirle al usuario que escoja las teclas, que seria otro tema si es necesario lo preguntare en el foro pero por si acaso matamos dos pajaros de un tiro

que pena con ustedes muchachos de verdad me gusta bastante esto de programar gracias