Avatar
Petr Stastny
Redaktor
Avatar
Petr Stastny:

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. července 21:32
Avatar
Petr Stastny
Redaktor
Avatar
Petr Stastny:

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. července 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.