Diskuze: přístup z jiné třídy k vlastnosti tlačítka
Tvůrce
Zobrazeno 21 zpráv z 21.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Máš mnoho možností. Já bych na to šel:
Zaprvé odečti z aktuální pozice celočíselný zbytek po dělení velikostí jednoho políčka:
calculatedPosition = actualPosition - (actualPosition % velikostPolíčka)
No a pak musíš mít list pozic - a jen se zeptáš:
seznamPozic.Contains(calculated)
Pokud ano, jeho index se dozvíš přes metodu - .IndexOf(...) - tím se k němu dostaneš. A pro komunikaci mezi trídami máš také hodně možností:
poslat si někde v parametru třídu, ze které chceš čerpat:
ddd(nazevTridyZeKtereChcesCerpat nazev)
a pak si ji uložit do proměnné. Nebo si takto předat list. Atd...
To zní jako špatný přístup, šachovnici bys měl vykreslovat na nějaké plátno.
Nešlo by ty tlačítka předat ?
Ano, víceméně se snažím vytvořit hru, kde uživatel bude na šachovnici
pokládat až 8 dam, tak aby se vzájemně neohrožovaly. Pakliže položí
dámu a ta ohrožuje nějakou jinou, tak ty ohrožené zmizí. A zůstanou pouze
ty neohrožené a ta nová.
Asi bych uvítal drobnou pomoc. Jak s řešením, tak s kóděním
XNA? To by bodlo řekl bych. Rozdělil bych reálnou velikost od políčkové. Tedy až při vykreslení bych převáděl na políčkovou - vynásobením pozice velikostí políčka. Takže pak akorát vydělíš pozici myši velikostí políčka - celočíselně a to pak použiješ při dotazu na existenci. A napsal bych to objektově - takže bych v každé figurce vytvářel event click - a to v případě, že list bude obsahovat aktuální pozici myši (zde můžeš zavolat hover) a současně bude levé tlačítko myši dole. Při hover můžeš udělat nějaký efekt. A k listu bych se dostal uložením Game do proměnné v konstruktoru (hlavní Game bych dal jako parametr tohoto konstruktoru) - abych si pořád nepřehazoval ten list - a byl by pochopitelně public. A pak bych dal figurce Name - a při vytváření figurky každé dal jiné jméno a stejnou metodu na Click - a v ní pak panoval switchem. Já to dělal tak, že jsem dal každé figurce maximální dosah a směry, ve kterých se může pohybovat. (opět v políčkové grafice) Takže při kliknutí jsem započal první cyklus - opakování podle počtu kroků a v něm jsem projížděl druhým cyklem v seznamu možných kroků. Každý krok jsem si zaznamenal v případě, že-li bylo to políčko prázdné, jinak jsem testoval, zda tam není protihráč. (v tom případě jej přidal do seznamu protihráčových možných sejmutelných figurek) A ke všem vhodným krokům jsem přidával další a další - podle počtu kroků. Pak jsem volné pozice vykreslil s efektem a s jiným zase ty, na kterých byl protihráč. Tento seznam se vymazal v případě kilknutí na jinou figurku. Po kliknutí do volné pozice, se tam přesunula, jinak při kliknutí na hráče jej sejmula z plochy a zaujmula jeho místo. Jediným problémem bylo, že některé figurky mohou sejmout protihráče v netypických pozicích - to jsem zařídil potencionálními kroky - ty se testovali zvlášť...
Totiž Game máš v komponentce - ale tohle chce přímo třídu zděděnou z game. A málem bych zapomněl - pozice a hráče jsem udělal přes slovník - podle pozice jsem tak mohl snadno dostat hráče...
testovaly (je noc )
Řešení mě napadá úplně tupé, prostě je tam budu dávat tak dlouho, dokud nebude platit, že se neohrožují Již jsem to jednou psal, jde to hezky cykly, položím jednu, pak zkouším druhou, pak třetí a tak. Pokud jsem zkusil vše a nejde položit další, posunu tu poslední a zkouším dál.
Je to klasická algoritmizační úloha, možná to jde lépe, nevím, ale zas tak velká ta šachovnice není, aby to tímhle způsobem nešlo udělat.
Určitě to udělej v XNA, stačí ti jen vykreslovat sprity do mřížky, to je triviální, případně viz. tutoriály. Pokud to chceš spíše jako aplikaci, jde to i bez XNA, kresli na plátno formuláře nebo na nějaký picturebox.
Řeším to tak, že při vytovření formuláře si vytovřím 8*8 tlačítek o rozměru 50*50. Tlačítko rozmístim jako na šachovnici, nastavím jim backgroundColor.
Při kliknutí na tlačítko testuji jeho backgroundColor, pokud je jiná, než zelená (barva pro dámu), tak umístim dámu, pokud je zelená, dámu odeberu.
Co potřebuji udělat ja, aby při umístění dámy se zkontrolovalo, zda nekdě nově umístěná dáma neohrožuje již dříve umíštěnou dámu. Pakliže ano, tak dřívě umístěné dámy odstranit. A zde je ten kámen úrazu. Dámy ukládám do pole, s tím vší jsem se nějak popral, ale co mi nejde, je, že pokud vynuluji souřadnici s dámo, co má zmizet, tak aby se zavolala nějaká metoda, co by změnila i barvu tlačítka na původní. To potřebuji...
No protože to máš blbě navržené, kresli to na plátno a na tlačítka se vykašli, pak si jen zavoláš překresli() a bude vše podle toho pole.
Achjo - již jsem ti to psal... Počítej v políčkové grafice - a při vykreslení akorát vynásobíš tu pozici velikostí políčka...
Pročti si to moje - nechce se mi to psát znovu... Porstě figurky budou vykreslovatelné componentky a nazávisle se vykreslovat. V update si pohlídáš jak jsem psal - hover a click. A při clicku provedeš tu kontrolu volných pozic - popř pozic hráče - každá větev cyklu pro možné směry se ukončí v momentě, kdy dorazí k překážce - a tedy k hranici plochy - proto se hnedle šikne počítání v políčkové grafice - dáš jen omezení - ddd < 8... Tím budeš mít v celé aplikaci 2 cykly - a to ty na kontrolu pozic...
for (int krok = 0; krok < mozneKroky.Count; krok++)
{
dosazenaPozice = aktualniPozice;
for (int pozice = 0; pozice < velikostStranyPlochy; pozice++)
{
dosazenaPozice += mozneKroky[krok];
if (seznamPozicProtihrace.Contains(dosazenaPozice))
break;
if (seznamPozicTohotoHrace.Contains(dosazenaPozice))
{
seznamPozicKdeMuzuSejmoutProtihrace.Add(disazenaPozice);
break;
}
}
}
mozneKroky je seznam Vector2, kda kůň by měl:
1, 2
1, -2
a zde by kůň měl maximum kroků 1.
Dáma:
1, 1
0, 1
0, -1
...
A kroků nekonečno...
Pardon - oprava:
for (int krok = 0; krok < mozneKroky.Count; krok++)
{
dosazenaPozice = aktualniPozice;
for (int pozice = 0; pozice < velikostStranyPlochy; pozice++)
{
dosazenaPozice += mozneKroky[krok];
if (seznamPozicProtihrace.Contains(dosazenaPozice))
{
seznamPozicKdeMuzuSejmoutProtihrace.Add(disazenaPozice);
break;
}
if (seznamPozicTohotoHrace.Contains(dosazenaPozice))
break;
}
}
A ještě přidáš podmínku, zda ta pozice není mimo hrací plochu...
Ty máš pořád špatný přístup, spojuješ vykreslení a logiku. Orientuješ se v políčkách v tom poli v paměti, vše děláš v paměti a vykreslení je úplně oddělené, které tu paměť jen zobrazí uživateli. K vykreslení 2d pole ti stačí 2 cykly v sobě, je to u toho tutoriálu na Tetris v sekci XNA, podívej se na třídu Kostka nebo HraciPlocha, jsou to 2d pole a někde májí něco jako metodu Vykresli nebo Draw.
Proč vykreslovat cyklem? (Když to může udělat jako Drawable componentky...)
Komponenty slouží k rozdělování kódu, neposkytují žádnou logiku navíc. Jsem velice zvědavý na to, jak bez cyklů vykreslíš dvourozměrné pole. Těším se na odpověď.
Tak jak jsem psal - žádné nemám... Všechny figurky se vykreslují sami a logika je mimo... A v celé aplikaci mám 2 cykly...
To máš zaprvé špatně a zadruhé s cykly, tak sem prosím už nepiš, děkuji.
A ty to také chceš s cykly - vysvětli mi, jak zjistit volná pole bez cyklu. A také mi vysvětli, co je na tom špatně... Od čeho ta komponentka je? Aby se v Draw, která je často voláná neustále projíždělo cyklem?
Tohle je tu pořád, začneš posílat tuny kódu a nesmyslných rad někam, kde vůbec nerozumíš problematice. Nemám sílu ti vysvětlovat, jak funguje 2d pole a ani proč se nehodí dělat nějaký seznam pozic, jak fungují komponenty a že v problému 8mi dam není protihráč. Vůbec nevíš, která bije. Podívej se, jak to vlákno teď vypadá, takových vláken jsou tu desítky. Koleduješ si o ban.
Zobrazeno 21 zpráv z 21.