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

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 - NiuWeb

Páginas: 1 2 3 4 5 ... 8
31
Autor: NiuWeb
Versión de GM utilizada: Studio 1.4.1657 stable (sí, sé que hay una actualización pero weno xD), aunque totalmente funcional en GM8
Descripción: Dibuja una línea dependiendo de un ángulo y un largor que se le dé
Código:
///draw_line_angle(x, y, dir, dist)
var xx, yy, dir, dist;
xx = argument0;
yy = argument1;
dir = argument2;
dist = argument3;

var lx, ly;
lx = lengthdir_x(dist, dir);
ly = lengthdir_y(dist, dir);
draw_line(xx, yy, xx+lx, yy+ly);
Argumentos:
x: La posición horizontal (en pixeles) del origen de la línea (eje de rotación)
y: La posición vertical (en pixeles) del origen de la línea (eje de rotación)
dir: La dirección, en grados de la línea
dist: El largor de la línea, en pixeles

Espero pueda serle de utilidad a alguien :D

32
Guenashfgjfkkk,
Comenzando uno de esos cientos de proyectos mierda que nunca termino, creé un sencillito programa "pixelArt", para joder más que todo xD, pero mi duda es la siguiente:
¿Qué es más óptimo, objetos que se dibujen con el color del pixel, o rectángulos y ciclos?
En cualquiera de las dos formas se usa el evento draw, pero en una se crearían cientos de objetos con un sprite de cuadrado blanco, y con un draw_sprite_ext() se les daría el color; y en la otra se usa un array bidimiensional que almacene los colores de los pixeles, y un par de ciclos for que dibujen rectángulos con el color guardado en el índice [i, j] del array.
Como es un "pseudo" editor, obviamente los "pixeles" se verían más grandes de lo normal, así que pongamos como ejemplo si tuvieran que verse cada pixel de 8*8, ¿Cuál método comería más memoria?

Como apunte digo que descarten cualquier comentario sobre surface, que aunque posiblemente gasten menos memoria, en algunos dispositivos funcionarían y en otros sencillamente no
Muchas gracias de anteoreja xD

33
Juegos completos / Colour Picker
« en: Febrero 29, 2016, 03:11:38 am »

Colour Picker

Programas y utilidades

GM: Studio

No me hagas click D:
Lo he decidido, a la mierda los videojuegos, bienvenidas sean utilidades inútiles xDDDDDD
Es un pequeño programa que sirve como seleccionador de colores, o paleta de colores HSV. Muestra el valor RGB, HSV y hexadecimal del color elegido. También permite ingresar tus propios valores HSV, RGB o hexadecimales para generar el color, presionando las teclas R, G y B para modificar el valor RGB; H, S y V para modificar el valor HSV; y enter para modificar el hexadecimal
hecho totalmente con GMS, y un poquito de fotochó para dibujar las paletas xD...





Arjunto XD


Es demasiado simple, y ni siquiera es un juego. Pero de ahora en adelante verán esta sección llena de más porquerías como ésta porque no es ilegal y es lo que me gusta hacer xDDD
Tiene un pequeño, muy pequeño, bug que descuadra un poco algunos hexadecimales que se le ingresan. Casi no sucede, pero si les llega a ocurrir sólo vuelvan a ingresar el hexadecimal y se arregla. Es un pequeño error en el sistema para transformar el número , el único que tiene (o al menos el único que le he encontrado) y lo estoy intentando solucionar; por lo demás, el programita está completo xD

34
Desarrollo de Scripts / División de cadenas por un separador (Explode)
« en: Febrero 29, 2016, 12:28:30 am »
Autor: NiuWeb
Versión de GM utilizada: Studio 1.4.1657
Descripción: Separa una cadena en un array, tomando como separador la subcadena dada. Por ejemplo, si se separa "hola-que-hace" con el signo "-", devolverá un array con las cadenas "hola", "que" y "hace"
Código:
///split(string, separator);
var str = argument0 + argument1;
var sep = argument1;
var sln = string_length(str);
var pln = string_length(sep);

