Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: kostra en Noviembre 01, 2019, 09:42:53 AM

Título: Convertir un valor a su constante "buffer_" correspondiente
Publicado por: kostra en Noviembre 01, 2019, 09:42:53 AM
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:
[gml]///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
                }
            }
        }
    }[/gml]

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 ;)
Título: Re:Convertir un valor a su constante "buffer_" correspondiente
Publicado por: Johann 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.
Título: Re:Convertir un valor a su constante "buffer_" correspondiente
Publicado por: Kingph195 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:

[gml]
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];
}
}[/gml]

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.
Título: Re:Convertir un valor a su constante "buffer_" correspondiente
Publicado por: kostra 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_"