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.

Mensajes - Wadk

16
Esta es una de las grandes limitaciones del GM: la falta de clases o de estructuras.
Podés hacer dos cosas.

1) Usar objetos como si fueran clases/estructuras. En vez de:
struct Personaje {
    int vida;
    int attack;
};

Creás un objeto y le das las variables vida y ataque en el evento create. Después lo instanciás y le das valor a las variables como a cualquier otro objeto.

2) Usar arrays.
[gml]Personaje[0, 0] = 0;  // Vida del personaje 0.
Personaje[0, 1] = 0;  // Ataque del personaje 0.
Personaje[1, 0] = 0;  // Vida del personaje 1.
Personaje[1, 1] = 0;  // Ataque del personaje 1.
// etc[/gml]

Ninguna de las dos maneras es óptima pero es lo que brinda el GM.
17
General / Desafíos de hacking
Julio 13, 2014, 11:58:35 PM
Esta página es bastante interesante para los que quieran probar sus habilidades de hackeo:
http://securityoverride.org/challenges/
Los desafíos son muy variados y están por lo general bastante bien hechos.
Lo pongo por acá porque se comentó en el tagboard hace un par de años y varios parecían interesados.
Desgraciadamente requiere registrar una cuenta para realizar los desafíos, pero si les interesa vale la pena.
Este es mi perfil: http://securityoverride.org/profile.php?lookup=4356 ahí pueden ver que tengo alrededor de 2500 puntos, a ver si alguien me supera ;).

Otra página interesante es esta: http://www.matasano.com/articles/crypto-challenges/ (actualmente la página está caída, acá pueden ver una versión archivada: http://web.archive.org/web/20140213141638/http://www.matasano.com/articles/crypto-challenges/)
Te anotás para recibir desafíos criptográficos por e-mail para resolver programando. Yo no me he anotado pero tiene buena pinta.

En fin, a ver si le hechan un vistazo y me cuentan.
18
Preguntas y respuestas / Re:Propuesta
Junio 09, 2014, 12:12:29 AM
Esto va en la sección de intercambio.
Postealo ahí.
19
Preguntas y respuestas / Re:Pausar juego.
Junio 03, 2014, 06:26:49 PM
Cita de: Marth en Junio 03, 2014, 10:20:24 AM
Pues gracias, al fin la pausa funciona a la perfección.
Eso si, veo que en el código ordenas que el sprite que se usa como imagen en la pausa se destruya, cuando no debería hacer falta ya que es una variable local que desaparece con el objeto, por no hablar que si fuese una variable global sera sustituido su valor la próxima vez que pause.
Sí que hace falta. La variable desaparece con el objeto, pero el sprite no. Si no lo destruís, el sprite queda cargado en memoria aunque ya no es útil, y el juego pasaría a ocupar más memoria RAM cada vez que se pause.
20
Preguntas y respuestas / Re:Pausar juego.
Junio 02, 2014, 11:36:04 PM
sprite_create_from_surface crea un nuevo sprite en el juego a partir del contenido de una superficie. Según penumbra la variable application_surface en Studio es la superficie que al final se dibuja en pantalla, es decir la que contiene todo lo que ves.

Lo que tendrías que poner es, en el evento create de tu objeto pausa:
[gml]
background = sprite_create_from_surface(application_surface, view_xview[0], view_yview[0], view_wview[0], view_hview[0], false, false, 0, 0);
instance_deactivate_all(true);
[/gml]

En el evento draw:
[gml]
draw_sprite(background, 0, view_xview[0], view_yview[0]);
// Acá podés dibujar el menú de pausa, si querés.
[/gml]

Y en destroy:
[gml]
sprite_delete(background);
instance_activate_all();
[/gml]

Después creás el objeto para pausar el juego, y lo destruís para sacar la pausa.

