Mostrar Mensajes

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

Temas - bygdle

11
Desarrollo de Scripts / Invetir componentes de un color
Noviembre 17, 2018, 07:37:03 PM
Autor: NiuWeb.
Versión de GM: Studio 1.4.9999.
Descripción: Invierte los componentes de un color representado como número entero. Es decir, el componente rojo pasará a ser azul, y viceversa.

Resulta que en la versión 1.4.9999 las funciones effect_create_below() y effect_create_above() tienen un error que les hace interpretar los colores al revés.

Es decir, este código de aquí:
[gml]
effect_create_above(ef_firework, 128, 128, 0, c_orange);
effect_create_below(ef_firework, 256, 128, 0, c_teal);

effect_create_above(ef_firework, 128, 256, 0, c_blue);
effect_create_below(ef_firework, 256, 256, 0, c_red);
[/gml]
Muestra en pantalla esta locura:


Código: El problema se puede solucionar con este código.
[gml]
///color_rgb_fix(color);
//Invierte los componentes del color dado

//Obtener componentes iniciales
var red   = argument0 & 255;
var green = (argument0 >> 8) & 255;
var blue  = argument0 >> 16;

//Rehacer el color
return (red << 16) | (green << 8) | (blue);
[/gml]

Ejemplo:
Esta sería la versión corregida de las constantes de color, para usar con estas funciones:
[gml]
aqua    = color_rgb_fix(c_aqua);
black   = color_rgb_fix(c_black);
blue    = color_rgb_fix(c_blue);
dkgray  = color_rgb_fix(c_dkgray);
fuchsia = color_rgb_fix(c_fuchsia);
gray    = color_rgb_fix(c_gray);
green   = color_rgb_fix(c_green);
lime    = color_rgb_fix(c_lime);
ltgray  = color_rgb_fix(c_ltgray);
maroon  = color_rgb_fix(c_maroon);
navy    = color_rgb_fix(c_navy);
olive   = color_rgb_fix(c_olive);
orange  = color_rgb_fix(c_orange);
purple  = color_rgb_fix(c_purple);
red     = color_rgb_fix(c_red);
silver  = color_rgb_fix(c_silver);
teal    = color_rgb_fix(c_teal);
white   = color_rgb_fix(c_white);
yellow  = color_rgb_fix(c_yellow);
[/gml]
Y así, cuando necesitemos usar constantes de color en las funciones de efectos, no usaríamos c_yellow sino yellow, por ejemplo.

Así que, el código que puse al principiose corregiría de esta forma:
[gml]
effect_create_above(ef_firework, 128, 128, 0, orange);
effect_create_below(ef_firework, 256, 128, 0, teal);

effect_create_above(ef_firework, 128, 256, 0, blue);
effect_create_below(ef_firework, 256, 256, 0, red);
[/gml]
Y en pantalla:

12
Buenas.
Hace ya rato que no me pasaba por aquí, y he vuelto simplemente para hacer públicos algunos proyectos incompletos con funcionalidades interesantes que he hecho a lo largo del año.

No son muchos, ni los tengo bien documentados. Hablando del código en sí, digamos que están decentemente organizados y entendibles, pero no tengo escrita ninguna guía que explique detalladamente su funcionamiento, ni tengo planeado hacerla.

No los voy a subir de una vez todos, estoy arreglando un par de cosas y los iré subiendo de a poco en este mismo post.

Sin nada más que decir, aquí van:

1. Caja con contenido deslizable.
El elemento de interfaz ideal para dispositivos móviles. Se trata de un contenedor al que le puedes adjuntar cualquier tipo o cantidad de objetos (con ciertas características) y arrastrar con el cursor (o propiamente dicho, el dedo) consiguiendo el famoso efecto de deslizamiento con desaceleración.

deslizables.gmz

[spoiler=NOTA]
Ese proyecto tiene otras funcionalides extra, como adaptabilidad a la pantalla (para reducir el coste de procesamiento) y un sistema de "click por capas", para evitar que se seleccione un objeto si tiene encima a otro, pero esas cosas las arreglaré un poco mejor y las subiré en otros archivos después.[/spoiler]


1. Plataformero híper-simple.
Pues eso, un sistema "en blanco" de colisiones y saltos de estos típicos en plataformeros. Todas las propiedades del sistema son configurables (gravedad, velocidades, teclas de control e incluso la cantidad de saltos que se pueden hacer sin tocar el suelo). Viene por defecto configurado para un "quíntuple salto" xd, pero se puede cambiar v:

