Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* Sponsor

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

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - kostra

Páginas: 1 2 3 ... 9
1
Desarrollo de Scripts / jsln (el json para las ds_list ^^)
« en: Abril 16, 2022, 10:20:31 pm »
Nombre del creador: Kostrón Sobakón
Breve descripción de su función: Nunca te ha pasado que quieres transformar en string una ds_list, pero el json solo sirve para ds_maps?, te da pereza tener que ingeniartelas cómo hacerlo? para qué, si ya lo hice yo por ti!! c:
Versión GM utilizada: GMS2.. pero meh, seguro sirve para todos o casi todos los GM
Modo de uso:
En el encoder, como argumento hay que poner una ds_list y devuelve un json (un ds_map transformado en string)
En el decoder, como argumento hay que poner un json (string que representa un ds_map... obviamente un json sacado de un jsln_encoder, si no no sirve!!!)
CódigoS (son 2, el encoder y el decoder):
#region jsln encode
    function jsln_encode(_ds_list) {
        var _list = ds_list_create();
        ds_list_copy(_list,_ds_list);
        var _map = ds_map_create();
            ds_map_add_list(_map,"list",_list );
            var _json = json_encode(_map);
        ds_map_destroy(_map);
           
        return _json;
    }
#endregion
#region jsln decode
    function jsln_decode(_json) {
        var _map = json_decode(_json);
            var _ds_list = ds_list_create();
            ds_list_copy(_ds_list,_map[? "list"]);
        ds_map_destroy(_map);

        return _ds_list;
    }
#endregion

Adaptaciones a los antiguos scripts...
///jsln_encode(ds_list)
var _list = ds_list_create();
ds_list_copy(_list,argument[0]);
var _map = ds_map_create();
    ds_map_add_list(_map,"list",_list );
    var _json = json_encode(_map);
ds_map_destroy(_map);
           
return _json;
///jsln_decode(json)
var _json = argument[0];
var _map = json_decode(_json);
    var _ds_list = ds_list_create();
    ds_list_copy(_ds_list,_map[? "list"]);
ds_map_destroy(_map);

return _ds_list;

Cualquier duda, pss pregunten

2
Desarrollo de Scripts / mega64 (easy encriptado de strings)
« en: Abril 16, 2022, 10:09:32 pm »
NOTA IMPORTANTE!!! No se flipen con el tamaño de la password (no es necesario) pk peta con stack overflow!! (me acabo de dar cuenta xd)

Nombre del creador: Kostrón Sobakón
Breve descripción de su función: Encripta una string con apariencia de base64 pero cuando alguien trate de decodificarlo verá que no conseguirá nada aunque lo decodifique varias veces en cadena, pues pa eso está la "password" c:
Versión GM utilizada: GMS2.. pero meh, seguro sirve para todos o casi todos los GM
CódigoS (son 2, el encoder y el decoder):
#region mega64_encode
    function mega64_encode(_string,_password) {
        var _str = _string;
        for (var i = 0; i < string_length(_password); ++i) {
            _str = string_char_at(_password,i+1)+base64_encode(_str);
        }
        db(_str)
        return _str;
    }
#endregion
#region mega64_decode
    function mega64_decode(_mega64_string,_password) {
        var _str = _mega64_string;
        var _reversed_pass = "";
        for (var i = 0; i < string_length(_password); ++i) {
            _reversed_pass += string_char_at(_str,0);
            _str = string_copy( _str,2,string_length(_str)-1 );
            _str = base64_decode(_str);
        }
           
        var _pass = "";
        for (var i = 0; i < string_length(_reversed_pass); ++i) {
            _pass += string_char_at( _reversed_pass,string_length(_reversed_pass)-i );
        }
           
        if (_password == _pass) { return _str; }
        else { return false; }
    }
#endregion

Adaptaciones a los antiguos scripts...
///mega64_encode(string,password)

