NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Diskuze – Lekce 6 - Hra JellyBox v MonoGame - Sugar a Menu

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:22.11.2013 11:39

Chlape, ta kontrola kolize je nějaká divná. Určitě nikdy nepoužívej for cykly místo foreache, když nepotřebuješ index. GetType lze v tomto případě nahradit operátorem is. Co mi není jasné je ten if.. else uvnitř. V else je ta samá podmínka jako v původní if, jen bez pravé části. Kód:

Vymazání se tedy provede vždy, pokud platí:

(boxes[i].GetType() != typeof(ToxicBox)

Trochu jsem to refaktoroval, ale protože nevím co to má přesně dělat, je dost možné, že jsem to udělal blbě, zkus na to ještě kouknout:

foreach (Box box in boxes)
{
        foreach (Box okolni in boxes)
        {
                if ((box != okolni) &&
                        (box.GetRectangle().Intersects(okolni.GetRectangle())) &&
                        (!(box is SugarBox || okolni is SugarBox)))
                {
                        okolni.Delete = (!okolni is ToxicBox);
                }
        }
}
Editováno 22.11.2013 13:48
Odpovědět
22.11.2013 11:39
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Jakub Lásko[Saarix]:22.11.2013 13:44

Dobrá, díky za radu, je pravda že na zrovna na tento kus zasahování želé do sebe jsem od doby vytvoření vůbec nekoukl, takže na to mrknu.

Odpovědět
22.11.2013 13:44
Časem je vše možné.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jakub Lásko[Saarix]
David Hartinger:22.11.2013 13:52

Ono by bylo nejlepší dát to do metody kolize pro každý objekt. Dávat tolik cyků do sebe a ifovat typy vždycky signalizuje, že v návrhu je něco špatně.

Tohle by vypadalo mnohem lépe:

foreach (Box box in boxes)
   box.kontrolaKolize();
Editováno 22.11.2013 13:52
Odpovědět
22.11.2013 13:52
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Jakub Lásko[Saarix]:22.11.2013 13:53

Tak jsem to přepsal prakticky skoro přesně dle kódu co jsi tu poznamenal a funguje to, for jsem občas používal místo foreache, protože jsem u vícekrát zažil, že když jsem přes to dělal kolizi a mazal, tak mě jiný foreach vyhodil error, že došlo ke změně kolekce.

Odpovědět
22.11.2013 13:53
Časem je vše možné.
Avatar
Odpovídá na David Hartinger
Jakub Lásko[Saarix]:22.11.2013 13:53

Ano to máš naprostou pravdu :-)

Odpovědět
22.11.2013 13:53
Časem je vše možné.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jakub Lásko[Saarix]
David Hartinger:22.11.2013 13:54

Kolekci nesmíš při iteraci nikdy modifikovat. Foreach si to hlídá, for tě to nechá udělat, ale zaděláváš si tím na problémy, jelikož se změní indexy. Další důvod ho nepoužívat.

Odpovědět
22.11.2013 13:54
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Jakub Lásko[Saarix]:22.11.2013 14:23

Kdy by tím pádem bylo ideální provádět reálné mazání, abych se vyhnul tomuto erroru?

Odpovědět
22.11.2013 14:23
Časem je vše možné.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jakub Lásko[Saarix]
David Hartinger:22.11.2013 14:27

Mazání máš ve své aplikaci udělané přes Vlastnost Delete, předpokládal jsem, že je to kvůli tomu. Trik je v tom smazat položky až po iteraci. To uděláš samozřejmě tak, že položku označíš jako ke smazání. Buď nějkou její vlastností enbo možná čistěji tak, že je dáš do nějakého listu keSmazani. Ten poté proiteruješ a z prvního listu vymažeš tyto položky.

Odpovědět
22.11.2013 14:27
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Jakub Lásko[Saarix]:22.11.2013 14:35

Aha mazané :-) Ano ta vlastnost Delete je tam přesně kvůli tomu, jen jsem takto přesně nechápal ten postup s iterací.

Odpovědět
22.11.2013 14:35
Časem je vše možné.
Avatar
Roman Harna
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
Roman Harna:17.9.2023 15:56

Ahoj, bude tady někdy zbytek JellyBoxu. Nebo máš to někde hotové k nahlédnutí?

 
Odpovědět
17.9.2023 15:56
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 10 zpráv z 10.