if(sep == "") return false;

var arr, ind = 0;

var i = 1;
while(string_pos(sep, str))
{
    check = string_copy(str, i, pln);
    if(check == sep)
    {
        arr[ind++] = string_copy(str, 1, i - 1);
        str = string_delete(str, 1, i + pln - 1);
        i = 1;
        continue;
    }  
    i++
}
return arr;

Nota: El separador puede ser tanto de uno como de varios caracteres

Argumentos:
str: La cadena a dividir
sep: El separador para dividir.

EDIT: Código optimizado.

35
Juegos en desarrollo / CSS Drawer [BETA] v0.2
« en: Febrero 25, 2016, 03:42:45 am »


Programas & Utilidades

GM8

CSS Drawer es un software simple de dibujo de figuras, y su principal característica es la posibilidad de exportar los proyectos realizados a un archivo *.html con CSS incluído que redibuja el proyecto en el documento web.

imagen 1
imagen 2
imagen 3
imagen 4

Descargar instalador (2.69 MB) Dropbox
Descargar archivo comprimido (2.5 MB) Dropbox
Adjunto también

Características de la versión

  • Añadida interfaz gráfica, botones y menús para el fácil uso del programa y control de opciones rápido.
  • Añadida la opción de transparencia total en el fondo o borde de las figuras.
  • Añadida encriptación leve de proyectos para evitar posibles daños en la información de los mismos. Por lo tanto, los proyectos creados con la versión anterior ALPHA v0.1 son incompatibles y considerados obsoletos a partir de esta versión.
  • Añadida la extensión de archivos personalizada (*.cdm), los proyectos pueden ser abiertos desde el Explorador de Windows con CSS Drawer BETA v0.2 como programa por defecto.(Requiere reinicio después de la primera ejecución)
  • Añadido editor de figuras, con posibilidad de mover, redimensionar y modificar el color de la figura.
  • Añadido portapapeles para copiar y pegar figuras

La web oficial del programa: CSS Drawer
Documentación del programa: CSS Drawer Docs

36
Buenashffjfdkfj!! xD
Me surge esa duda principalmente porque en ocaciones necesito almacenar más de un valor en una llave de una ds_map(), y obviamente la mejor forma de hacerlo es con un array, una ds_list() u otra ds_map().

La pregunta es, si yo tengo un array dentro de una estructura de datos (digámosle ds_map()), con una estructura algo como esto:


Había pensado en intentar como un array bidimensional, algo así:
mapa[? 'llave1', 0]
Pero me sale error de compilación:


¿Cómo podría obtener la información que se encuentra en el Array de cada llave del mapa sin tener que almacenar la misma en otra variable?

Gracias de antecabeza :B

37
Desarrollo de Scripts / Crear un array con los argumentos dados
« en: Febrero 21, 2016, 04:38:11 am »
Va bajando la calidad de los scripts xD
Autor: Generación espontánea xD. Mentiras, yo (NiuWeb)
Versión de GM utilizada: Studio 1.4.1657 stable versión
Descripción: Devuelve un array que contiene los argumentos dados. No es muy útil, pero ahorra bastante código. (Obviamente ahorra un máximo de 16 líneas de código xD)

Código:
///set_array(values);
var n = argument_count;
var arr;
for(var i=0; i < n; i++)
{
arr[i] = argument[i];
}
return arr;

Ejemplo:
Escribir:
array = set_array("hola","como","estás","xD");
Nos ahorra tener que escribir:
array[0] = "hola";
array[1] = "como";
array[2] = "estás";
array[3] = "xD";

Nivel de utilidad: -600%... Completamente inútil, pero ayuda a los flojos xDDD