Plataformero.gmz

Ya veré cuándo continúo subiendo.
Saludos.

(si algún moderador ve que este post iría mejor en otra parte, agradecería lo moviera).
13
Traducción de la documentación de GameMaker: Studio
Solicito colaboradores
(Mira ese tamaño para no morir ignorado xd)

¡Muy buenas!
Como sabrán, uno de los elementos más importantes para aprender a utilizar cualquier cosa, o por lo menos guiarse, es el manual. En el caso de los progamadores, una referencia del lenguaje de programación que usen es vital para poder desarrollar cómodamente.

Éste es un foro de Game Maker, y como foro de Game Maker que es, sus usuarios utilizan mucho la programación GML. El manual que este foro tiene en español acerca del GML es de hace muchísimo tiempo, para con versiones muy antíguas de GM, y por ello hay demasiada información de las versiones modernas que se le escapa. No sólo eso, el manual oficial de GM: Studio, cuan larguísimo que es, se encuentra totalmente en inglés, factor que aunque a los usuarios más experimentados no suponga un problema mayor, siempre es una dificultad por más pequeña para aquellos sin tanto conocimiento, o siquiera eso, pues es mucho más fácil entender un manual en nuestro idioma nativo.

Con esto en mente, yo decidí comenzar a traducir el manual del GM:S, de esto hace más de un año. Comencé a trabajar sólo durante un tiempo, hasta que se me ocurrió la idea de pedir ayuda a más gente de aquí en un post (como éste) para avanzar más rápido y mejor.  Dicho post pasó bastante desapercibido (como tal vez le pase a éste :v) y sólo conseguí que un usuario me ayudara. Junto a este usuario traducimos un par de cientos de funciones y variables, pero por unos problemas no pude continuar trabajando en el proyecto, así que quedó pausado.

...Hasta ahora. Hace un mes decidí terminar lo que empecé, primero por respeto a aquel usuario que se esforzó para colaborar en esto, y segundo por la ilusión que me hace a mí (y tal vez a él) ver todo el manual del GMS traducido por usuarios de este foro.

El manual, con las ahora 436 sentencias que tiene traducidas, y ahora clasificadas en secciones con información, está siguiendo adelante, y no se detendrá hasta completarse. Pero, hay un pequeño gran problema: Y es será imposible para mí terminar el proyecto sólo, hay muchas cosas del GML que sobrepasan mis conocimientos, y además hay mucha, muchísima y demasiada tela para cortar; hay cientos de secciones y miles de artículos individuales en el manual oficial. Y ésta es la razón principal de este post, así que iré al grano:

Necesito gente que participe en este proyecto.
Busco colaboradores que, por puro altruismo y voluntad (es decir, no hay pago, es un proyecto para todos), desee ser partícipe en la traducción del manual de GameMaker: Studio, y que pueda aportar de su conocimiento de este programa a todo el mundo.

La mecánica sería muy sencilla: Quien desee colaborar en la traducción, mándeme un mensaje privado con su correo electrónico, para añadirle en las redes sociales que usaremos para comunicarnos: Trello y Slack.

En Trello
Colgaremos nuestros avances y progresos en la traducción. Véase, qué estamos traduciendo, qué traduciremos y qué hemos traducido. Para mantener un orden.

En Slack
Nos comunicaremos directamente. Será el canal por donde hablaremos entre nosotros.

Los detalles específicos los daré cuando los traductores nos reunamos en dichas redes sociales.

Lo ideal sería que las personas que trabajemos en esto tengamos conocimientos de Game Maker que podamos aportar. Aún si no posees conocimientos avanzados de GML, hay muchas otras partes del manual oficial que requieren traducción, como las secciones de Using GameMaker: Studio, o Advanced Use, las cuales no hablan de temas muy avanzados de GML. Obviamente, será necesario tener un nivel de inglés técnico suficientemente bueno para entender lo que dicen los artículos originales del manual, términos propios del GM, por ejemplo. Otra cosita es la cuestión de escritura: Lo ideal sería que los artículos traducidos tengan una buena redacción para ser entendibles.

