Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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: přístup z jiné třídy k vlastnosti tlačítka

Aktivity
Avatar
Mediel
Tvůrce
Avatar
Mediel:3.11.2012 15:40

Ahoj přítelé,

na formulář vytvářím za běhu programu tlačítka, mají svojí vlastnost Location. A já bych potřeboval v jiné třídě tuto vlastnost zjistit. Přesněji, vyhledat tlačítko podle jeho lokace a vykonat na něm nějakou změnu, třeba barvy.

Metoda v třídě:

public static void OdeberDamuNaSachovnici(int x, int y)
       {
           HraciPole.iSachovnice[x, y] = 0;
           HraciPole.iZbyvaDam++;
           // zde nejak potrebuji dohledavat tlačítko pomocí souřadnic x,y
       }

tlačítka vytvářím podle: http://www.itnetwork.cz/…092f97368b01

Odpovědět
3.11.2012 15:40
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Mediel
matesax:3.11.2012 16:11

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.Con­tains(calcula­ted)

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(nazevTridy­ZeKtereChcesCer­pat nazev)

a pak si ji uložit do proměnné. Nebo si takto předat list. Atd...

 
Nahoru Odpovědět
3.11.2012 16:11
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Mediel
David Hartinger:3.11.2012 17:38

To zní jako špatný přístup, šachovnici bys měl vykreslovat na nějaké plátno.

Nahoru Odpovědět
3.11.2012 17:38
You are the greatest project you will ever work on.
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:3.11.2012 17:53

Nešlo by ty tlačítka předat ?

Nahoru Odpovědět
3.11.2012 17:53
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Mediel
Tvůrce
Avatar
Mediel:3.11.2012 18:49

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 :)

Nahoru Odpovědět
3.11.2012 18:49
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Mediel
matesax:3.11.2012 22:49

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ášť...

Editováno 3.11.2012 22:51
 
Nahoru Odpovědět
3.11.2012 22:49
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:3.11.2012 22:55

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 :) )

 
Nahoru Odpovědět
3.11.2012 22:55
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Mediel
David Hartinger:4.11.2012 13:46

Řešení mě napadá úplně tupé, prostě je tam budu dávat tak dlouho, dokud nebude platit, že se neohrožují :D 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.

Editováno 4.11.2012 13:47
Nahoru Odpovědět
4.11.2012 13:46
You are the greatest project you will ever work on.
Avatar
Mediel
Tvůrce
Avatar
Mediel:4.11.2012 14:05

Ř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...

Nahoru Odpovědět
4.11.2012 14:05
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Mediel
David Hartinger:4.11.2012 14:13

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.

Nahoru Odpovědět
4.11.2012 14:13
You are the greatest project you will ever work on.
Avatar
Mediel
Tvůrce
Avatar
Mediel:4.11.2012 14:40

Dobře a jak by tedy vypadalo kreslení na plátno? Jak se tam pak budu orientovat v políčkách? A pod :)

Nahoru Odpovědět
4.11.2012 14:40
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Mediel
matesax:4.11.2012 15:23

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...

Editováno 4.11.2012 15:24
 
Nahoru Odpovědět
4.11.2012 15:23
Avatar
matesax
Tvůrce
Avatar
matesax:4.11.2012 15:35
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

  • 1, 2
  • 1, -2

a zde by kůň měl maximum kroků 1.

Dáma:

1, 1
0, 1
0, -1

  • 1, 0
  • 1, -1,

...

A kroků nekonečno...

Editováno 4.11.2012 15:38
 
Nahoru Odpovědět
4.11.2012 15:35
Avatar
matesax
Tvůrce
Avatar
matesax:4.11.2012 15:47

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...

 
Nahoru Odpovědět
4.11.2012 15:47
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Mediel
David Hartinger:4.11.2012 17:27

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.

Nahoru Odpovědět
4.11.2012 17:27
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:4.11.2012 18:46

Proč vykreslovat cyklem? (Když to může udělat jako Drawable componentky...)

 
Nahoru Odpovědět
4.11.2012 18:46
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:4.11.2012 18:50

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ěď.

Nahoru Odpovědět
4.11.2012 18:50
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:4.11.2012 19:09

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...

 
Nahoru Odpovědět
4.11.2012 19:09
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:4.11.2012 19:32

To máš zaprvé špatně a zadruhé s cykly, tak sem prosím už nepiš, děkuji.

Nahoru Odpovědět
4.11.2012 19:32
You are the greatest project you will ever work on.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:4.11.2012 19:40

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?

 
Nahoru Odpovědět
4.11.2012 19:40
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:4.11.2012 19:54

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.

Nahoru Odpovědět
4.11.2012 19:54
You are the greatest project you will ever work on.
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.