38
Aki se viene uno sencillito xD
Autor: Mi gato cuando saltó al teclado xD. Mentiras, yo (NiuWeb)
Versión de GM utilizada: Studio 1.4.1657 stable version
Descripción: Busca un valor en un array y devuelve los índices en donde se encuentra dicho valor en un array unidimensional. De no encontrar el valor buscado devolverá -1. Por ejemplo, si busco el valor "gato" en el array:
array[0] = "perro";
array[1] = "gato";
array[2] = "conejo";
array[3] = "gato";

El script devolverá un array con el número 1 y el número 3.

Código:
///array_1d_find_value(array, value);
var arr = argument0;
var find = argument1;
var r = -1;

for(var i = 0; i < array_length_1d(arr); i++)
 {
    if arr[i] == find
     {
        if is_array(r)
         {
            r[array_length_1d(r)] = i;
         }
        else
         {
            r[0] = i;
         }
     }
     
 }
 
return r;

Nivel de utilidad: -59.332% xD, en resumen, es completamente inútil... Todo este lio se resuelve con listas, pero weno xDD

39
Sí, lo sé, soy probablemente la única persona tan aburrida y desocupada como para hacer esto xD
Me tomé la libertad de pasar ABSOLUTAMENTE TTTOOOOODDDDAS las funciones, variables y constantes de GMS a una base de datos SQL para quien desee usarlas de cualquier forma. No hay definiciones, ni argumentos ni nada de nnnnaaaddda xD, pero están todos los nombres.

La base de datos la dejo adjunta en un archivo *.SQL

No me digan que para qué me puse a hacer esto si es tan increíblemente inútil, porque lo sé, y aún sabiéndolo, lo hice... Pero esa es la razón por la que lo posteé en un Off-topic, para que no afecte mucho si es inútil o no xDDDDD

EDIT absolutamente inútil: He adjuntado también la base de datos en versión PDF para todos!!! xDDDDD

40
Vaya nombrecito el del post xD, no había una forma más "corta" de definirlo xDDD

Autor: Yo :v (NiuWeb)
Versión de GM utilizada: 1.4.1657 stable version
Descripción: Alternativa mejorada de la función propia del GM string_pos(). Busca las coincidencias de una substring en una string y devuelve la posición de las mismas en un array unidimensional.
La substring puede ser tanto un solo caracter como varios; si es una cadena con más de 1 caracter, el script la buscará igualmente, y devolverá la posición del primer caracter en donde la haya encontrado, por ejemplo: Si busco "gato" en la string "el gato vuela, es un gato volador porque gustavo lo vio volar", el script me devolverá la posición de la "g" de la primera coincidencia de "gato" (es decir, la posición 4) y la "g" de la segunda coincidencia de "gato" (es decir, la posición 22).
De no encontrar la cadena buscada, el script devolverá 0.

Código:
///string_pos_fixed(str, substr);
var str = argument0;
var substr = argument1;
var lenght = string_length(str);
var arr = 0, c, m;
for(var i = 1; i <= lenght; i++)
 {
    if string_length(substr) == 1
     {
        c = string_copy(str,i,1);
        if c == substr
         {
            if is_array(arr)
                arr[array_length_1d(arr)] = i;
            else
                arr[0] = i;
         }
     }
    else
     {
        m = string_copy(str,i,string_length(substr));
        if m == substr
         {
            if is_array(arr)
                arr[array_length_1d(arr)] = i;
            else
                arr[0] = i;
         }
     }
 }
 
return arr;

Argumentos:
string_pos_fixed(str, substr);
str:La cadena en donde buscar coincidencias
substr:La cadena a buscar


Espero pueda ser de utilidad para alguien, no olviden dar créditos si lo desean :B

41
Preguntas y respuestas / Mi sistema de teletransporte no sirve xD
« en: Enero 31, 2016, 02:23:50 am »
Guenas, comencé un bonito proshectico muy sensual (este sí lo termino porque lo termino XD ), y he progresado muy bien. El juego está casi, CASI, ¡¡¡CASI!!! listo (en el sentido del motor, no los niveles y eso xD).
Le intenté implantar un sistema de "teletransporte". Que la idea original fuera que funcionara así:

