Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
hodlám udělat celou hru formou spritů tvořených náhodnými znaky. Tedy nechci jen vykreslovat napsaný string - například proto, že by to bylo nevzhledné - nesedělo by to k sobě (různé znaky = různá velikost), těžkopádnost, chci náhodné znaky... Vyřešil jsem to takto (Chci takto dělat i animace - proto je to pole polí polí - jedná se o pole sekvencí):

using System;

namespace Cunteka
{
    public class Hero
    {
        public bool[][][] frames = new bool[][][]
        {
            new bool[][]
            {
                new bool[]
                {
                    false, false, false, true, true, false, false, false
                },

                new bool[]
                {
                    false, false, true, true, true, true, false, false
                },

                new bool[]
                {
                    false, false, true, true, true, true, false, false
                },

                new bool[]
                {
                    false, false, false, true, true, false, false, false
                },

                new bool[]
                {
                    true, true, true, true, true, true, true, true
                },

                new bool[]
                {
                    true, false, true, true, true, true, false, true
                },

                new bool[]
                {
                    true, false, true, true, true, true, false, true
                },

                new bool[]
                {
                    true, false, true, true, true, true, false, true
                },

                new bool[]
                {
                    true, false, true, true, true, true, false, true
                },

                new bool[]
                {
                    true, false, true, true, true, true, false, true
                },

                new bool[]
                {
                    true, false, true, false, false, true, false, true
                },

                new bool[]
                {
                    false, false, true, false, false, true, false, false
                },

                new bool[]
                {
                    false, false, true, false, false, true, false, false
                },

                new bool[]
                {
                    false, false, true, false, false, true, false, false
                },

                new bool[]
                {
                    false, false, true, false, false, true, false, false
                },

                new bool[]
                {
                    false, false, true, false, false, true, false, false
                },

                new bool[]
                {
                    false, true, true, false, false, true, true, false
                }
            }
        };
    }
}
int X = x;

foreach (bool[] line in hero.frames[0 - zde bude proměnná (nebude-li lepší řešení)])
{
    foreach (bool part in line)
    {
        string letter = Convert.ToChar(r.Next(97, 122)).ToString();
        Rectangle rectToCenterIn = new Rectangle(X, y, 12, 12);

        if (part)
            spriteBatch.DrawString(mainFont, letter, new Vector2(rectToCenterIn.Left, rectToCenterIn.Top) + (new Vector2(rectToCenterIn.Width, rectToCenterIn.Height) - mainFont.MeasureString(letter)) / 2, Color.RoyalBlue); // vycentrování charu

        X += 12;
    }

    X = x;
    y += 12;
}

Problém - proč tu píši je jasný - cykly. Nevím, jestli by toto bylo dobré řešení, kdybych se jen vyhnul cyklům (třeba tak, že bych sprite postavil jen jednou - s proměnnými - a jen do nich dosazoval) - ale to jak píši, to bych jen udržoval stávající řešení. Napadá Vás lepší? Děkuji.

Editováno 12.10.2012 13:52
 
Odpovědět 12.10.2012 13:51
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

Spíše než cyklům bych se vyhnul té příšerné deklaraci nahoře, to patří do souboru, si udělej třeba texťák, kde bude:

001100
010010
010010
001100

To si načti. Nechápu tu třetí dimenzi, k čemu je? Stačí ti přeci tohle, jestli tam chceš náhodné znaky, tak místo jedniček měň v update nějaké ASCII hodnoty, jen si vyber jednu, co bude označovat prázdno.

Nahoru Odpovědět 12.10.2012 14:05
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

Jo už chápu, to jsou políčka animace. Stejně bych to raději dal do jednoho pole typu Frame (struktura co obsahuje ty políčka), tyhle pole jsou cesta do pekla. Celé by to mohlo být jako struktura Sprite, obsahovat věci jako rychlost animace a tak. Prostě abys s tím pracoval jako s objekty a ne s x-rozměrným polem.

Editováno 12.10.2012 14:08
Nahoru Odpovědět 12.10.2012 14:07
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

No to mi na cyklech jen přidá... :) Chtěl jsem se vyhnout kopírování (z tvé práce) a práci se soubory. Ty cykly vidím jako problém kvůli tomu, že jak píši - chci tak udělat celý svět...

A jak si budu uchovávat jednotlivé snímky?

Editováno 12.10.2012 14:10
 
Nahoru Odpovědět 12.10.2012 14:08
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Čápka
matesax:

Což takhle?

public string[][] frames = new string[][]
{
    new string[]
    {
        "00011000",
        "00111100",
        "00111100",
        "00011000",
        "11111111",
        "10111101",
        "10111101",
        "10111101",
        "10111101",
        "00100100",
        "00100100",
        "00100100",
        "00100100",
        "01100110"
    }
};
int X = x;

foreach (string line in hero.frames[0])
{
    foreach (char part in line)
    {
        string letter = Convert.ToChar(r.Next(97, 122)).ToString();
        Rectangle rectToCenterIn = new Rectangle(X, y, 12, 12);

        if (part == '1')
            spriteBatch.DrawString(mainFont, letter, new Vector2(rectToCenterIn.Left, rectToCenterIn.Top) + (new Vector2(rectToCenterIn.Width, rectToCenterIn.Height) - mainFont.MeasureString(letter)) / 2, Color.RoyalBlue);

        X += 12;
    }

    X = x;
    y += 12;
}
Editováno 12.10.2012 14:29
 
Nahoru Odpovědět 12.10.2012 14:27
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

Z hlediska návrhu nemají data ve zdrojáku co dělat, ta patří mimo. V kódu má být logika. Snímky zapíšeš za sebe, jako jsem to dělal třeba u těch kostek v Tetrisu. Takový soubor poté naparsuješ jako instance Snimek a uložíš do instance Sprite, což bude kolekce snímků.

Nahoru Odpovědět 12.10.2012 15:52
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.