Octubre 15, 2013, 11:02:52 PM Ultima modificación: Octubre 16, 2013, 02:21:06 PM por seed86
Estoy intentando hacer un sistema de vida estilo zelda, tan solo unos corazones en la zona superior izquierda de la pantalla, cuando el personaje recibe un golpe desaparece un corazón entero (nada de cuartos y medios corazones). Usando D&D consigo hacer que salgan todos en la misma línea pero me gustaría saber cómo hacer para que, en caso de superar los 5 corazones comenzasen a dibujarse en otra fila por debajo de esta, de forma que quedasen dos filas de 5 corazones en lugar de una de 10.

Algo así:

#1 Octubre 16, 2013, 01:35:26 AM Ultima modificación: Octubre 17, 2013, 11:38:39 PM por Wadk
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.
Vim.

Wow! Increible, funcionó a la perfección. Muchísimas gracias! tan solo me gustaría entender como funcionan las variables "i" y "j" que has usado en este código. sobre todo en la línea que dice "i * hearts_per_row + j + 1 > health"

De nuevo muchísimas gracias, si lo deseas tu nombre puede salir en los créditos por la ayuda prestada.
Un saludo

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

Creo que lo he entendido. Muchísimas gracias, me acabas de dar toda un clase gratuita.
Eres un fenómeno. 8)