Se tienen varias instancias de "oTeleport" (el objeto de teletransporte xD).
Todas las instancias tienen un ID de teletransporte, y hay parejas de estos, es decir que cada dos instancias tienen el mismo ID para teletransportarse de una a la otra.
Al colisionar con una, se busca a otra instancia con su misma ID de teletransporte, y si la encuentra, teletransportar al player

Ahora los códigos:
En el create del oTeleport tengo esto:
teleid = 0;
teled = true;

Y en el evento collision con el oTeleport del player tengo esto:
var g = other.teleid;
var d = ds_list_create();
var xX, yY, j, m;
var otherid = other.id;
with oTeleport
 {
    if id != otherid
     {
        ds_list_add(d,id);
     }
 }
 
for(i=0;i<ds_list_size(d);i++)
 {
    m = d[| i];
    if m.teleid == g and m.id != otherid
     {
        xX = m.x;
        yY = m.y;
        j = m;
        break;
     }
 }
ds_list_destroy(d);

if instance_exists(j) and j.teled == true
 {
    x = xX;
    y = yY;
    j.teled = false;
 }
La variable "teleid" dice a cuál objeto teletransportar el player. Yo configuro estos valores en el Creation Code de cada instancia, aunque por defecto el valor es 0. Tengo dos instancias separadas entre sí, y ambas tienen "teleid" en 1

Más o menos explicado el código hace esto:
Citar
-->se sacan los valores "id" y "teleid" del objeto que colisionó con el player
-->Se crea una lista para almacenar todas las "id" de las instancias de oTeleport
-->Se revisan cada instancia de oTeleport, y si el "id" de la instancia que se está revisando actualmente no es el mismo de la instancia que colisionó con el player, éste se agrega a la lista
--> Se examina cada elemento que quedó guardado en la lista
-->Si el elemento tiene el mismo valor en "teleid", guardar en xX & yY la posición del elemento, y guardar la id del mismo en la variable "j".
-->Si la instancia con la id "j" existe, y éste no ha sido activado (variable "teled"), teletransportar al player hacia esta instancia y desactivar a la que colisionó con él primero.

Pero sencillamente me deja el player en donde está. Pero veo que lo mueve un poquito, como si se tomara a sí mismo como "j", pero eso lo veo imposible porque ni siquiera se agregó a la lista.
Decidí poner un show_message después de las acciones importantes, puse los mensajes así:

var g = other.teleid;
show_message(string(g));
var d = ds_list_create();
var xX, yY, j, m;
var otherid = other.id;
show_message(string(otherid));
with oTeleport
 {
    show_message(string(id));
    if id != otherid
     {
        ds_list_add(d,id);
        show_message(string(id) + " agregado a la lista");
     }
    else
        show_message(string(id) + " no agregado a la lista");
 }
 
for(i=0;i<ds_list_size(d);i++)
 {
    m = d[| i];
    show_message("Instancia numero "+string(i+1)+" probando#id: "+string(m.id)+"#teleid: "+string(m.teleid));
    if m.teleid == g and m.id != otherid
     {
        xX = m.x;
        yY = m.y;
        j = m;
        show_message("Se ha encontrado:#id: "+string(m.id)+"#x: "+string(xX) + "#y: " + string(yY));
        break;
     }
 }
ds_list_destroy(d);

if instance_exists(j) and j.teled == true
 {
    x = xX;
    y = yY;
    j.teled = false;
 }

Y el resultado fue este:

Citar
1

-----------------
110117

-----------------
110117

-----------------
110117 no agregado a la lista

-----------------
110118

-----------------
110118 agregado a la lista

-----------------
Instancia numero 1 probando
id: 110118
teleid: 1

