Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

Diskusia – 6. diel - Hra JellyBox v MonoGame - Sugar a Menu

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
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);
                }
        }
}
Editované 22.11.2013 13:48
Odpovedať
22.11.2013 11:39
New kid back on the block with a R.I.P
Avatar
Odpovedá 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.

Odpovedať
22.11.2013 13:44
Časem je vše možné.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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();
Editované 22.11.2013 13:52
Odpovedať
22.11.2013 13:52
New kid back on the block with a R.I.P
Avatar
Odpovedá 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.

Odpovedať
22.11.2013 13:53
Časem je vše možné.
Avatar
Odpovedá na David Hartinger
Jakub Lásko[Saarix]:22.11.2013 13:53

Ano to máš naprostou pravdu :-)

Odpovedať
22.11.2013 13:53
Časem je vše možné.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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.

Odpovedať
22.11.2013 13:54
New kid back on the block with a R.I.P
Avatar
Odpovedá 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?

Odpovedať
22.11.2013 14:23
Časem je vše možné.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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.

Odpovedať
22.11.2013 14:27
New kid back on the block with a R.I.P
Avatar
Odpovedá 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í.

Odpovedať
22.11.2013 14:35
Časem je vše možné.
Avatar
Roman Harna
Člen
Avatar
Odpovedá 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í?

 
Odpovedať
17.9.2023 15:56
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!