El manual será hospedado en un blog con tecnología Blogger, pues es una herramienta que facilita muchas cosas, y elimina problemas que atrofiarían el proyecto, como el molesto ancho de banda, o la seguridad. De todas formas ya tengo todo preparado para que sea muy sencillo traducir las cosas, evitando complicaciones.

Como digo, me hace mucha ilusión que el manual en español de GM: Studio saliera de Comunidad GM, este foro que quiero tanto :3 xD.

Y eso sería todo. El manual está alojado aquí: http://docs-gamemaker-es.blogspot.com

EDIT (02/12/17):  El manual se ha mudado de servidor, ahora está en esta URL: https://bygdle.xyz/gamemaker/manual/

Ojalá este post no muera en el olvido. :(.

PD: Ya lo había publicado, pero se había bugeado así que lo resubo.

Colaboradores actuales
Ya hay algunas personas que han decidido unirse al proyecto.


  • Alesxanderk
  • SeirLord Games
  • Zapdos43
  • Clamud
  • Kostra (MHP Labs)
  • Brunoxzx

Ojalá se unan más personas.
14

GMLight JS
Fase BETA
Resaltador de síntaxis GML en JavaScript

¡Buenas! Vengo a presentarles un pequeño proyectico que he hecho, y que podría ser útil a aquellos desarrolladores GM que quieran publicar sus códigos en internet. Se trata de una sencilla librería en JS que se puede insertar en un sitio web para resaltar la síntaxis de GML con estilos cómodos para la vista y totalmente personalizables. Permite resaltar perfectamente funciones, variables, constantes, comentarios de una línea y multilínea, números y cadenas de texto sin problemas.

La librería es gratuita y está totalmente documentada en su sitio web. Denle una mirada :).


Una muestra de lo que puede hacer (clic para ver en tamaño completo):


Obviamente las imágenes están tomadas desde el sitio web, el resaltador on-line.

PD: En el sitio se puede probar el resaltador on-line, por si quieren ver cómo funciona.
15
Desarrollo de Scripts / Obtener números primos.
Septiembre 09, 2017, 06:27:09 PM
Autor: NiuWeb.
Versión de GM: Studio 1.4.
Descripción: Obtiene un número primo en la posición dada.
[gml]
///prime_number(pos);
var pos = round(argument0);
var con = 0;
var num = 1;
var prm = true;

while(con < pos)
{
    prm = true;
    for(var i = 2; i < num; i++)
    {
        if(num % i == 0)
        {
            prm = false;
            break;
        }
    }
    if(prm) con++;
    num++;
}
return num - 1;
[/gml]
El único argumento es la posición del número primo a obtener.

Ejemplo:
[gml]
txt = "";
for(var i = 1; i <= 10; i++)
    txt += string(prime_number(i)) + "#";
show_message(txt);
[/gml]
Muestra lo siguiente:
16
Autor: NiuWeb.
Versión de GM: Studio 1.4.
Descripción: Crea una cadena de texto a partir de el arreglo y las propiedades dadas.
[gml]
///parse_array(array1d, open, pattern, separator, close)
var array     = argument0;
var opens     = argument1;
var pattern   = argument2;
var separator = argument3;
var close     = argument4;

var arrlen = array_length_1d(array);

var text, part;
var result = "";

for(var i = 0; i < arrlen; i++)
{
    text = string(array);
    part = split(pattern, "$n");
    parl = array_length_1d(part);
    for(var j = 0; j < parl; j++)
    {
        result += part[j];
        if(j < parl - 1) result += text;
    }
   
    if(i < arrlen - 1) result += separator;
}
return opens + result + close;
[/gml]
Para funcionar, este script requiere de éste: split()

Uso:
El argumento array1d es el arreglo original a convertir.

El argumento open es la cadena de texto que estará al inicio.

El arumento pattern es el que permite definir cómo se imprimirán los valores del arreglo. Se usa "$n" como base para insertarlos.

El argumento separator es un separador entre valores. No se inserta al final del último valor.

El argumento close es la cadena de texto que estará al final.

Ejemplo:
[gml]
arreglo[0] = "Elefante";
arreglo[1] = "Avestruz";
arreglo[2] = "Tiburón";
arreglo[3] = "Cocodrilo";

