Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

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: Convertir un valor a su constante "buffer_" correspondiente  (Leído 187 veces)

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

Desconectado kostra

  • Legendario
  • *
  • Puntos: 2475
  • Mensajes: 2.038
  • Agradecido: 89 veces
  • Sexo: Femenino
  • Sé literalmente el sentido de la vida.
    • Ver Perfil
Autor: Kostrón Sabrosón
Versión de GM: Studio 1.4.9999.
Descripción: Metes un valor o variable y te devuelve una constante de esta lista https://i.gyazo.com/814f6cb922f0d1484f1991349c6ae8db.png
evadiendo "buffer_f16" y "buffer_text" que según he leido, GM no los soporta.

script:
///buffer_type(value)

var val = argument[0];

if is_string(val) {
    return buffer_string; //string
    exit;
    }
else if is_bool(val) {
    return buffer_bool; //bool
    exit;
    }
else {
    var str = string(val);
    if string_count(".",str) > 0 {
        if val >= 16777216
        && val < 16777216 {
            return buffer_f32; //f32
            exit;
            }
        else {
            return buffer_f64; //f64
            exit;
            }
        }
    else {
        if val < 0 {
            if val >= -128 {
                return buffer_s8; //s8
                exit;
                }
            else if val >= -32768 {
                return buffer_s16; //s16
                exit;
                }
            else if val >= -2147483648 {
                return buffer_s32; //s32
                exit;
                }
            else {
                return buffer_u64; //u64
                exit;
                }
            }
        else {
            if val <= 127 {
                return buffer_s8; //s8
                exit;
                }
            else if val <= 255 {
                return buffer_u8; //u8
                exit;
                }
            else if val <= 32767 {
                return buffer_s16; //s16
                exit;
                }
            else if val <= 2147483647 {
                return buffer_s32; //s32
                exit;
                }
            else if val <= 4294967295 {
                return buffer_u32; //u32
                exit;
                }
            else {
                return buffer_u64; //u64
                }
            }
        }
    }

ejemplos:
buffer_type(24) te debolverá la constante "buffer_s8"

buffer_type(false) te devolverá la constante "buffer_bool"

var ejemplo = -2345303.23;
buffer_type(ejemplo) te devolverá la constante "buffer_f32"

var global.ejemplo2 = "ola k ase";
buffer_type(global.ejemplo2) te devolverá la constante "buffer_string"


Eso es todo, si alguien que sea más pro que yo se le ocurre una manera mejor sin tener que poner 500 ifs embedidos unos a los otros, es libre de comentarlo y aportar mejoras ;)

"ola k ase clickarme o k ase"
la imagen no se quita xD
 


No Tienes Permisos Para Dar Puntos
point 15 Puntos

Usuarios que puntuaron el tema » Johann (15 Pts) 


Desconectado Johann

  • Las cosas como son!
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 778
  • Mensajes: 888
  • Agradecido: 125 veces
  • Sexo: Masculino
  • First Class Soldier... 10 años en CGM, 5 como mod
    • Ver Perfil
Respuesta #1 en: Noviembre 01, 2019, 08:25:27 pm
No veo forma de rescribirlo debido a la variedad de valores, lo unico que veo es que los exit despues de cada return sobran.

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.
 


Desconectado Kingph195

  • Visitante
  • *
  • Puntos: 2
  • Mensajes: 2
    • Ver Perfil
Respuesta #2 en: Noviembre 05, 2019, 05:10:34 pm
Si lo que te interesa es bajar el numero de IFs lo que debes hacer es poner los valores que vayas a comprobar en un Array.

Y lo único que tienes que hacer es pasar con un bucle for o while la comprobación de cada IF, algo como esto:

valores[0,0] = -128;
valores[0,1] = buffer_s8;

valores[1,0] = -32768;
valores[1,1] = buffer_s16;

for(g = 0; g < array_length_1d(valores); g++){
  if(val >= valores[g,0]){
    return valores[g,1];
 }
}

Al final es cuestión de buscar una solución a tanto if. De esa forma puedes ser todo lo escalable que quieras ser, puedes poner un montón de posibilidades de buffer. Tan sólo lo mapeas en el mismo array en la misma fila de valores.

 


Desconectado kostra

  • Legendario
  • *
  • Puntos: 2475
  • Mensajes: 2.038
  • Agradecido: 89 veces
  • Sexo: Femenino
  • Sé literalmente el sentido de la vida.
    • Ver Perfil
Respuesta #3 en: Noviembre 09, 2019, 06:33:59 pm
@Johann tienes razón, es que me daba un poco de miedo que se ejecutara algo después de un return y lo puse por si acaso, pero si tu dices que no hay problem, pues a tomar nota!!

@Kingph195 No entiendo a qué te refieres, yo no quiero ahorrarme ifs, solo compartí lo que hice y dije que me parece bien al que quiera contribuir a mejorar el script... pero es que tu código no tiene ningún argumento, tampoco acabo de entender lo que haces. Estaría bien si dejaraas un script completo para que entre un valor y retorne una constante "buffer_"

"ola k ase clickarme o k ase"
la imagen no se quita xD