NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Petr Šťastný
Tvůrce
Avatar
Petr Šťastný:19.7.2016 21:32

Ahoj, tak jsem se rozhodl, že si naprogramuju hru, abych měl co o prázdninách bez netu hrát :) V konzoli to šlape dobře, takže jsem se to rozhodl přepsat do XNAčka. A teď k problému:

V jedné třídě mám List všech buněk (políček) ve hře. Když hru spustím, tak to funguje skvěle. Ale když se vrátím na hlavní obrazovku (bez restartu hry) a znovu si načtu nějakou mapu a nakreslí se mi na obrazovku mapa, tak se mi vykreslí divně (políčka jsou posunuta, můj skromný odhad je, že se to posune doleva a přes okraj to -nějak- přeleze doprava, nebo to jde doprava rovnou... Prostě to je divný. Zkoušel jsem to řešit několika způsoby a teď to dělám tak, že po návratu na hlavní menu se hra restartuje, ale trvá to několik vteřin, je to hnusné a ošklivé řešení a ve fullscreenu si to ani nedokážu představit.

Návrat do hlavního menu:

if (hra.klavesa.Contains(Keys.Escape))
            {
                //     hra.PrepniHerniObrazovku(hra.komp_menu);
                string cestaAplikace = System.Reflection.Assembly.GetEntryAssembly().Location;
                Process.Start(cestaAplikace);
                hra.Exit();
            }

Načítání mapy:

foreach(string s in UlozeneHry)
            {
                if (y >= 500)
                    break;
                // TODO: druha stranka


                // Vypis vsechny ulozene hry
                char[] sep = "---".ToCharArray();
                hra.spriteBatch.DrawString(font_Small, System.IO.Path.GetFileNameWithoutExtension(s).Split(sep)[0], new Vector2(200, y), Color.White);

                // Zde nacitam mapu a prehazuju pohled na samotnou hru (herni mapu)
                if(hra.VygenerujObdelnik(System.IO.Path.GetFileNameWithoutExtension(s).Split(sep)[0], 200, y).Contains(new Point(hra.mys.X, hra.mys.Y)) && hra.mys.LeftButton == ButtonState.Pressed && hra.ButtonAllowed)
                {
                    Logic.Players.Reset();
                    if (hra.komp_settings.sett_SoundEffects)
                        seff_Click.Play();

                    hra.ButtonAllowed = false;
                    Logic.MotherCell.motherCells.Clear();
                    //Logic.MotherCell.motherCells = Logic.MotherCell.listMap[i]
                    Logic.MotherCell.motherCells = gen.Generuj(UlozeneHry[i]).ToList();
                    hra.PrepniHerniObrazovku(hra.komp_gamemap);
                    break;
                }


                i++;
                y += 40;
            }

Vykreslení mapy:

x = 20;
            y = 50;
            foreach (Logic.MotherCell mc in motherCell.GetCells())
            {

                Texture2D texturaPolicka = img_tile_plains_normal_bar;

                // Kdyz to policko nema byt prazdne
                if (mc.MaxArmy > 0)
                {
                    // Vyber bunku
                    if (new Rectangle(x, y, 32, 32).Contains(new Point(hra.mys.X, hra.mys.Y)) && hra.mys.LeftButton == ButtonState.Pressed && hra.ButtonAllowed)
                    {
                        hra.ButtonAllowed = false;

                        if (hra.komp_settings.sett_SoundEffects)
                            seff_Click.Play();

                        vybranaBunka = mc;
                        if (vybranaBunka == cilovaBunka)
                            cilovaBunka = null;
                    }

                    // Vyber bunku, na kterou chces zautocit (nebo do ktere chces rekrutovat)
                    if (new Rectangle(x, y, 32, 32).Contains(new Point(hra.mys.X, hra.mys.Y)) && hra.mys.RightButton == ButtonState.Released && mysPosledne == ButtonState.Pressed && hra.ButtonAllowed)
                    {
                        hra.ButtonAllowed = false;
                        if (hra.komp_settings.sett_SoundEffects)
                            seff_Click.Play();

                        cilovaBunka = mc;
                    }

                    // Prosvetli bunku, na ktere je hrac mysi (vyber bunky, na kterou chce hrac zautocit, nebo do ni chce rekrutovat)
                    if (new Rectangle(x, y, 32, 32).Contains(new Point(hra.mys.X, hra.mys.Y)) && hra.mys.RightButton == ButtonState.Pressed && hra.ButtonAllowed)
                    {
                        hra.ButtonAllowed = false;
                        cilovka = mc;
                    }


                    // Nastav barvu bunky
                    switch (mc.Owner)
                    {
                        case 0:
                            texturaPolicka = img_tile_plains_normal_blue;
                            break;
                        case 1:
                            texturaPolicka = img_tile_plains_normal_green;
                            break;
                        case 2:
                            texturaPolicka = img_tile_plains_normal_yellow;
                            break;
                        case 3:
                            texturaPolicka = img_tile_plains_normal_red;
                            break;
                    }
                    if (cilovka == mc)
                    {
                        if (!recruit)
                            hra.spriteBatch.Draw(texturaPolicka, new Rectangle(x, y, 32, 32), Color.Red * 0.9F);
                        else
                            hra.spriteBatch.Draw(texturaPolicka, new Rectangle(x, y, 32, 32), Color.Green * 0.9F);
                    }
                    else if (vybranaBunka == mc)  // Kdyz je policko vybrano, vykresli ho sede
                    {
                        hra.spriteBatch.Draw(texturaPolicka, new Rectangle(x, y, 32, 32), Color.White * 0.8F);
                    }
                    else if (cilovaBunka == mc)
                    {
                        if (!recruit)
                            hra.spriteBatch.Draw(texturaPolicka, new Rectangle(x, y, 32, 32), Color.Red * 0.9F);
                        else
                            hra.spriteBatch.Draw(texturaPolicka, new Rectangle(x, y, 32, 32), Color.Green * 0.9F);
                    }
                    else
                        hra.spriteBatch.Draw(texturaPolicka, new Rectangle(x, y, 32, 32), Color.White);


                }
                // Vykresli to na pozici, kdyz je konec radku, udelej mezeru
                if ((i + 1) % Logic.Players.DelkaMapy == 0)
                {
                    y += 32;
                    x = 20;
                }
                else
                {
                    x += 32;
                }


                i++;
            }

Za každou pomoc budu rád. Kdyby někdo potřeboval, dodám další kódy a screenshoty.

 
Odpovědět
19.7.2016 21:32
Avatar
Petr Šťastný
Tvůrce
Avatar
Petr Šťastný:19.7.2016 21:38

Tady je, jak mapa vypadá:
http://prntscr.com/buxr2b

A tady, jak vypadá po restartu hry:
http://prntscr.com/buxrmy

Všechno to funguje, útočení, všechno. Jenom je to posunuté. A taky bych dodal, že když v jednom kuse načítám 1 mapu, tak to je v pohodě. Ale jakmile načtu 1 - jinou - 1 (nebo i jinou), tak už to je takhle...

 
Nahoru Odpovědět
19.7.2016 21:38
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 2 zpráv z 2.