Septiembre 04, 2017, 09:05:41 AM Ultima modificación: Septiembre 05, 2017, 06:15:03 AM por cristopher2545
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
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!


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
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!

#5 Septiembre 05, 2017, 02:05:16 AM Ultima modificación: Septiembre 05, 2017, 02:11:36 AM por 3dgeminis
Tengo otra forma

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:
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!

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)
    }

Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!

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).