-----------------
Se ha encontrado:
id: 110118
x: 432
y: 432

Efectivamente, los datos que me arrojan los mensajes coinciden con la instancia a la que deseo que el player se teletransporte, pero sencillamente NO lo hace.

¿Alguien logra descubrir cuál es el error?
Muchas gracias de antecabeza :B

42
Desarrollo de Scripts / Algoritmo de cifrado del Huevo Revuelto (SEEA)
« en: Enero 14, 2016, 12:01:02 am »
Hola, hace poco hice una pregunta en el foro "Preguntas y respuestas" donde tenía un error con mi código de encriptación. Gracias a jmbs19 logré solucionar el problema principal y se me ocurrió darle una pequeña (en verdad, muy pequeña xD) mejora para hacerle un poco (en verdad, muy poco) más complejo y extraño.
Al terminar mi script, recordé que muchos sistemas de encriptación tienen un nombre, como base64, sha1 (Secure Hash algorithm) y otros que obviamente tienen un nivel muy superior al mio, así que para no quedar tan abajo (?), le dí su propio nombre: "SEEA" (Siglas en inglés de: "Scrambled egg encryption algorithm", que significa "Algoritmo de cifrado del Huevo Revuelto").

Así que vamos allá:

Autor: NiuWeb (agradecimiento a jmbs19)
Versión de GM utilizada: GM:S 1.4.1657 (Debería funcionar en cualquier GM:S, pero más abajo seguro que no)
Descripción: Encripta o proteje una cadena de texto con una clave de encriptación para hacer ilegible su contenido. En realidad, el proceso de protección es una tontería, pero funciona aceptablemente

Códigos:
Ahora se viene lo importante, los códigos:
Primero, el código para encriptar:
///seea_encode( str, key );
var str = argument0;
var key = argument1;

var kl = string_length(key);

if (kl mod 2) == 0
 {
    var m1 = string_copy(key,1,kl/2);
    var m2 = string_copy(key,kl/2,kl/2);
    key = m2 + m1;
 }
else if (kl mod 2) == 1
 {
    var m1 = string_copy(key,1,1);
    var m2 = string_copy(key,kl-1,1);
    key += chr(  max(  ord(m1), ord(m2)  ) - min(  ord(m1), ord(m2)  )  );
 }


var result = "";
var char;

while string_length(str) > (string_length(key) + 1)
 {
    var rest = string_length(str) - string_length(key);
    var falt = string_copy(key,1,rest);
    key += falt;
 }


for(i=1;i<=string_length(str);i++)
 {
    char = ((string_ord_at(str,i) + string_ord_at(str,i) - string_ord_at(key,i)));
    result += chr(char);
 }
return (result);

Y luego, el de desencriptar:

///seea_decode( str, key );
var str = (argument0);
var key = argument1;

var kl = string_length(key);

if (kl mod 2) == 0
 {
    var m1 = string_copy(key,1,kl/2);
    var m2 = string_copy(key,kl/2,kl/2);
    key = m2 + m1;
 }
else if (kl mod 2) == 1
 {
    var m1 = string_copy(key,1,1);
    var m2 = string_copy(key,kl-1,1);
    key += chr(  max(  ord(m1), ord(m2)  ) - min(  ord(m1), ord(m2)  )  );
 }


var result = "";
var char;
while string_length(str) > (string_length(key) + 1)
 {
    var rest = string_length(str) - string_length(key);
    var falt = string_copy(key,1,rest);
    key += falt;
 }
for(i=1;i<=string_length(str);i++)
 {
    char = ((string_ord_at(str,i) - string_ord_at(str,i) + string_ord_at(key,i)));
    result += chr(char);
 }
return result;

Los argumentos de cada script son:
seea_encode( str, key );
/*
donde str es la cadena a encriptar
y key es la clave para encriptar
*/


seea_decode( str, key );

/*
donde str es la cadena encriptada a desencriptar
y key es la clave que se usó para encriptar
*/


