Septiembre 12, 2018, 03:03:58 AM Ultima modificación: Noviembre 13, 2018, 01:36:48 AM por Johann
En la pantalla de inicio, que se pueda ingresar un nombre, y al final que muestre tu nombre y puntaje, lo mismo
para otros que ingresen sus nombres y les salgan sus puntajes.
Y que muestre los 3 mayores (si es posible), si son con vectores bastara con el metodo de la burbuja.
Hay algun ejemplo de eso?

Hola shadowmanuel

Para recibir el nombre puedes usar la vieja confiable "get_string()" de Game Maker.
global.nombre = ""
while (global.nombre = "") { global.nombre = get_string("Ingresa tu nombre aqui","") }

Eso almacenará el texto que digitaste en la variable "global.nombre".
La indiqué como global para que la variable pueda pasar de room en room sin necesidad de estar alojada en un objeto persistente.
Si no quieres algo tan cutre, puedes crearte tu propio código. Este es uno que yo hice una vez en uno de mis proyectos y lo simplifiqué para adaptarlo a tus necesidades, utiliza el "keyboard_string" para detectar el input de teclado:

Tienes que crear un objeto nuevo, ponerle este código y colocar el objeto en la room en la coordenada donde quieres que se dibuje el rectángulo (esquina superior izquierda)

CREATE EVENT
txt = ""
selected = false

//Crea la barra de texto para escribir (la b_ es de barra)
b_x1 = x
b_y1 = y
b_x2 = x+320
b_y2 = y+32

//Crea el botón para pulsar OK (la o_ es de ok)
o_x1 = x+128
o_y1 = y+48
o_x2 = x+192
o_y2 = y+80


STEP EVENT
if mouse_check_button_pressed(mb_left) {
//Activa el campo de texto si pulsaste en la barra para escribir
if point_in_rectangle(mouse_x,mouse_y,b_x1,b_y1,b_x2,b_y2) {
keyboard_string = txt
selected = true //Lo activa para poder escribir
}
//Detecta que hayas clickeado en el botón OK, guarda el nombre que pusiste en la variable "global.nombre"
else if point_in_rectangle(mouse_x,mouse_y,o_x1,o_y1,o_x2,o_y2) {
if txt != "" {
global.nombre = txt //Guarda tu nombre
room_goto_next() //Avanza a la siguiente room

}
}
//Si pulsas fuera del rectángulo te quita la selección
else { selected = false }
}

//Permite escribir si has seleccionado el texto
if selected {
if string_width(keyboard_string) < (b_x2-b_x1-16) { txt = keyboard_string } //Si aún tienes espacio para escribir, añade el texto
else { keyboard_string = txt } //Si no queda espacio, no te deja escribir más
}


DRAW EVENT
//Dibuja los botones para escribir y el de OK
draw_set_colour(c_white); draw_button(b_x1,b_y1,b_x2,b_y2,!selected) //Recuadro del nombre
draw_set_colour(c_dkgray); draw_button(o_x1,o_y1,o_x2,o_y2,!selected) //Recuadro boton OK
//Dibuja el texto Negro si estás escribiendo o Gris si ya no.
if selected { draw_set_colour(c_black) }
//Dibuja un texto estandar si no hay nada
else { draw_set_colour(c_gray); if txt = "" draw_text(b_x1+8,b_y1+8,"Escribe tu nombre aqui...") }
if txt != "" draw_text(b_x1+8,b_y1+8,txt)
//Dibuja el texto del boton "OK"
draw_set_colour(c_black); draw_text(o_x1+8,o_y1+8,"OK")


Para guarda el puntaje más alto es otra historia. Lo que recomiendo es usar Grids. Si quieres que el juego tenga "memoria de los scores anteriores" y te muestre "los puntajes más altos" de la gente que ha jugado antes tu juego, puedes guardar la grid en un archivo de texto mediante la función "ds_grid_write".
Acá va un ejemplo (el código puede ir en el create event de algún objeto que controle los puntos):
//Esto crea una grid de 2x3 (para permitir 3 registros del par: nombre-puntos)
grid = ds_grid_create(2,3)
ds_grid_set_region(grid,0,0,0,ds_grid_height(grid)-1,"") //Llena la columna 0 (donde deberían ir los nombres) con ""
ds_grid_set_region(grid,1,0,1,ds_grid_height(grid)-1,0) //Llena la columna 1 (donde van los puntos) con 0
var file = file_text_open_read("best_scores.txt") //Abre el archivo "best_scores.txt"
if (file != -1) { //Revisa que exista el archivo
var str = file_text_read_string(file) //Lee la grid (como string) desde el archivo abierto
grid = ds_grid_read(grid,str) //Transforma la grid de String a Grid.
file_text_close(file) //Cierra el archivo
}


Cuando tengas que guardar tu score (puedes ser quizás en el evento de destrucción del player o en un game end, no sé)
Puedes usar un código similar a este, donde he usado la variable "puntos" como los puntos que has ganado durante la partida:
//Lee tu grid
var empty = false //Una variable local que permite encontrar un espacio en la grid
for (var i=0; i<ds_grid_height(grid); i+=1) { //Hace un loop por toda la grid
if ds_grid_get(grid,0,i) = "" { //Si encuentra un espacio vacio
ds_grid_set(grid,0,i,global.nombre) //Coloca el nombre
ds_grid_set(grid,1,i,puntos) //Coloca los puntos
empty = true //Dice que si encontré un espacio vacio
ds_grid_sort(grid,1,false) //Te ordena la grid por puntos
break //Termina el loop para que no se sigan ejecutando los pasos que faltan
}
}
if empty = false { //En caso que no haya encontrado un espacio vacío
if puntos > ds_grid_get(grid,1,ds_grid_height(grid)-1) { //Revisa si los puntos que sacaste ahora son mayores que el último registro de la grid
ds_grid_set(grid,0,i,global.nombre) //Si es así, asigna tu nombre
ds_grid_set(grid,1,i,puntos) //Y tus puntos
ds_grid_sort(grid,1,false) //Te ordena la grid de nuevo por puntos
}
}

var file = file_text_open_write("best_scores.txt") //Abre el archivo de texto
var str = ds_grid_write(grid) //Crea una copia de la grid como "string".
file_text_write_string(file,str) //Borra el contenido del archivo y guarda la "string" ahí.
file_text_close(file) //Cierra el archivo


La próxima vez que inicies el juego, te cargará la grid que previamente guardó.

Nota1: En ambos códigos de Grid he usado variables de objeto, eso significa que para que ambos códigos de Grid funcionen, deben leer las variables del mismo objeto.

Nota2: Las grid son un recurso dinámico de Game Maker, así que debes eliminarlos cuando ya no sean necesarios utilizando ds_grid_destroy(grid_id). Sino puedes llegar a saturar el cache en constantes reinicios del juego.

El código de grids no lo he probado, así que si tienes algún problema, lo comentas y vemos cómo ayudar.

Saludos