txt = parse_array(arreglo, "{", '"$n"', ",", "}");
show_message(txt);
[/gml]
Se muestra el siguiente mensaje:
17
Autor: NiuWeb.
Versión de GM: Studio 1.4.
Descripción: Crea un arreglo numérico a partir de los valores dados. Estos pueden ser secuencias numéricas (ver más adelante) para facilitar la creación del arreglo.
[gml]
///create_numarray(value0, ..., value16);
var result, index = 0;

var i, j, arg, nbp, scp;
for(i = 0; i < argument_count; i++)
{
    arg = string(argument);
    arg = string_replace_all(arg, " ", "");
    nbp = string_pos(":", arg);
    scp = string_pos("*", arg);
   
    if(nbp)
    {
        num1 = real(string_copy(arg, 1, nbp - 1));
       
        if(scp)
        {
            num2 = real(string_copy(arg, nbp + 1, scp - nbp - 1));
            num3 = abs(real(string_delete(arg, 1, scp)));
        }
        else
        {
            num2 = real(string_copy(arg, nbp + 1, string_length(arg) - nbp + 1));
            num3 = 1;
        }
           
       
        if(num3 == 0) num3 = 1;
       
        move = sign(num2 - num1);
       
        if(move == 0)
        {
            result[index++] = num1;
            continue;
        }
        else if(move == 1)
        {
            for(j = num1; j <= num2; j += num3)
            {
                result[index++] = j;
            }
        }
        else if(move == -1)
        {
            for(j = num1; j >= num2; j -= num3)
            {
                result[index++] = j;
            }
        }
    }
    else
        result[index++] = real(arg);
}
return result;
[/gml]
Uso:
La forma normal es crear el arreglo insertando como argumentos los números que se deseen guardar en él:
[gml]
arreglo = create_numarray(3, 7, 12.5, 4.11, 0.91); //etc...
[/gml]
Además, se pueden añadir (como cadena de texto) patrones sencillos para crear secuencias de números. La forma de estos patrones es min:max*step, donde min es el límite menor de la secuencia, max el mayor y step el aumento. Si min es mayor que max, se creará la secuencia en reversa. Si no se escribe el step (sólo min:max), el valor por defecto será 1.
[gml]
arreglo = create_numarray("2:8"); //2, 3, 4, 5, 6, 7, 8
arreglo = create_numarray("5.5:9*0.25"); //5.5, 5.75, 6, 6.25, 6.5, 6.75, 7, 7.25, 7.5, 7.75, 8, 8.25, 8.5, 8.75, 9
arreglo = create_numarray("11:-5*2"); //11, 9, 7, 5, 3, 1, -1, -3, -5
arreglo = create_numarray(1, 3, 5, "6:9"); //1, 3, 5, 6, 7, 8, 9
[/gml]
18
Hola, buenas.
A ver, les cuento la historia.

Resulta que todo mi juego lo he venido haciendo para resolución de 1920x1080; las salas, vistas, imágenes, todo está hecho para esta resolución.

Ahora bien, mi pc es 1600x900 y ni siquiera tiene tarjeta gráfica dedicada (vamos, es una mierda), por lo que el juego suele andar un poco lageado. No presté atención a eso hasta que compilé y probé para mi táblet Android, que es peor aún (800x450, creo). El juego iba pero lagueadísimo, injugable.

Gracias a esto, se me ocurrió la idea de redimensionar automáticamente la application_surface y permitir al jugador escojer la calidad (un múltiplo entre 0.5 y 1, ya lo explico), todo basándose en la resolución real (display_get_width() y la otra) del dispositivo.

Esto es lo que programé:
[gml]
var quality = ini_read_real("settings", "quality", 1);

var width  = display_get_width ();
var height = display_get_height();

width  = min(width, view_wview[0]) * quality;
width  = floor(width/16) * 16;
height = floor(width*9/16);

surface_resize(application_surface, width, height);
[/gml]
Ya ven, quality la lee desde un archivo ini, que el usuario en su menú de opciones establece de 0.5 a 1 con un deslizador.

En general funciona bien: Con calidad 1, la surface se redimensiona al tamaño original del dispositivo (manteniendo la relación 16:9), y con calidad 0.5 se redimensiona a la mitad. Con esto, a menor calidad, más velocidad y fluidez tiene el juego; diría que fue un éxito, peeero...

El problema es que algunas texturas se pintan con bordes, como si la textura se agarrara a medias y se repitiera un pedacito. Este error varía dependiendo de la calidad que se escoja, y con algunos valores no sucede, pero en mi pc (1600x900) se nota mucho con la calidad inicial (1), como se ve a continuación:

