Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
matesax
Tvůrce
Avatar
matesax:12.10.2012 13:51

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 Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:12.10.2012 14:05

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
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:12.10.2012 14:07

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
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:12.10.2012 14:08

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
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:12.10.2012 14:27

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 Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:12.10.2012 15:52

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
You are the greatest project you will ever work on.
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.