Noticias

¡Ayuda a la Comunidad GM, haz una donación!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Archivos Ini // Nombre Variables // Bucle For  (Leído 270 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Alfacoy

en: Diciembre 18, 2018, 09:31:56 pm
Hola compañeros del GML :D !! Hacia un tiempo que no preguntaba.

Aprendí algunas cosas nuevas desde la última vez que anduve por acá y entre ellas el uso de los archivos Ini.

Ahora quiero poder hacer más personalizados mis "high scores" usando este archivo de guardado.

Tengo 2 preguntas, aunque para ambas tengo una solucion. Me gustaria saber su opinion de ser posible.


A)  Los archivos Ini, recorrer todos sus datos desde un for es imposible verdad?


- La solucion que encontre al no saber cómo recorrerlo y no tener muchas puntuaciones (de momento), fue la siguiente:

1) Tomar el nombre y puntuación del jugador actual y guardarlas en variables.
2) Abrir el archivo INI.
3) Leer la información (Nombre y puntuación) del score del jugador TOP1,TOP2 y TOP3, para guardarlas en variables. (Nom_0,Pun_0,Nom_1,Pun_1,Nom_2,Pun_2);
4) Cerrar el archivo INI.
5) Crear un array bidimensional y asignarle a cada espacio las variables creadas en el paso 3.
EJ:
Score[0,0] = Nom_0;
Score[0,1] = Pun_0;
ETC...

6) Creo un bucle For para revisar la puntuación guardada en score[] y comparo si la puntuación del jugador actual (Paso 1) es mayor a algunas de las existentes. 
7) De ser mayor la puntuación, dependiendo el valor de la iteración del bucle for  se buscará las variables del paso 3 y se reemplazan por las del jugador actual.

Este último paso es el que me da problemas jaja y es mi segunda pregunta:

B) Hay posibilidades de pinchar una variable según el valor de i en la iteración del bucle?


En este caso que les expongo, score[i,1] tiene el 1 fijo ya que en ese punto están guardadas las puntuaciones y en el i se moverá por los distintos jugadores.

Código: [Seleccionar]
for ( var i = 0 ; i < 3 ; i ++ ){
if ( score[i,1] < puntuacion_actual){
 nom_i = nombre_actual;
 pun_i = puntuacion_actual;
}
}

Me gustaría poder modificar las variables nom_1 y pun_1 por ejemplo, si el valor de i es 1.

Nose si me di a entender bien, si no es asi disculpenme y haganmelo saber.

------------------------------------------------------------------------------------------------

Luego de todo esto realizo algun orden para el array con sort() si es que existe en GML y guardo las estadisticas en el archivo ini para luego mostrarlas en la tabla de clasificaciones.

Todo esto de momento es muy comodo ya que son solo 3 jugadores, pero al momento de ser 10, 20 o 100 seguro es un martirio jaja .. ademas es una practica, pero la idea es desarrollar un buen pseudocodigo y codigo para luego utilizarlo en los juegos.



Ustedes de que manera hacen las puntuaciones?

Saludos hermanos de codigo!

===========
EDITO
===========

Tengo pensado usar un switch(i) para editar la variable que corresponda en la pregunta B. Me olvide dar mi posible solucion jaja. Saludos!



Quiero agregar que mi intencion de armar este tipo de guardado, no solamente es para tener en un archivo la puntuacion y nombre de los personajes.  La idea es guardar tiempos, objetos usados, veces muerto, etc. Y con el metodo de guardado de puntuaciones que game maker nos ofrece me quedo corto.

« última modificación: Diciembre 19, 2018, 03:22:42 am por Alfacoy »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Alfacoy

Respuesta #1 en: Diciembre 19, 2018, 12:45:24 am
Si alguno pudiera borrar el tema se lo agredeceria ya que ami no me deja.

Me parece muy confuso lo propuesto, y estoy tratando de llevarlo a codigo pero me esta quedando mal ajaja.