Verificá bien el nombre de las funciones y el orden de los parámetros porque puede que me falle la memoria.
21
Propuestas y soporte / Re:Hilos Favoritos
Mayo 03, 2014, 10:34:47 PM
Cita de: marufrant en Mayo 02, 2014, 02:34:00 PMEDITO: Además no todos los usuarios entran en el foro a través del mismo ordenador, por lo tanto la pestaña de favoritos del navegador cambia.
Ese es un buen punto. Pero no creo que justifique agregar una característica así. Usar el propio navegador me sigue pareciendo más cómodo y conveniente. Y si alguien realmente necesita acceder a sus favoritos desde varias computadoras, la mayoría de los navegadores populares modernos permiten sincronizar automáticamente ese tipo de cosas entre dispositivos mediante internet.
22
Propuestas y soporte / Re:Hilos Favoritos
Mayo 01, 2014, 09:41:32 PM
Para eso pueden usar el sistema de favoritos/marcadores del navegador que usen. No veo la ventaja de incorporarlo como característica del foro.
23
Lo que describís es como una sección FAQ, que existió en su momento pero quedó inactiva.
El subforo de preguntas y respuestas ya tiene más preguntas contestadas de las que se nos podrían llegar a ocurrir, y se recomienda a los usuarios que utilicen el buscador antes de preguntar para encontrar una solución más rápidamente.
24
Preguntas y respuestas / Re:Abrir .ini
Octubre 23, 2013, 02:32:42 AM
Cita de: brunoxzx en Octubre 22, 2013, 07:59:01 PM@Texic: Estoy casi seguro de que gm no te permite manipular de ningún modo archivos fuera de la carpeta del proyecto, independientemente de si estos son .ini o .txt.
Te equivocás, al menos en GM8 para atrás, es solo con las funciones ini la restricción.
De hecho yo una vez hice unos scripts para leer inis en otros directorios usando funciones de archivos de texto. Y funcionaba, pero descarté la idea porque el código era un spaghetti bastante importante.
25
Dividí el tema. No hay razón para usar el tema de otra pregunta, aunque sea similar.

El screen_redraw() es necesario sin cargás los archivos en un loop. Si no, dudo que tenga efecto apreciable.

Si querés deshacerte de la variable total, podés usar una ds_list para guardar todos los recursos que vayan a ser cargados y usar el tamaño de la ds_list para averiguar el total.
Podés crear un objeto dedicado a cargar los sprites, y ponerle en create:
[gml]resource_list = ds_list_create();
loaded = 0;

// Agregar los sprites a la lista uno por uno.
ds_list_add(resource_list, "sprites/a.png");
ds_list_add(resource_list, "sprites/b.png");
ds_list_add(resource_list, "sprites/c.png");
// ...
[/gml]

En step:
[gml]if (loaded >= ds_list_size(resource_list)) {
    // Se terminaron de cargar todos los sprites.
    exit;
}
sprite_add(ds_list_find_value(resource_list, loaded), 1, true, false, 0, 0);
loaded += 1;[/gml]

En draw:
[gml]draw_rectangle(x, y, x + 100, y + 20, 1);
draw_rectangle(x, y, x + loaded / ds_list_size(resource_list) * 100, y + 20, 0);[/gml]

Y en destroyed:
[gml]ds_list_destroy(resource_list);[/gml]

Si querés cargar distintos tipos de recursos con distintos argumentos, deberías usar una ds_grid que guarde todos los datos necesarios en vez de una ds_list.
26
La variable debe estar en ob_reloj.
Para sumar sería:
[gml]ob_reloj.tiempo += 3;[/gml]
Y para restar:
[gml]ob_reloj.tiempo -= 3;[/gml]

Te recomendaría que aprendas a usar el programa antes de seguir con tu juego. Se nota que no sabés lo suficiente.
27
Primero, acá podés leer cómo funciona la sentencia for: http://www.comunidadgm.org/manual_GM/Sentencia_for.htm

