Našel by se někdo, kdo by mi pomohl se hrou v JavaME? Mám v podstatě vše
naprogramováno, nejde mi ale vytvořit kolize objektů, které chci řešit
pomocí spritů. Do těch jsem se zamotal.
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í.
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ě.
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.
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říží.
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
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?
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.
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.
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íš.
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.