Tendre que reescribir todo :( ...

De ultima tirenme ideas de como ustedes hacen sus sistemas de puntuaciones. :D se los agradeceria. Perdon el repost.


EDITO =


OHHHH

Funciono JAJA

Medio toscto aun.. pero funciono :D

Código: [Seleccionar]
if ( key_esc ) {

global.nombre_jugador =  get_string("Nombre de Usuario","");
nombre_actual = global.nombre_jugador;
puntuacion_actual = global.puntuacion;

ini_open("score.ini");

nom_0 = ini_read_string("score","n_top_0","Anonimo");
pun_0 = ini_read_real("score","p_top_0",0);
nom_1 = ini_read_string("score","n_top_1","Anonimo");
pun_1 = ini_read_real("score","p_top_1",0);
nom_2 = ini_read_string("score","n_top_2","Anonimo");
pun_2 = ini_read_real("score","p_top_2",0);

top3 = [];
top3[0,0] = nom_0;
top3[0,1] = pun_0;
top3[1,0] = nom_1;
top3[1,1] = pun_1;
top3[2,0] = nom_2;
top3[2,1] = pun_2;

for ( var i = 0 ; i < 3 ; i++ ) {

if ( top3[i,1] < puntuacion_actual ) {
switch(i){
case 0:
ini_write_string("score","n_top_0",nombre_actual);
ini_write_real("score","p_top_0",puntuacion_actual);
ini_close();
room_goto(Room_Scores);
exit;
break;

case 1:
ini_write_string("score","n_top_1",nombre_actual);
ini_write_real("score","p_top_1",puntuacion_actual);
ini_close();
room_goto(Room_Scores);
exit;
break;

case 2:
ini_write_string("score","n_top_2",nombre_actual);
ini_write_real("score","p_top_2",puntuacion_actual);
ini_close();
room_goto(Room_Scores);
exit;
break;
}
}
}
}



Es mas... creo que hacer un array bidimensional es demasiado ... puede que sirva solamente un array unidimensional.


Lo comparto denuevo mejor redactado y ya borre los sobrantes.


Código: [Seleccionar]
//Tomo los datos del usuario y los coloco en variables.
global.nombre_jugador =  get_string("Nombre de Usuario","");
nombre_actual = global.nombre_jugador;
puntuacion_actual = global.puntuacion;

//Abro el archivo para guardar las puntuaciones
ini_open("score.ini");

//Asigno las variables para que guarden los datos del TOP3 de Score.
pun_0 = ini_read_real("score","p_top_0",0);
pun_1 = ini_read_real("score","p_top_1",0);
pun_2 = ini_read_real("score","p_top_2",0);

//Las guardo en un array para poder compararlas.
top3 = [];
top3[0] = pun_0;
top3[1] = pun_1;
top3[2] = pun_2;

//Creo un bucle FOR para recorrer el array de puntuaciones TOP3
for ( var i = 0 ; i < array_length_1d(top3) ; i++ ) {

//Si la puntuacion es mayor que la posicion del TOP seleccionada por el iterador, la modifico.
//Rescribo los valores en la posicion correspondiente.
//Cierro el archivo INI, lo envio a la sala de Scores.
//Salgo del bucle para que no siga sobrescribiendo.
if ( top3[i] < puntuacion_actual ) {
switch(i){
case 0:
ini_write_string("score","n_top_0",nombre_actual);
ini_write_real("score","p_top_0",puntuacion_actual);
ini_close();
room_goto(Room_Scores);
exit;
break;

case 1:
ini_write_string("score","n_top_1",nombre_actual);
ini_write_real("score","p_top_1",puntuacion_actual);
ini_close();
room_goto(Room_Scores);
exit;
break;

case 2:
ini_write_string("score","n_top_2",nombre_actual);
ini_write_real("score","p_top_2",puntuacion_actual);
ini_close();
room_goto(Room_Scores);
exit;
break;
}else {
//Por si el resultado es mas bajo que el bajo.
room_goto(Room_Scores);
}
}
}
}


Ustedes como arman la tabla de puntajes?
« última modificación: Diciembre 19, 2018, 01:33:26 am por Alfacoy »

 


Desconectado Johann

  • Las cosas como son!
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 753
  • Mensajes: 862
  • Agradecido: 117 veces
  • Sexo: Masculino
  • First Class Soldier... 10 años en CGM, 5 como mod
    • Ver Perfil
Respuesta #2 en: Diciembre 19, 2018, 02:41:44 am
No tienes que hacer un switch ni borrar el post (megapost XD)

Con el indice del ciclo construyes el nombre de la variable con la que vas a  almacenar el valor en el archivo ini:

Utiliza la etiqueta para gml:
Código: [Seleccionar]
[gml][/gml]
ini_open("score.ini");
for (var i=0; i<array_length_1d(top3); i++) {
    ini_write_string("score","n_top_"+string(i), nombre_actual);
    ini_write_real("score","p_top_"+string(i), puntuacion_actual);
}
ini_close();

si vas a utilizar los valores del array, que sería la idea, o entoces no se para que lo usas XD
ini_open("score.ini");
for (var i=0; i<array_length_1d(top3); i++) {
    ini_write_string("score","n_top_"+string(i), top3[i,0]);
    ini_write_real("score","p_top_"+string(i), top3[i,1]);
}
ini_close();

Para leer los valores del archivo y llenar el array lo haces al contrario, o mejor en reversa
ini_open("score.ini");
for (var i=0; i<array_length_1d(top3); i++) {
    top3[i,0] = ini_read_string("score","n_top_"+string(i), "");
    top3[i,1] = ini_read_real("score","p_top_"+string(i), 0);
}
ini_close();

Cita de: Fenris78
Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: Calio
Somos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.
 
Los siguientes usuarios dieron las gracias a este tema: Alfacoy


Desconectado Alfacoy

Respuesta #3 en: Diciembre 19, 2018, 02:52:51 am
Hermoso punto de vista!

Muchisimas gracias jajaja ..

Ya que no sabia hacerlo de una forma busque hacerlo de otra forma con el switch :D 


Voy a ir modificando las cosas :) Justo estaba haciendo los controles para cuando el usuario ingrese el nombre no mande mas de 10 caracteres y que no tenga caracteres extraños.

Voy a repasar lo que me mandaste. Muy amable.

=======
EDITO
=======

Sabes que trate de poner como me dijiste pero me salta este error


Trying to read from undefined INI file
at gml_Object_obj_reiniciar_juego_clasico_Step_0 (line 47) -                      ini_write_string("score","n_top_"+string(i),nombre_actual);


    //Creo un bucle FOR para recorrer el array de puntuaciones TOP3
    for ( var i = 0 ; i < array_length_1d(top3) ; i++ ) {
       
        //Si la puntuacion es mayor que la posicion del TOP seleccionada por el iterador, la modifico.
        //Rescribo los valores en la posicion correspondiente.
        //Cierro el archivo INI, lo envio a la sala de Scores.
        //Salgo del bucle para que no siga sobrescribiendo.
        if ( top3[i] < puntuacion_actual ) {
            ini_write_string("score","n_top_"+string(i),nombre_actual);
            ini_write_real("score","p_top_"+string(i),puntuacion_actual);
            ini_close();
            room_goto(Room_Scores);
            exit;
        } else {
            //Por si el resultado es mas bajo que el bajo.
            ini_close();
            room_goto(Room_Scores);
        }
    }


El archivo ini esta abierto y bien escrito.

¿Que podria ser?

« última modificación: Diciembre 19, 2018, 03:26:37 am por Alfacoy »