Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Odstranění instance

C# .NET .NET (C# a Visual Basic) Odstranění instance American English version English version

Aktivity (1)
Avatar
magic44
Redaktor
Avatar
magic44:29.5.2014 11:23

Ahoj :), dělám hru a z důvodu spousty levlů, jsem se rozhosl, že bude jen jedna načítací třída (jeden GameScreen- viz. zdejší engine). První načtení funguje, ale když chci načíst novou mapu, tak mi nějak nejde vymazat minulí obsah, ani načíst nový :). Nešlo by nějak zničit celou instanci a založit jí znova?

Odpovědět 29.5.2014 11:23
Moudrý člověk nechce být lepší než ostatní, ale lepší, než byl sám včera.
Avatar
Gramli
Redaktor
Avatar
Gramli:29.5.2014 11:45

Podobný problém jsem řešil, ta třída kterou chceš smazat je form nebo klasická třída?
Pokud je to formulář vymaž mu všechny eventy, proměné. (promena = null, event -= metoda)
Pokud je to klasická třída, tak by mohlo stačit ji deklarovat i inicializovat v např. tlačíku pro spuštění a když ta třída udělá co měla vynuluj ji promene.

Editováno 29.5.2014 11:45
Nahoru Odpovědět 29.5.2014 11:45
Kdo to říká ten to je...
Avatar
Ľuboš Čurgó
Redaktor
Avatar
Odpovídá na magic44
Ľuboš Čurgó:29.5.2014 11:55

Pouzi destruktor

 
Nahoru Odpovědět 29.5.2014 11:55
Avatar
magic44
Redaktor
Avatar
Odpovídá na Ľuboš Čurgó
magic44:29.5.2014 11:59

A jak se takovy destruktor napise?

Nahoru Odpovědět 29.5.2014 11:59
Moudrý člověk nechce být lepší než ostatní, ale lepší, než byl sám včera.
Avatar
Gramli
Redaktor
Avatar
Odpovídá na Ľuboš Čurgó
Gramli:29.5.2014 12:25

Destruktor je ale volán automaticky.

Editováno 29.5.2014 12:27
Nahoru Odpovědět 29.5.2014 12:25
Kdo to říká ten to je...
Avatar
Ľuboš Čurgó
Redaktor
Avatar
Odpovídá na magic44
Ľuboš Čurgó:29.5.2014 12:40
class Test
    {
        ~Test()
        {
            Console.WriteLine("Zavolanie destruktora");
        }
    }

Ale to co som ti poradil je blbost v tvojom pripade, pouzi Gramilovu radu.

:edit, ano destruktor sa vola implicitne, moja chyba

Editováno 29.5.2014 12:45
 
Nahoru Odpovědět 29.5.2014 12:40
Avatar
magic44
Redaktor
Avatar
magic44:29.5.2014 12:42

Nevim, jestli destruktor pomůže, protože v té třídě načítám modely, obrázky atd. a je potřeba aby se vždy po dohraní daného levelu "od-načetly" (aby modely z 1. levelu nepřekážely v levelu druhém).

Nahoru Odpovědět 29.5.2014 12:42
Moudrý člověk nechce být lepší než ostatní, ale lepší, než byl sám včera.
Avatar
Martin
Člen
Avatar
Martin:29.5.2014 12:59

a metodu která vždy na začátku levelu nastavila proměný na výchozí stav (poprvé to udělá construktor) a pak na začátku nového levelu zavolat metodu.

Nahoru Odpovědět 29.5.2014 12:59
Je jedno co děláš, ale záleží jak dobře to umíš prodat.
Avatar
magic44
Redaktor
Avatar
Odpovídá na Martin
magic44:29.5.2014 13:13

To sice jo, ale tady jde o modely, ne o proměnné.

Nahoru Odpovědět 29.5.2014 13:13
Moudrý člověk nechce být lepší než ostatní, ale lepší, než byl sám včera.
Avatar
Odpovídá na magic44
Libor Šimo (libcosenior):29.5.2014 13:21

Pre každý level sú iné moduly, alebo sa len na daný level modifikujú?

Nahoru Odpovědět 29.5.2014 13:21
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Luboš Běhounek (Satik):29.5.2014 13:27

Jen vytvoříš novou instanci třídy Level (nebo Map/GamseScreen nebo jak se jmenuje), tím ta stará automaticky zanikne, pokud na ni neodkazuješ odnikud jinud (resp. je ti to fuk, jestli někde v paměti ještě chvíli bude nebo se smaže hned :) ).