Y bueno, el for exterior se ejecuta una vez por fila de corazones, mientras que para cada fila, el for interior se ejecuta una vez por corazón.
Por lo tanto la variable i es 0 cuando se está dibujando la primera fila y 1 cuando se está dibujando la segunda (y si decidieras agregar más, seguiría incrementándose con cada fila).
La variable j es 0 cuando se está dibujando el primer corazón de una fila, 1 cuando se está dibujando el segundo, etc.

Por lo tanto la posición en la que cada corazón debe dibujarse es:
x: x inicial + ancho del sprite * j.
y: y inicial + alto del sprite * i.

`i * hearts_per_row + j` se usa para calcular la cantidad total de corazones que han sido dibujados hasta ahora. Recordá que i es la cantidad de filas que se dibujaron hasta ahora (e.g. si se está dibujando la segunda, i es 1), por lo que multiplicar i por el total de corazones por fila resulta en la cantidad de corazones dibujados en todas las filas ya dibujadas. Si a eso le sumás j, o sea la cantidad de corazones dibujados en la fila actual, el resultado es el total de corazones dibujados.
La condición es esta:
[gml]
if (i * hearts_per_row + j + 1 > health) {
    // O sea, si el total de corazones dibujados + 1 es mayor a la
    // cantidad de corazones que tiene el personaje...

    // Quiere decir que ya se dibujaron todos los corazones necesarios,
    // así que:

    // Cambiar el valor de la i para que la condición del for exterior
    // no se cumpla y éste se rompa:
    i = heart_rows;

    // Y romper el for interior:
    break;
}[/gml]

Eso también se podría haber hecho con una variable extra que vaya contando la cantidad de corazones ya dibujados. Creo que así incluso sería un poco mejor ya que no se necesitaría ese cálculo innecesario. Te dejo a vos para que averigües cómo hacerlo si querés.

No tenés que ponerme en los créditos. En realidad un código así es bastante sencillo.

En fin, espero haberlo explicado bien. Decime si hay algo que no entiendas.
28
Supongo que tendrás algún tipo de loop. Lo que tenés que hacer es colocar el loop adentro de otro loop.
La verdad no sabría como hacerlo en D&D, pero con código sería así:

[gml]var first_x, first_y, heart_rows, hearts_per_row, heart_sprite, i, j;
first_x = 5;  // Coordenada x del primer corazón.
first_y = 5;  // Coordenada y del primer corazón.
heart_rows = 2;  // Número de filas de corazones.
hearts_per_row = 5;  // Número corazones por fila.
heart_sprite = sprHeart;  // Sprite que representa un corazón.

for (i = 0; i < heart_rows; i += 1) {
    for (j = 0; j < hearts_per_row; j += 1) {
        if (i * hearts_per_row + j + 1 > health) {
            i = heart_rows;
            break;
        }
        draw_sprite(
                heart_sprite, 0,
                first_x + sprite_get_width(heart_sprite) * j,
                first_y + sprite_get_height(heart_sprite) * i);
    }
}[/gml]

Tenés que rellenar las variables con los valores adecuados, y se asume que la variable health es la que indica la cantidad de corazones que tiene el personaje.
29
Bueno, sí, seguramente si hacés un spritesheet el resultado pese bastante menos, pero no creo que la diferencia sea tan importante como para preocuparse, al menos en un principio.
Yo te recomendaría que armes el juego importando los frames a GM. Si en un momento el peso de los sprites se vuelve un problema, ahí tratá de arreglarlo.
30
¿Estás seguro que lo que necesitás son spritesheets? ¿No estarás tratando de solucionar un problema inexistente? GM te permite cargar y animar sprites dentro del mismo programa. No veo razón para no usar esa característica, a no ser que quieras fabricar algún tipo de ultra-optimización, lo cual no es buena idea. Las reglas de la optimización son:
1) No lo hagas.
2) (Solo para expertos) No lo hagas todavía.
(Fuente.)