Diskuze: Pomoc s JavaME
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 37 zpráv z 37.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
To druhý byla blbá poznámka Spíš do toho nikdo nechce
Já vím, ale vidíš, že ses ozval alespoň ty Fakt se jedná jen o cca dvě
otázky. Když ne o spritech, tak alespoň ohledně vláken.
V Javě neprogramuji, tak ti poradím jen obecně - vycházej z toho, že sprity jsou obdélníky, takže řeš kolize obdélníků (pokud si nebudeš vědět rady, tak google napoví).
Poté (pokud nastane kolize těch obdélníků) můžeš ještě řešit kolize per-pixel, prostě postupně projedeš všechny "pixely" z obou objektů, který si odpovídají a zkontroluješ, jestli oba z té dvojice mají nastaveno, že kolidují.
Tady máš ukázku kolizí per-pixel, kdyžtak můžu dodat zdroják v C#.
Per pixel jsem raději vzdal.
Abych lépe popsal problém. Dělám pong. Mám třídu Ball (pohybující se balónek) a Paddle (tedy ty dvě odrazové pálky). Nevím, jak z nich udělat sprity. Na jejich kolizi slouží metoda collidesWith (v podstatě to stejné jako intersect v JavaSE).
Prokousávám se programováním a Javou už v podstatě dva roky, ale stále nechápu některé základní věci. Třeba vlákna. Spustím si vlákno v každé třídě, pak ale nevím, jak s nimi naložit v Canvasu (Midlet - základní třída, co se volá po spuštění - slouží jen k zobrazení třídy Canvas). Tedy hlavní mojo se děje v Canvasu. Měl bych mít všechno správně, potřebuji jen udělat z balónku a pádel sprity, v Canvasu udělat jednu metodu pro kolizi (collidesWith) a vše spustit opět ve vlákně.
Já mám zdroják k per pixel i v Javě, ale naprosto nevím, co s tím. Jak jsem psal, jsem v podstatě začátečník.
Já nevím, ale na tak jednoduchou věc jako je pong nepotřebuješ ani vlákna ani třídy, jen kreslíš kolečko a obdélníčky.
Zdroják:
sdraco: Tobě to přijde jednoduché, ale pro mě je naprogramovat i něco
tak jednoduchého nadlidský úkol
A co je tedy za problém? Vezmi míček jako obdélník a máš to.
Koukám, že to tak dokonce i máš. Ale nechápu, proč má pálka i míček run, to je hloupost. Herní cyklus je přeci jeden. Aby pálka odrazila míček, můžeš jí ho předat třeba v konstruktoru.
Já ho jako obdélník mám. Nevím, jak poté vše "sesumírovat" v MyCanvas, tedy jak spustit vlákna a jak udělat kolizi. Per pixel nerozumím, tedy jedinou možností (alespoň o jiné nevím) je metoda collidesWith ze třídy Sprite. Ta ale bere pouze objekty jako obrázky.
Takže si vytvořím jen jedno vlákno v MyCanvas, ve kterém spustím instanci míčku a dvě instance pálek, tzn. odstraním run ze tříd Ball a Paddle?
Ano, budeš mít jednu herní smyčku, tam si vytvoříš 2 pálky a míček a budeš je obsluhovat. Otázka je, jak udělat kolizi, buď předáš míček pálkám (aby na něj viděly a mohly na něj reagovat), nebo dáš pálkám getter na jejich Rectangle, stejně to uděláš míčku a v tom hlavním cyklu budeš kontrolovat, zda se tyto 2 Rectangly nekříží.
Na Sprity se zatím vykašli, udělej to takhle a až ti to bude fungovat,
řeš obrázky
Pong jsem dělal v Pascalu, ale podstata je stejná. Víš kde je míček a
víš kde je pálka. Palka stojí na ose X třeba X = 1, a pohybuje se po ose Y
(1 až 32) když se míček dostane na pozici X = 2, pošleš otázku, kde je
pálka, jestli bude odpověď, že Y pálky (+ - šířka pálky) a míčku
stejná, dáš odraz. Jestli je mimo, set končí, změníš počet bodu a
začíná se od protihráče. V Pascalu byl pong na pár řádků. Sice pod
grafikou 320 x 240px ale zrovna u pongu je to jedno
Dobře, díky oběma. Pochopil jsem, jak dál postupovat. Až to vše udělám a nepojede mi to (jako vždy), opět se zeptám.
Asi bych to měl vědět, ale proč nemůžu po vytvoření instance třídy Ball v ní volat getter? Ono je to asi stejně zbytečné, ale zajímalo by mě to.
http://leteckaposta.cz/667317231
Místo yDirection v metodě kolize() bych měl balonek.getYDirection();
Nevím, jak to myslíš, gettery jsou od toho, aby se používaly mimo třídu. Strašně se mi nelíbí, že je v Ball balónek, je to zmatečné. Ten rectangle by se měl jmenovat třeba oblast, to dává smysl, Ball má nějakou oblast na obrazovce. Ale že Ball má balónek... A proč máš v balónku canvas? Balónek je samostatná komponenta, canvas máš jeden mimo, to jsme přeci již řešili.
Většina toho kódu je z nějakého Youtube tutoriálu. Je pravda, že mi některé věci připadaly přinejmenším divné. Takže, pokud správně chápu, budu mít třídu balónek, která bude jen vytvářet balónek a náhodně ho odrážet od okrajů. Pak třídu pálek, jež se bude starat jen o vytvoření dvou instancí na základě ID, jejich ovládání a aby nepřejely okraje. Veškerou logiku jako kolizi atd. vyřeším v MyCanvas. Je tak?
Canvas tam mám jen kvůli tomu, aby mi vrátil zobrazitelnou oblast.
To jsi dělal podle nějakého divného tutoriálu Já bych do těch komponent
žádnou extra logiku nedával a vše si řešil v Canvasu, pálka a míček by
měly jen rectangle a vykreslování, dále metody, které by s nimi
hýbaly.
Možná bude lepší, když si sedneš a napíšeš to znovu.
Už to píšu celé znovu
Ještě nechápu jednu věc. Jak potom v MyCanvas vykreslím vše potřebné?
Už nepoužiji metodu paint, ale všechno spustím v run?
Máš ten svůj Canvas, ten má metodu Paint, která bere v parametru graphics nebo alespoň tak nějak podobně by to mělo být. Pálce i míčku uděláš metodu Vykresli, co bere v parametru graphics a na graphics nakreslíš na pozice míčku míček, v pálce to samé, jen na pozici pálky pálku. V Paint v Canvas pak zavoláš micek.Vykresli(g) a palka1.Vykresli(g) atd., g je Graphics, co má Paint v parametru. Kdyby jsi se v tom ztratil, tak pošli kód.
Já už fakt nevím. Nic se nevykreslí, překladač vyhodí Out of memory.
Teď je to dobře, jen voláš v paint repaint(), což znovu zavolá paint a
znovu repaint až ti dojde zásobník Dej to repaint pryč.
Já myslel, že je repaint na to, aby vždy překreslil celý canvas. Teď mi to pro změnu vyhodí Execution failed with error code 1.:D
To ano, ale repaint musíš volat mimo paint, dělá se to obvykle v nějakém timeru. Repaint ti totiž zavolá paint a když v ní voláš repaint, tak si to zacyklíš.
Jo takhle. Stále ale nechápu, proč se mi nevykreslí alespoň ty dvě pálky.
Co jsi posílal naposled, tak mělo prázdný run. Musíš si tma udělat timer a v něm volat repaint.
I když jednou by se vykreslit měly. Nicméně to máš napsané teď dobře
a návod jak něco vykreslit v JavaME určit najdeš
Já už fakt nevím. Čím víc se do toho dívám, tím méně tomu rozumím. Nenašel jsem podklady, ze kterých bych pochopil, co mám dál udělat.
Zobrazeno 37 zpráv z 37.