Espero le pueda ser de utilidad a alguien. :-[
No les pido créditos porque entre menos se sepa con qué tipo de protección guardas tu información, más seguro es  XD

43
Hola, en el proyecto que estoy haciendo llegué a un punto en el que es completamente necesario crear una encriptación para archivos de información, pero esta encriptación no puede ser desencriptable fácilmente, necesita una "clave" para desencriptarla. Por eso el base64 queda fuera, y los Hash igual, así que decidí buscar algunos ejemplos de cualquier lenguaje, y encontré uno muy bueno en PHP, así que me dediqué a traducirlo a GML. Al final me quedó así:

///encode
str = argument0;
key = argument1;
result = "";

for(i=0;i<string_length(str);i++)
{
result += chr(string_ord_at(str,i) + string_ord_at(key,i));
}
return base64_encode(result);

Lo cual hace que así se desencripte el base64, haya un segundo nivel de protección para desencriptar el contenido, y este nivel es el que está protegido con contraseña.
Ahora, la desencriptación:

///decode
str = base64_decode(argument0);
key = argument1;
result = "";

for(i=0;i<string_length(str);i++)
{
result += chr(string_ord_at(str,i) - string_ord_at(key,i));
}
return result;

Y se supone que con esto debería funcionar, pero sencillamente desencripta cosas que no son, por ejemplo, si encripto "hola", al desencriptar lo que ha encriptado me sale "hhhy", y cosas por el estilo

¿Alguien puede encontrar cuál es el error en este código? Yo no encuentro qué está mal, y aclaro que la clave de encriptación siempre es la misma por si alguien sale con esa idea xD

44
Preguntas y respuestas / ¿zip_zip?
« en: Enero 09, 2016, 07:39:57 pm »
Hola, acabo de iniciar un proyecto en GM, cosa que de por sí ya es bastante extraña :-[ , Y nada más crear el proyecto en blanco me encontré con un muro de 120 metros llamado zip_zip...
Sé que existe la función zip_unzip en GM, que sirve para descomprimir archivos .ZIP, pero en este caso, necesito también comprimir el archivo.
Había pensado crear una extensión, pero según lo que he leído, tendía que hacerla en Java para que pudiera usarla en Android, y de Java no sé nada (Ni siquiera he lograo crear un nuevo proyecto en Eclipse xD). Y aunque de VB sepa algo, no es lo suficiente...Por estas razones pienso que sería mejor hacerlo con código interno de GM, o en el peor de los casos, una extensión ya existente.
¿Alguien se ha topado de casualidad con una extensión que haga este trabajo? ¿De no existir, alguien me puede instruir para poder crear este sistema?
Muchas gracias a todos de posmano.

45
Preguntas y respuestas / Importar recursos desde directorio a GMS
« en: Enero 06, 2016, 08:34:04 pm »
Hola, estaba bien aburrido por ahí, y me dio por dar click derecho>abrir con>Notepad++ a todos los archivos en mi PC, y descubrí que recursos como scripts y objetos en cualquier proyecto de GMS tienen una estructura semi-html legible a la perfección por el ser humano, y se me ocurrió una magnífica idea que era crear un juego completamente online que descargara todos sus recursos de mi servidor, y luego los importe. Esto para yo poder modificar todo en el juego sin tener que hacer actualizaciones tan seguido, y también poder agregar más cosas, como los típicos objetos de regalo en cada temporada y blahbhahvhabhabvaHSQSDJHKHAKJDFjfg....Estoy delirando de la alegría xD

Mi pregunta es sencilla: ¿Si hago que el GMS tome estos recursos de mi servidor y los descarge al directorio del juego, puedo hacer que después, el GMS importe estos recursos al juego?

Espero no me den un guantazo en mi cara diciendo que no se puede, lloraré por tiempo indefinido :'( XD

Páginas: 1 2 3 4 5 ... 8