var _string = argument[0];
var _password = argument[1];
var _str = _string;
for (var i = 0; i < string_length(_password); ++i) {
    _str = string_char_at(_password,i+1)+base64_encode(_str);
}
db(_str)
return _str;
///mega64_decode(mega64_string,password)

var _mega64_string = argument[0];
var _password = argument[1];
var _str = _mega64_string;
var _reversed_pass = "";
for (var i = 0; i < string_length(_password); ++i) {
    _reversed_pass += string_char_at(_str,0);
    _str = string_copy( _str,2,string_length(_str)-1 );
    _str = base64_decode(_str);
}
           
var _pass = "";
for (var i = 0; i < string_length(_reversed_pass); ++i) {
    _pass += string_char_at( _reversed_pass,string_length(_reversed_pass)-i );
}
           
if (_password == _pass) { return _str; }
else { return false; }

Supongo que no hace falta explicar su uso a detalle... se usa igual que el base64 pero con una pasword que tú te inventes.. poniendo siempre la misma que uses al encriptar.. para desencriptar, que si no la lías parda!! D:
Sé que se podría aprovechar mejor la pass, pero lo hice rápido, si alguna vez lo actualizo avisaré. Se aceptan sugerencias (otra cosa es que haga caso xD)

3
Buenakas! ando haciendo un plagio genérico de maincra, tengo ya 170 items programados, mecánicas sofisticadas, crafteos, construcción etc... muy muy avanzado. Y actualmente empecé a hacer pruebas para la generación de un mapa muy muy grande. El tamaño que he considerado para la room principal de la superficie, la cual trato de generar un terreno pseudo-aleatorio de tierra y más alante poner bordes de arena simulando playas, es de exactamente 12800x12800px, usando una view de 640x352px

Como la interacción con esta tierra base, es mínima y la puedo detectar de muchas maneras, he decidido usar tiles que es mil veces más eficientes que poner una cantidad muy muy masiva de objetos, aun desactivándolos a fuera de la room, entonces, mi generación consiste en un objeto, con un sprite de 2048x2048 las cuales tiene unos cuantos frames con distintas formas que funcionarán como plantillas de pseudo-aleatoriedad. Uso un objeto con este sprite, con el siguiente código:

create:
///init

//coloco el generador con el sprite plantilla en el centro de la room, snapeado a una grid de 16x16
x = floor( (room_width/2)/16 )*16;
y = floor( (room_height/2)/16 )*16;
image_speed = 0;

//el centro tendrá la plantilla del frame 0 siempre
image_index = 0;
image_angle = irandom(359);

//inicializamos variables de la generacion
procesos = 100; //veces que la plantilla cambiará de forma y se moverá de lugar
tubo = 0; //variable para controlar una barra de carga basada en los procesos

//rellenar la plantilla principal
for (var i=x-1024;i<x+1024;i+=16) {
    for (var j=y-1024;j<y+1024;j+=16) {
        if collision_point(i,j,oterraingen,true,false) {
            tile_add(tdirt,0,0,16,16,i,j,5);
            }
        }
    }

//actualizacion de variables
procesos--;
tubo++;

step:
///generar terreno

if procesos {
    //mover plantilla
    x = floor( irandom_range(2048,room_width-2048)/16 )*16;
    y = floor( irandom_range(2048,room_height-2048)/16 )*16;
   
    //cambiar de forma
    image_index = irandom(image_number-1);
    image_angle = irandom(359);
   
    //rellenar plantilla nueva con tiles
    for (var i=x-1024;i<x+1024;i+=16) {
        for (var j=y-1024;j<y+1024;j+=16) {
            if collision_point(i,j,oterraingen,true,false)
            && !tile_layer_find(5,i,j) {
                tile_add(tdirt,0,0,16,16,i,j,5);
                }
            }
        }

    //actualizacion de variables
    procesos--;
    tubo++;
    }
