Hola a todos!
eh estado trabajando en muchos proyectos últimamente y actualizando el proyecto BEAT EP UP agregue un sistema para que los jugadores escribieran su nombre para que durante todo el juego pudieran ver su nombre u apodo en la partida hasta las puntuaciones del final pero siento que hacerlo con el keyboard_string es muy soso ya que básicamente lo hago a la clásica con este código en esto
if string_length(keyboard_string) > 15
{
keyboard_string = string_copy(keyboard_string,1,15)
}
draw_text(x,y,keyboard_string +"|")
if keyboard_check_pressed(vk_enter)
{
room_goto_next()
nombre=keyboard_string
}
básicamente guardo el nombre que el jugador escribe con el teclado en la variable nombre y al darle nombre esta se dibuja en todo el juego
eh estado practicando para hacer menus interactivos de esos que funcionan con las flechas y con esos cursores que reaccionan al movimiento y me ah resultado genial pero mi duda entra en como hago para que al seleccionar una "letra" en el menub imaginario tenga las mismas funciones como si las presionara en el teclado de verdad ya saben borrar teclas espacio
y con teclado arcade me refiero a ese teclado que estaba en las maquinitas
QWERTYUIP
ASDFGHJJK
ZXCVBNM END <
y con las flechas de la arcade ibas seleccionando cada letra a tu antojo tengo una cierta idea de como se hace pero cuando la probe realmente no funciono no la pondré porque es muy tonta y hasta da pena ponerla...
agradesco sus respuestas de corazon ya que han sido de mucha ayuda desde que llegue aqui <3
https://marketplace.yoyogames.com/assets/1680/keyboard-freedom
Se me ocurre así de primeras crear un script que cree el objeto letra por columnas y filas y les añades la variable letra, x_grid e y_grid; y luego creas un grid donde le das el valor de las letras
SCR_CREATE_LETRAS
var teclado="abcdefghijklmnñopqrstuvwxyz"
var pos_teclado=1
xx=donde quieres que empiece en x
yy=donde quieres que empiece en y
for(i=0;i<n_columnas;i++){
for(j=0;j<n_filas;j++){
ins=instance_create(xx,yy,obj_letras)
ins.letra=string_char_at(teclado,pos_teclado)//esto seria para el image_index
ins.x_grid=i//esto seria
ins.y_grid=j//para la posición de la letra y saber si esta encima la flecha para remarcar esa letra de alguna forma si quieres
ds_grid_add(grid,i,j,string_char_at(teclado,pos_teclado))//añades el valor al grid
pos_teclado++
yy+=lo que quieras de separación en y
}
x+=lo que quieras de separación en x
yy=el valor original
}
Luego en un obj_control haces el movimiento de la flecha teniendo en cuenta la longitud del grid y con el enter sabiendo donde esta la posición de la flecha en el grid añades la letra al nombre
PD:lo de la posición de las letras lo tienes que organizar como te guste yo he puesto siguien el alfabeto
///Event Create
var letras1, letras2, letras3;
letras1 = ds_list_create();
ds_list_add( letras1, "Q" );
ds_list_add( letras1, "W" );
ds_list_add( letras1, "E" );
ds_list_add( letras1, "R" );
ds_list_add( letras1, "T" );
ds_list_add( letras1, "Y" );
ds_list_add( letras1, "U" );
ds_list_add( letras1, "I" );
ds_list_add( letras1, "O" );
ds_list_add( letras1, "P" );
ds_list_add( letras1, "<" );
letras2 = ds_list_create();
ds_list_add( letras2, "A" );
ds_list_add( letras2, "S" );
ds_list_add( letras2, "D" );
ds_list_add( letras2, "F" );
ds_list_add( letras2, "G" );
ds_list_add( letras2, "H" );
ds_list_add( letras2, "J" );
ds_list_add( letras2, "K" );
ds_list_add( letras2, "L" );
//ds_list_add( letras2, "Ñ" );
letras3 = ds_list_create();
ds_list_add( letras3, "Z" );
ds_list_add( letras3, "X" );
ds_list_add( letras3, "C" );
ds_list_add( letras3, "V" );
ds_list_add( letras3, "B" );
ds_list_add( letras3, "N" );
ds_list_add( letras3, "M" );
lista = ds_list_create();
ds_list_add( lista, letras1 );
ds_list_add( lista, letras2 );
ds_list_add( lista, letras3 );
SelectX = 0;
SelectY = 0;
///Event Step
if (keyboard_check_pressed(vk_enter)){
global.nombre = string_replace_all( string_copy(string_upper(keyboard_string),1,15), " ", "" );
room_goto_next();
break;
}
if (keyboard_check_pressed(vk_down)){
SelectY+=1;
}
if (keyboard_check_pressed(vk_up)){
SelectY-=1;
}
if ( SelectY >= ds_list_size( lista ) ) { SelectY = 0; }
if ( SelectY < 0 ) { SelectY = ds_list_size( lista )-1; }
var L;
L = ds_list_find_value(lista, SelectY); //lista[| SelectY];
if (keyboard_check_pressed(vk_right)){
SelectX+=1;
}
if (keyboard_check_pressed(vk_left)){
SelectX-=1;
}
var LX;
//LX = ds_list_find_value( L, SelectX);
if ( SelectX >= ds_list_size( L ) ) { SelectX = 0; }
if ( SelectX < 0 ) { SelectX = ds_list_size( L )-1; }
LX = ds_list_find_value( L, SelectX);
if (keyboard_check_pressed( vk_space )){
switch( LX ){
case "<":
keyboard_string = string_copy( keyboard_string, 1, max(0, string_length(keyboard_string)-2) );
break;
default: keyboard_string += LX;
}
}
///Event Draw
var i,j;
for(i=0; i<ds_list_size(lista); i+=1){
L = ds_list_find_value( lista, i );
for(j=0; j<ds_list_size(L); j+=1){
T = ds_list_find_value( L, j );
if (SelectX==j && SelectY==i){draw_set_color( c_red );}else{draw_set_color( c_black );}
draw_set_halign(1);
draw_set_valign(1);
draw_text(32 + (16*j), 100 + (16*i), T);
}
}
if (string_length(keyboard_string) > 15) { keyboard_string = string_copy(keyboard_string,1,15); }
keyboard_string = string_replace_all( string_upper(keyboard_string), " ", "" );
draw_set_color( c_green );
draw_set_halign(0);
draw_set_valign(0);
draw_text( 32,32,keyboard_string);
funciona bastante bien colega te felicito <3 aunque por alguna razón el espacio no funciona y puedo escribir aun con el teclado jaja fuera de eso funciona excelente colega unos puntos jugare con el código para ver que consigo
Tengo otra forma
(http://i.imgur.com/H1hNbMb.png) (https://imgur.com/H1hNbMb)
CREATE
[gml]
txt="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
longitud=string_length(txt)
letra=0
nombre=""
[/gml]
STEP
[gml]
if keyboard_check_pressed(vk_right) {letra+=1}
if keyboard_check_pressed(vk_left) {letra-=1}
if keyboard_check_pressed(vk_down) {letra+=10}
if keyboard_check_pressed(vk_up) {letra-=10}
if letra>longitud-1 {letra=0}
if letra<0 {letra=longitud-1}
if keyboard_check_pressed(vk_enter)
{
if string_length(nombre)<6 {nombre+=string_char_at(txt, letra+1)}
}
if keyboard_check_pressed(vk_backspace)
{
nombre=string_delete(nombre, string_length(nombre), 1)
}
[/gml]
DRAW
[gml]
draw_sprite(spr_sel, 0, x+(letra mod 10)*40, y+(letra div 10)*40)
for(i=0; i<longitud; i+=1)
{
draw_set_halign(fa_center)
draw_set_valign(fa_middle)
draw_text(x+(i mod 10)*40, y+(i div 10)*40, string_char_at(txt, i+1))
}
draw_set_halign(fa_left)
draw_set_valign(fa_top)
draw_text(x, y+200, "Nombre: "+string(nombre))
[/gml]
Debes crear un sprite de 40x40, actua como cursor y muestra que caracter se esta seleccionando
te comía la polla tan fuerte que te la arrancaba de llegue! pero como esto es PG 13 diré que esta bonito pero ya hablando enserio era justo lo que yo necesitaba colega modifique el codigo y le añadi el espacio y estoy tratando de quitar la tecla de borar y añadírsela en el mismo teclado pero se me resiste aun asi te lo agradesco mucho colega siempre me sacas de apuros :love: :love: :love:
por cierto @3dgeminis y atodo quien use el codigo si quieren que todo se controle con un joystick o con las teclas especificas del teclado dibujen la variable letra y depende del resultado hagan lo siguiente...
en el evento create en esta zona
txt="ABCDEFGHIJKLMNOPQRSTUVWXYZ "
agreguen 2 espacios vacíos para que el cursor los reconozca y dibujando la variable sabran el valor que le asignaran que por defecto es el 26 y 27... bien añadiremos la tecla de borrar el espacio y una tecla extra para ir a otro cuarto
simplemente deben agregar el código así
if letra=26 && keyboard_check_pressed(vk_enter)
{
if string_length(global.nombre)<10 {global.nombre+=string_char_at(txt, letra+1)}
}
if letra=27 && keyboard_check_pressed(vk_enter)
{
global.nombre=string_delete(global.nombre, string_length(global.nombre), 1)
audio_play_sound(sound0,10,false)
}
es nesesario que para que el borrado funcione pongan este pedazo de codigo en esta parte
if keyboard_check_pressed(vk_enter) && letra!=27 /// este pedazo para que puedan borrar
{
if string_length(global.nombre)<10 {global.nombre+=string_char_at(txt, letra+1)}
audio_play_sound(sound0,10,false)
}
Me olvide de algo, podes usar un sprite en lugar de texto para mostrar las letras y numeros (cada imagene seria una letra o numero).