Diskuze: přístup z jiné třídy k vlastnosti tlačítka
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 21 zpráv z 21.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.