else {
    //volver al centro, crear al jugador y destruirse para empezar la partida
    x = room_width/2;
    y = room_height/2;
    instance_create(x,y,oplayer);
    view_object[0] = oplayer;
    instance_destroy();
    }

y de extra, irrelevante al problema, el tubo de carga en ev draw:
///draw tubo loading

var _tmaxlengh = 500;
var _tmax = 100;
var _tpos = tubo*_tmaxlengh/_tmax;

var _x = view_xview[0]+view_wview[0]/2-_tmaxlengh/2;
var _y = view_yview[0]+view_hview[0]/2;

draw_set_colour(c_black);
draw_rectangle(0,0,room_width,room_height,false);

draw_set_colour(c_white);
draw_rectangle(_x,_y-2,_x+_tmaxlengh,_y+2,true);
draw_rectangle(_x,_y-2,_x+_tpos,_y+2,false);


Una vez hayan entendido el método que hice, veo que solo con 100 procesos (y no niego que me encantarían más), se me genera un terreno (una especie de gran isla) que me acaba de gustar sin que quede tierra suelta inaccesible y/o formas muy raras que no me convencen... Observo que usar tiles, probablemente sí ayuda, incluso si están activos todos a la vez ( hablamos de +300k tiles ), pero claro, como podrán adivinar... se me tira ~20 mins generando terreno y esto me parece un problema MUY GORDO que hará que el jugador se canse de esperar y cierre el juego...

Alguna sugerencia para mejorar este método. O incluso alguna idea para tener una generación parecida aun que deba de cambiar radicalmente el método?

4
Tengo el clásico sistema de pathfinding que enseñan en el 99% de los tutoriales

///AI_init(width,height,precise)

precise = argument[2];
width = argument[0];
height = argument[1];

_grid = mp_grid_create(0,0,ceil(room_width/argument[0])
,ceil(room_height/argument[1]),argument[0],argument[1]);
_path = path_add();
_obstacles = ds_list_create();

mp_grid_add_instances(_grid,obj_wall,precise);

_priorityGrid = ds_grid_create(width,height);

y

///AI_patrol(x,y,allowDiagonal,speed)

if !mp_grid_path(_grid,_path,x,y,argument[0],argument[1],argument[2]) {
    //show_debug_message("Path could not be computed")
    return false;
    }
else{
    path_start(_path,0.6,path_action_reverse,true)
    return true;
    }

me funciona bien pero... solo si pongo una speed >= 1... si pongo una speed < 1 por ejemplo 0.6 pues ya no funciona cuando ha de dirigirse hacia abajo y/o derecha, sin embargo arriba y/o izquierda sí funca... me topé con el mismo problema con más velocidad cuando implementé estos scripts en el evento step, entonces lo cambié a un bucle de 2 steps en una alarm y se arregló, hasta ahora que lo estoy intentando con menos velocidad.

Antes que comentéis lo que me imagino, la razón por la que la quiero poner en bucle es porque mi juego, a parte de que el pathfinding lo hago para los enemigos sigan al player (y el player obviamente se mueve xd),  también he de resetear a tiempo real los obstáculos, ya que es un juego estilo minecraft y las paredes, agua, etc (obstáculos) pueden cambiar en cualquier momento.