(En esta imagen se ve una línea blanca en el agua)

Con algunas otras calidades, como 0.89, el error se nota hasta en los barcos, como esta imagen:

(Ésta la tomé desde la táblet, se ve una línea café sobre el barco)

La verdad no tengo ni la más mínima idea de lo que pueda suceder, o de qué esté haciendo mal.

Agradecería su ayuda.
¡Saludos!  :D
19
Buenas.
Hace ya un tiempo (creo que casi o más de un año), inicié un proyecto para traducir la documentación del GMS 1.4, y aunque solicité personas para colaborar en éste, sólo conseguí la ayuda de un usuario.
Aún así, junto al usuario Alesxanderk, logramos trabajar durante un tiempo en el proyecto y conseguir resultados, aunque después de un tiempo abandonamos :|.

De todas formas, decidimos publicar lo que alcanzamos a traducir: 278 sentencias (funciones, constantes y variables) del GML, así que aquí está, libre pa'quien lo necesite.

https://manual-gamemakerstudio.000webhostapp.com/

¡Saludos! :D
20
Hola buenas :3
Verán, comencé a hacer un programa tipo quiz, una especie de preguntas y respuestas que hace uso de rejillas dinámicas para almacenar las mismas, pero no sé que ocurre que cuando añado un arreglo a un campo de la ds_grid, no soy capaz de recogerlo después, me devuelve undefined. Así tengo mi proyecto:

Primero tengo un script que crea arreglos con los argumentos, para facilitarme el trabajo:
[gml]
///array(val0, ..., val15);
var s;
for(var i = 0; i < argument_count; i++)
    s = argument;
return s;
[/gml]
Lo más fácil sería pensar que el error está acá y que desde un principio ningún arreglo se guarda, pero no veo ningún error en el código :vv.

Después tengo el evento create del controlador de las preguntas, con esto:
[gml]
globalvar Q, Qshow, page;
Q = ds_grid_create(4, 1);
Q[#0, 0] = "La pregunta :v";
Q[#0, 1] = array(
    "La respuesta A",
    "La respuesta B",
    "La respuesta C",
    "La respuesta D"
);
Q[#0, 2] = 2; //respuesta correcta: C
Q[#0, 3] = false; //No respondida

page  = 0;
Qshow = -1;
[/gml]
Bien, la variable Q es la rejilla que contendrá los datos. Para probar le puse una sola fila, pero siempre tiene 4 columnas: La pregunta, las respuestas, la respuesta correcta y si se ha respondido o no. Las variables page y Qshow son para mostrar la pregunta; page no es relevante, pero Qshow almacena el índice de la pregunta a mostrar, en este caso valdrá 0 (porque sólo hay una pregunta).

Ahora bien, nos vamos al evento Draw:
[gml]
TextExt(room_width/2, 280, Q[#Qshow, 0], 704, 28, 0.5, 0);
h = string_height_ext(Q[#Qshow, 0], 28, 704) / 2;
r = Q[#Qshow, 1];
for(var i = 0; i < array_length_1d(r); i++)
{
    Text(608, 280 + h + 32*i, r, 0.5, 0);
}
[/gml]
Los scripts TextExt() y Text() tampoco importan, son sólo para dibujar el texto en pantalla; háganles caso omiso :v. La variable h también es correcta, hasta ahí todo bien, la pregunta se dibuja correctamente en pantalla. El problema viene con la variable r: El ciclo que debería dibujar las posibles respuestas no se ejecuta nunca, y si muestro con un emergente el valor de r, me aparece undefined.

No tengo idea de por qué sucede esto, ¿alguna idea? ¿es problema de las grids, que casualmente no admitan arreglos (con lo cual tendría que reescribir mucho código >.<)? ¿o es error mío en alguna parte (ojalá sea así :v) que no he visto?

EDITO: Intenté cambiar los arreglos por listas, pero el error sigue sucediendo exactamente igual. Comprobé que el script funcionaba bien insertanto la misma lista en otra variable cualquiera, y al mostrarla en pantalla sí devolvía el identificador de la lista y no undefined, como sucede cuando la guardo en la rejilla >.<".

Espero haberme explicado bien xD.
Gracias por leer, saludos :}