Editováno 29.5.2014 13:28
Nahoru Odpovědět 29.5.2014 13:27
:)
Avatar
magic44
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
magic44:29.5.2014 13:35

Level se skládá z podlah a zdí a každý level je má jinak poskládané.

Nahoru Odpovědět 29.5.2014 13:35
Moudrý člověk nechce být lepší než ostatní, ale lepší, než byl sám včera.
Avatar
Gramli
Redaktor
Avatar
Odpovídá na magic44
Gramli:29.5.2014 13:48

Nevím jak to máš řešené, ale ideální je to mít tak, že ve třídě kde vykresluješ máš instanci třídy level, kterou jen přepisuješ. Když máš další level tak té instanci přiřadíš nový level a překreslíš.

Re: Satik
To nemusí být pravda, měl jsem s tím problém, že jsem vykresloval nový level a pod ním byl ještě starý:) (Ale to se týkalo formuláře, což byla třída která vykreslovala)

Nahoru Odpovědět 29.5.2014 13:48
Kdo to říká ten to je...
Avatar
magic44
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
magic44:29.5.2014 14:00

Když po ukončení levelu GameScreen odeberu a pak ho na začátku znova založím, tak to funguje :) díky moc všem. Sice se teď nevykreslují ostatní GameScreen (pro pausu atd.), ale tohle je velký pokrok :)

Editováno 29.5.2014 14:01
Nahoru Odpovědět 29.5.2014 14:00
Moudrý člověk nechce být lepší než ostatní, ale lepší, než byl sám včera.
Avatar
magic44
Redaktor
Avatar
Odpovídá na Gramli
magic44:29.5.2014 14:02

Jdu zkusit :)

Nahoru Odpovědět 29.5.2014 14:02
Moudrý člověk nechce být lepší než ostatní, ale lepší, než byl sám včera.
Avatar
Odpovídá na Gramli
Luboš Běhounek (Satik):29.5.2014 14:19

To netuším, jak jsi to měl udělané :D

Nahoru Odpovědět 29.5.2014 14:19
:)
Avatar
Michal Žůrek (misaz):29.5.2014 14:21

není nejjednoduší cesta udělat tu proměnnou/attribut nullable a nastavit ho na null? Pak přece ztratí všechny refertence a až bude třeba bude z paměti odstraněn.

Nahoru Odpovědět 29.5.2014 14:21
Nesnáším {}, proto se jim vyhýbám.
Avatar
Luboš Běhounek (Satik):29.5.2014 14:28

Uh.
Použití Nullable tu nedává moc smysl, to se používá, když potřebuješ mít možnost uložit Null u něčeho, kde to běžně nejde - např. číslo, bool, structy apod., :)

Obvykle ve hrách je nějaká třída Game, která všechno zastřešuje, a ta má u sebe odkaz na Level.
Pokud měním Level, tak stačí jen vytvořit novou instanci Levelu a nahradit jím tu původní, ta původní zanikne, až si jí všimne GC (neměl bys na tu instanci Levelu odkazovat nikde jinde).

Editováno 29.5.2014 14:29
Nahoru Odpovědět  +1 29.5.2014 14:28
:)
Avatar
Gramli
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Gramli:29.5.2014 14:35

Popravdě? :D Dost blbě :D:D

Nahoru Odpovědět 29.5.2014 14:35
Kdo to říká ten to je...
Avatar
magic44
Redaktor
Avatar
magic44:29.5.2014 14:50

Tak nakonec jsem to udělal Satikovou metodou :D (nová instance), a problém s vykreslováním ostatních GameScreen taky vyřešen. Díky moc všem :)

Nahoru Odpovědět 29.5.2014 14:50
Moudrý člověk nechce být lepší než ostatní, ale lepší, než byl sám včera.
Avatar
xxxvodnikxxx
Člen
Avatar
xxxvodnikxxx:29.5.2014 18:04

Rozkouskuj si to..
Co máš v konstruktoru co ti nastavuje "defaultní stav" si vyhoď do vedlejší metody- při nejlepším private pokud to děláš v daný třídě /formu (všechno je v podstatě třída).

No a potom při načtení novýho levelu vždycky nejdřív zavoláš tu co ti nastaví na default a následně nějakou další která si vykreslí spec. level

Tak něco? ;)

Nahoru Odpovědět 29.5.2014 18:04
Unix- svět, kde chcete být nulou :) (UID)
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 21 zpráv z 21.