Cómo soluciono esto? me encantaría poner enemigos lentos :(

5
Intento hacer lo que dice el título, teniendo la carpeta "maps" con varios archivos ini, necesito agarrar todos los nombres y meterlos en una array para previo uso, he encontrado funciones file_find_ y he mirao por google, gmc, reddit, intento implementarlo pero no me sale

mi código actual:
if directory_exists(working_directory+"/maps") {
    var i=0;
    var dir = file_find_first(working_directory+"/maps/",fa_readonly);
    while (string_length(dir) > 0) {
        file[i] = dir;
        show_debug_message(string(file[i]));
        dir = file_find_next();
        i++;
        }
    file_find_close();
    } else show_debug_message("nope")

he probado el fa_readonly, el fa_directory, pero no entiendo eso del todo, tampoco entiendo lo del string_lenght, también probé con dir != "" que vi en otro ejemplo... el manual de gm no te sale ningún ejemplo completo, nada más que una linea que no me ayuda nada... si alguien me dice cómo hacerlo bien y de paso si me explica de forma que lo ENTIENDA, pues se agradece

6
A alguien no le ha ocurrido que programa un juego que necesita un host, pero como apenas usa el host para 3 o 4 archivitos de texto? entonces pilla un host gratis porque pagar uno solo para usar una diminuta parte no vale la pena... pero siempre está el miedo de que al ser gratis, acabe dándote problemas o incluso tenga problemas de que te lo borren todo porque al host le dio la gana? pues sugiero a CGM que pudiese abrir un espacio en su servidor para que los desarrolladores lo usen para ello pagando una cuota que, obviamente sería una cuota mucho más baja que el precio que cobra un host, algo que sea proporcional al uso que le de, algo así como contratar un "microhost", y con esto, pues de paso CGM podría ir sacando para pagar la mensualidad que le pertoca... algo así como "alquilar" partes del host que ya tiene contratado...

Es una idea muy abstracta que se me acaba de ocurrir, yo lo suelto y ya que opinen y hagan lo que quieran (yo igual no tengo ni medio céntimo, pero no me cuesta nada compartir la idea a ver si no es tan loca xD)

7
Preguntas y respuestas / effect_create_above de una nube BLANCA
« en: Marzo 15, 2020, 08:01:13 am »
Estoy poniendo una neblina con effect_create_above(ef_cloud,xx,yy,2,c_white); el problema es que al juntar varias nubes, al tener un blanco no tan blanco, pues se ven nuber demasiado grises.

Y me gustaría que fuese más blanco (un poquito gris lo tolero, pero es demasiado y no quiero bajar la cantidad de nubes que creo)...

He probado una tontería a ver si cuela, que es usar el mismo truco que se usa para poner un sprite en blanco y probé esto:
d3d_set_fog(true, c_white, 0, 0);

Pero no funciona, y el que conozca mejor esa función sabrá que probé una tontería seguamente xD

El caso es.. qué puedo hacer?

(si me obligan a usar surfaces, que espero que sea el ÚLTIMO recurso, me gustaría un códiguito y no solo el concepto, aun no estoy muy familiarizado con las surfaces, sería muy de agradecer)

8
Buenas, necesito a gente que tenga algún mando/control/joystick/gamepad comoquieras llamarlo... que haga un pequeño test y me pase un pequeño informe para poder adaptar mi proyecto a distintos tipos de mandos.

Solo tienen que bajar el .exe que adjunto aquí en el post (hecho con GMS), abrirlo con tu mando conectado (en el puerto id 1, si no funca, prueba en todos los puertos usb que tengas). y cuando pulse un botón, en la room se verá un número, cada botón que pulses saldrá un número (mantener pulsado), si no pulsas nada, saldrá un 0.

Entonces, necesito saber el número que sale en TODOS los botones (el stick y el panel de flechas no cuentan)

En los de tipo ps tendremos cuadrado,X,triángulo, círculo, L1,L2,L3,R1,R2,R3select y start (L3 y R3 son los clicks de los stick/palancas)
Y en los de Xbox tendremos A,B,X,Y,LB,LT,RB,RT, y no sé como se llaman los 2 del centro xD y no sé si hay click en la palanquita, deconozco mucho el control de xbox, solo intenten no dejarse ningún botón pls

Entonces, pulsen un botón, apunten el número, pulsen otro botón, apunten el número, y así con todos, y me responden en este post la lista con todos los botones con su respectivo número (id) y el tipo y/o marca del mando que has usado.


PD: me interesa sobretodo controles de xbox, indiquen si son de xbox, xbox 360, xbox one, y si es ps, indiquen si es ps1, ps2, ps3, mando genérico, etc...

Muchísimas gracias por su humilde colaboración. Archivo de testeo adjunto, cualquier duda preguntenla.

9
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 ;)

10
Buenas, ando haciendo unos scripts para facilitar la vida un poco más al que pretende hacer un juego online, el caso es que para enviar un paquete de buffer al servidor, hay que indicar qué tipo de dato se envía, con "buffer_u8", "buffer_f16", etc..

Lo que quiero saber es si hay alguna manera de saber qué tipo de estos es una variable, para hacer un script... he visto que hay funciones por ejemplo "is_int32", "is_int64"... pero claro, ahí no hay ni signed/unsigned, ni hay float... entonces investigando en google, vi una manera de sacar cuándo es unsigned, simplemente convirtiendo el número decimal a número binario y simplemente mirar cuántas cifras quedan mirando su "lenght".. pero claro, aquí no entran ni los números con signos ni los decimales... entonces, aquí me he estancado... alguna sugerencia??

Me gustaría crear un script donde le metas un argumento y te devuelva un tipo (con un número que lo identifique o algo)

11
Preguntas y respuestas / Dibujar parábola con puntitos
« en: Septiembre 11, 2019, 11:30:12 pm »
Hola, alguien sabría decirme, o pasarme algún tuto sobre cómo hacer una parábola dibujada con puntitos? (no hace falta que seté animada)

Es para que me sirva de "mini tutorial"

Digamos, yo tengo un objeto que dependiendo de donde clickes con el mouse, hará un salto, y este tiene gravedad y quisiera que se viese con puntitos (spr_punto por ejemplo) la parábola que el objeto va a hacer... espero explicarme bien... osea ya no es hacer una simple parábola, sino que éste coindida con el sped y la gravedad que tengo asignada en el objeto (que es el player), entonces que yo mismo pueda calibrar algunas variables

12
tengo

var res = json_decode(result);

siendo result una string en formato json que devuelve de una tabla sql con 2 columnas, las columna "nick" y la columna "sc"
y las quiero poner en 2 arrays, por ejemplo "nicktable[n]" y "sctable[n]"

13
Preguntas y respuestas / Mover toda la room en vez del player
« en: Junio 17, 2019, 09:02:46 am »
Bueno, la idea es crear un plataformero donde, en vez de mover al player, lo que se mueve es la room entera, así como se suele hacer en los endless, nunca lo he hecho, y supongo que si me pongo lograré hacer un sistema que funcione y se muevan el duelo y las paredes pero... Y cuando quiero poner más cosas? Un enemigo que se mueve, un cañón que dispare, etc.. Osea otras cosas que a parte de moverse junto al obj_wall, tienen además su propio movimiento y es aquí donde me explota la cabeza xd

Alguien sabe si existe algún tutorial que trate sobre esto? Ni siquiera sé qué términos usar en google, no importa en qué idioma, y si no hay tuto, pues algún conesjo , apunte, lo que sea para tener alguna idea de qué me enfrento xd

Graxie :B

14
Preguntas y respuestas / No funciona Analitys de Facebook SDK (ios)
« en: Enero 29, 2019, 10:53:33 pm »
Wenas, miren intentamos implementar el Facebook SDK para el analitys. Ponemos la extensión, ponemos unos objetos de prueba para ver si funca o no, añadimos la app en el facebook developer y tal, compilamos, probamos y el analitys, donde la "depuración de eventos" no registra nada, no sale nada.

Buscamos tutoriales pero no hay apenas info sobre este tema, si alguien puede ayudar sería buenísimo, gracias de antemano. Pregunten cualquier duda por si me dejo detalles.

15
Preguntas y respuestas / Necesaria licencia ios para crear .ipa?
« en: Enero 24, 2019, 04:50:14 pm »
Hola, miren necesitamos saber si para crear el archivo .ipa para trabajar en apple store, se necesita sí o sí pagar la licencia de la misma apple store, o es suficiente con tener el modulo en game maker?

Páginas: 1 2 3 ... 9