• Welcome to TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach.
 

OOP - "spešl zadanie"

Started by Domino_666, 24.10.2011, 16:04:53

« predchdzajce - alie »

Agamemnon

pre pokoj duše povedzme, že to sa nedá... tak s tým pracuj, že to nejde urobiť a vymysli si niečo lepšie... maximálne tak to môžeš použiť ako kľúče do dictionary/hashtable, kde hodnoty budú objekty... za normálnych okolností nič lepšie neurobíš...
All code is crap.

42

Cici

no ja to riešim tak že každý predmet má current animation a v konštruktore objektu mám že sa objekt pridá do ArrayListu. V rendri potom prechádzam celý arraylist a vykreslujem jednotlive predmety. Ked objekt zoberiem tak ho odstránim z arraylistu - nebude sa ani vykreslovat

Mitwoc

Co vsetko ma obsahovat hra a kedy sa ma odovzdavat ?  ???

Cici

ak sa dobre pamatam tak:
-freda, ktory sa hybe
-batoh
-svet
-itemy
-gravitacia (skakanie)
-hra sa musi nejak korektne skoncit

nemusia byt nepriatalia (neviem ci sa na ne zabudlo alebo fakt nerteba)

mino

Zadanie odovzdavame az v januari, ale nemusime ho mat hotove uz teraz vo stvrtok? Netreba ho nahrat na moodle teraz?

Domino_666

tak myslím že stačí až potom, aspoň tak som pochopil mireka
inak to rovno prenášam  ;D

mino

#31
Otázka ohľadom pmd:
Keď zadám ant pmd je to ekvivalentné s ./pmd.sh ../../src/ html ruleset.xml > output.html ?

Mitwoc

a este jedna otazka... ako vykreslit len urcitu vrstvu (layer) mapy ? a ako vykreslit itemy na to urcite miesto, ktore som si zvolil v mape pomocou tych farebnych stvorcekov ?  :D

Domino_666

Taký začiatočnícky javovský dotaz, pravdepodobne ide o somarinu, ale nejako ma nenapadlo ako to spraviť.
Ide o to, že keď robím pole obrázkov pre animáciu, tak tam dávam napr.

Image[] star = {
   new Image("cesta"),
   // dalsich x obrazkov
}

ale nechcem, resp. je neefektívne všetky tie obrázky tam ručne vypisovať, tak som to chcel spraviť nejako v cykle. No neviem ako to zostaviť, nech to skúšam ako skúšam, nejako mám furt zlé typy, alebo keď to zhltne netbeans, tak mi spadne hra pre nejaké null exception alebo niečo také.

Nejako som zatiaľ nevyguuglil nič, všade čo som našiel, sa s typom Image pracovalo ako s jedným obrázkom, nie ako s poľom. V podstate by mi stačilo, pridať k jednému ďalší a tak ďalej.

Alebo urobiť jednoduchú animáciu napr. z jedného obrázku a k nej potom pridávať cez metódu addFrame(frame, duration) ďalšie?

Agamemnon

ja by som z toho urobil list a potom len volal add()... namiesto poľa
All code is crap.

42

Mitwoc

v cykle môzes skusit nieco take: star = new Image("cesta/k_obrazkom/bez_cisla_a_koncovky"+i+".png")

Domino_666

Ozaj, je nejaká možnosť spustiť na pozadí niečo ako časovač? Že by sa niečo dialo buď náhodne, alebo na základe nejakého intervalu? Nikde som nenašiel nejaké metódy na prácu s časom (okrem dĺky framu pri animácii, ale to nieje to čo myslím)

Agamemnon

viem ti z hlavy povedat, ako to urobit v c#...

takze predpokladam, ze nieco take bude mat aj java... len musis pozriet javadoc... hladaj nieco ako Timer... alebo potom pripadne pusti nejaky Thread alebo BackgroundWorker a napis si vlastny Timer, ktory bude bezat v tom vlakne...

potom pozor na volania medzi threadmi... ako na citanie, tak na zapis... lockuj premenne, ak je to potrebne...
All code is crap.

42

mino

Quote from: Domino_666 on  16.12.2011, 08:10:20
Ozaj, je nejaká možnosť spustiť na pozadí niečo ako časovač? Že by sa niečo dialo buď náhodne, alebo na základe nejakého intervalu? Nikde som nenašiel nejaké metódy na prácu s časom (okrem dĺky framu pri animácii, ale to nieje to čo myslím)

Funkcia update() ma 1 parameter - kolko milisekund uplynulo od jej posledneho vykonania, tak ten cas si mozes pripocitavat do nejakej premennej a ked dosiahne urcitu hodnotu, tak vykonas tu tvoju akciu.

Domino_666

#39
dík za rady, ide to, použil som na to metódu gc.getTime(); :)


Ako je to s tými generyckými kolekciami?

Chápem správne, že:

ArrayList<Item> backpack = new ArrayList<Item>();

vytvorí generické pole (resp. zoznam) prvkov, ktoré majú typ Item a celé sa to volá backpack? Takto sa to snažím zatiaľ spraviť, ale problém je, že keď tam chcem cez .add(); vložiť predmet, spadne program a píše nejaké null pointer exception alebo niečo také na tom riadku, kde sa to snažím vložiť. Predpokladám, že mi nejako nesedia typy, mám to zatiaľ zhruba takto:

abstraktná trieda Item, v nej mám pár metód spoločných pre všetky predmety (gettery, settery...) a následne všetky predmety túto triedu rozširujú. Takže napr. mám

public class Key extends Item(){ ... }

V konštruktore BackpackImpl som si vytvoril ten zoznam (viď vyššie) a metódu

public void addItem(Item predmet) {
this.backpack.add(predmet);
}

v update to volám takto:

backpack.addItem((Item)key);

takže predtým ten typ Key pretypujem na Item, ktorý by tam mal byť, ale nejako mi to nechce zobrať  am


Agamemnon

1. pastujte chyby a exceptions presne... inak môžem max. tak hádať :P
2. naučte sa čítať exceptions... null pointer exception znamená presne to, čo tam píše a nemá to nič spoločné s typom... a nie, nepíše ti to preto, že ti tam nesedia typy... ak máš fakt túto exception, tak niektorý z objektov nie je vytvorený a máš tam null...
3. naučte sa používať debugger... toto je vec, ktorá sa v debuggeri vyrieši za 10s...
4. to pretypovanie tam nepotrebuješ, ak trieda Key dedí od Item (v takom prípade platí, že "key instanceof Item" je true)... potom aj volanie adItem metódy, aj volanie add metódy na ArrayListom je korektné

edit:
Quote
použil som na to metódu gc.getTime();
dúfam, že gc neznamená garbage collector... ale niečo ako game context alebo tak...
All code is crap.

42

Domino_666

dík, nebol vytvorený ten objekt, resp. mal som tam chybu

to gc je gamecontainer

Domino_666

#42
Ako dostávate veci z mapy do hry?
V konštruktore levelu som spravil niečo takéto (napíšem to skrátene + nejaké komentáre):
(snažil som sa ísť aspoň čiastočne podľa scenárov - nejaké to základné "myslenie" som zobral odtiaľ (zhruba vzťahy medzi triedami, rozhraniami atď)


... // this.map je typu TiledMap - to je samotná načítaná mapa
int layerIndex = this.map.getLayerIndex("actors"); // zistí index vrstvy s názvom "actors"
int w,h; // šírka, výška
// cyklicky prejdem celú mapu
for(h=0; h<this.map.getHeight(); h++){
     for(w=0; w<this.map.getWidth(); w++){
           int tileID = this.map.getTileId(w,h,layerIndex); // zistí jedinečné ID tilu (blbo sa to skloňuje  ;D) podľa jej umiestnenia - výška, šírka, vrstva
           boolean foundPlayer = "true".equals(this.map.getTileProperty(tileID, "player", "true")); // zistí parametre tej taily a ak je player true, tak našlo hráča
           if(foundPlayer){ // ak našlo hráča, vytvorí jeho inštanciu a nastaví pozíciu
               Fred fred = new Fred(w,h);
               this.add(fred); // metoda add(Actor) pridava do generického zoznamu actorov freda (hráča)
           }
      }
}

Problém je, že neviem prečo mi to (asi) kontroluje všetky vrstvy a dokonca neviem či aj nie opakovane (v hernej logike je to celé v časti init, takže to by nemalo...) a program prakticky prestane pracovať, resp. fps klesne na 1 akoby sa zahltil, aj to až po dlhšom čase, kým sa aspoň niečo načíta. Skúšal som vrstvu napísať ručne (jej číslo v kóde) a čo som bol prekvapený, furt mi "playera" našlo, aj keď malo hľadať v inej vrstve, kde určite nebol, to som si skontroloval aj v Tile Editore.

V tomto konkrétnom prípade som skúsil spraviť pomocnú premennú boolean, do ktorej som uložil informáciu o tom, či už našlo hráča a ak bolo true, tak z metódy vyskočil. Toto už šlo krásne plynulo, bez poklesu fps či iných vedľajších efektov. Problémom ale je, že rovnako chcem postupovať aj s ostatnými predmetmi (hviezdy, kľúče, elixíry...) a vtedy už mi pomocné premenné budú na nič, resp. tak či by som ich musel manuálne písať do kódu a teda keď tak ich už radšej nepridávať z mapy ale vytvoriť ich inštancie v kóde. Ale tomu sa chcem vyhnúť.

Agamemnon

Quote from: Domino_666 on  19.12.2011, 03:12:39
V tomto konkrétnom prípade som skúsil spraviť pomocnú premennú boolean, do ktorej som uložil informáciu o tom, či už našlo hráča a ak bolo true, tak z metódy vyskočil. Toto už šlo krásne plynulo, bez poklesu fps či iných vedľajších efektov. Problémom ale je, že rovnako chcem postupovať aj s ostatnými predmetmi (hviezdy, kľúče, elixíry...) a vtedy už mi pomocné premenné budú na nič, resp. tak či by som ich musel manuálne písať do kódu a teda keď tak ich už radšej nepridávať z mapy ale vytvoriť ich inštancie v kóde. Ale tomu sa chcem vyhnúť.

žiadne manuálne písanie...
- dictionary na premenné
- pridaj premenné ako instance field tým predmetom

so zvyškom ti nepomôžem, lebo tie metódy nepoznám a nvm, čo robia vo vnútri...
btw... fred nepotrebuje vedieť na akej je vrstve?
All code is crap.

42

Mitwoc

ako ste zabezpecili fredov pohyb, aby vam "neusiel" z okna ? aby bol stale niekde na zaciatku, alebo v strede okna ?

Domino_666

#45
@Agamemnon
Ako myslíš tie premenné? Asi sa nechápeme. Chcel som to spraviť tak, že na začiatku sa vytvorí nová inštancia triedy level, viac menej ten bude všetko riadiť ďalej takto:
-v konštruktore načítam mapu, prejdem celú mapu a keď nájde na mape nejaký item/nepriateľa/freda, pridá ho do generického zoznamu Actorov - Actor je interface, ktorý implementujú 2 abs. triedy: Character (fred, nepriateľa) a Item (hviezdy elixíry...) - viac menej takto to bolo načrtnuté v scenároch, akurát batoh mám myslím trocha inak, resp. zo scenárov som nepochopil ako to celkovo bolo myslené, ale funguje mi to v pohode :)
-v update metóde hry sa updatne len samotný level, čo v princípe znamená toľko, že prejde celým tým generickým poľom (v ktorom už má všetky predmety, postavy...) a každú z nich updatne (ak je čo updatnúť, to už riadia metódy na všetko prakticky zvlášť)
-v render metóda funguje rovnako, akurát sa ale nič neupdatuje, ale už len zobrazí

Fred ani nič ostatné už po tom, čo ho raz dostanem do toho generického zoznamu už nemusí mať informáciu o vrstve. To chcem riešiť tak, že medzi jednotlivými vykresleniami vrstiev mapy len vsuniem vykreslenie prvkov zoznamu. Potom budem pokračovať v mape a teda dosiahnem ten efekt, že niečo bude pred a niečo za. Malo by sa to takto dať, no keďže zatiaľ akosi neviem načítať veci do toho zoznamu, bez toho aby sa zahltil program, neviem to otestovať či sa to dá presne podľa mojich predstáv.

Pozrel som cez task managera a niekde sa to zahlcuje:
-ak nechám prejsť celú mapu ale nevytvorím tie inštancie predmetov (zakomentoval som tú časť) tak mi cez task manager vo wine píše okolo 100Mb pamäte
-ak nechám celý kód ako by mal byť aj s tými novými inštanciami, tak to presahuje 400mb pamäte
???


@Mitwoc:
-na koniec mapy, na miesto, kam už nechceš aby sa dalo ísť umiestni collision, toto ešte ja nemám implementované, ale chcem to spraviť tak, že tam dám značku collision, parametre "block" "true" a potom to nejako budem riešiť cez intersecty, ale ešte neviem presne
K vykreslovaniu v strede okna: použi na to jednu z variánt metódy render:

// render(int x, int y, int sx, int sy, int width, int height)
map.render(100,100,0,0,10,10);
// Which would render the section of the map in tiles from 0,0 to 10,10 at the screen position 100,100. This can be be very useful for performance when scroll round large tile maps.

Mitwoc

Quote from: Domino_666 on  19.12.2011, 05:17:02

@Mitwoc:
-na koniec mapy, na miesto, kam už nechceš aby sa dalo ísť umiestni collision, toto ešte ja nemám implementované, ale chcem to spraviť tak, že tam dám značku collision, parametre "block" "true" a potom to nejako budem riešiť cez intersecty, ale ešte neviem presne
K vykreslovaniu v strede okna: použi na to jednu z variánt metódy render:

// render(int x, int y, int sx, int sy, int width, int height)
map.render(100,100,0,0,10,10);
// Which would render the section of the map in tiles from 0,0 to 10,10 at the screen position 100,100. This can be be very useful for performance when scroll round large tile maps.
Vdaka za odpoved :) ale mne nejde o renderovanie mapy, ale  freda. Fred ma svoju poziciu ulozenu v X-ku a vzdy pri jeho pohybe sa to x zmeni. To znamena ze fred sa po okne pohybuje (samozrejme ze aj v mape, ale tu teraz nejde o mapu).
Priklad...na zaciatku je fred celkom na lavej strane okna, postupne sa zacne pohybovat do prava. Mapa za nim ide smerom vlavo, ale samotny fred sa pomaly vzdialuje od laveho okraju okna a niekde v polovicke mapy je uz celkom pri pravom okraji okna.
Môzem mu nastavit, ze sa bude robrazovat stale v strde okna, ale ten obrazok nebude predstavovat jeho skutocnu poziciu. (Mozno to mam len ja zle nakodene.) Neviete mi s tym niekto poradit ?

Agamemnon

Quote from: Domino_666 on  19.12.2011, 05:17:02
@Agamemnon
Ako myslíš tie premenné? Asi sa nechápeme. Chcel som to spraviť tak, že na začiatku sa vytvorí nová inštancia triedy level, viac menej ten bude všetko riadiť ďalej takto:
-v konštruktore načítam mapu, prejdem celú mapu a keď nájde na mape nejaký item/nepriateľa/freda, pridá ho do generického zoznamu Actorov - Actor je interface, ktorý implementujú 2 abs. triedy: Character (fred, nepriateľa) a Item (hviezdy elixíry...) - viac menej takto to bolo načrtnuté v scenároch, akurát batoh mám myslím trocha inak, resp. zo scenárov som nepochopil ako to celkovo bolo myslené, ale funguje mi to v pohode :)
-v update metóde hry sa updatne len samotný level, čo v princípe znamená toľko, že prejde celým tým generickým poľom (v ktorom už má všetky predmety, postavy...) a každú z nich updatne (ak je čo updatnúť, to už riadia metódy na všetko prakticky zvlášť)
-v render metóda funguje rovnako, akurát sa ale nič neupdatuje, ale už len zobrazí
spomínal si nejakú pomocnú boolean premennú - ja som o tých hovoril - aby si to nemusel písať manuálne, tak si urob dictionary na to... alebo to daj priamo do triedy Item alebo ako sa volá

problém pre mňa je, že netuším, ako sa správajú tie ďalšie metódy - napr. getTile, getTileProp etc...

inak - podľa toho, čo si napísal... tak len vyskoč z cyklu, keď nájdeš tú postavu, čo hľadáš... (dá sa to pochopiť viacerými spôsobmi, čo si písal... takže toto nemusí byť dobré riešenie)

Quote
Pozrel som cez task managera a niekde sa to zahlcuje:
-ak nechám prejsť celú mapu ale nevytvorím tie inštancie predmetov (zakomentoval som tú časť) tak mi cez task manager vo wine píše okolo 100Mb pamäte
-ak nechám celý kód ako by mal byť aj s tými novými inštanciami, tak to presahuje 400mb pamäte
???

niekde sa ti to zacyklí a vytvárajú sa ti nejaké nové premenné... niečo také... tak či tak je to zlé...


moja hlavná rada:
zober debugger, daj si tam breakpoint pred ten cyklus a prejdi si to pomocou neho... sleduj kam ide tok programu, a aké hodnoty majú premenné - či nadobúdajú také hodnoty ako očakávaš... imo rýchlo nájdeš, kde je problém a čo presne sa deje...
All code is crap.

42

mirek

Quote from: Cici on  12.12.2011, 05:00:08
ak sa dobre pamatam tak:
-freda, ktory sa hybe
-batoh
-svet
-itemy
-gravitacia (skakanie)
-hra sa musi nejak korektne skoncit

nemusia byt nepriatalia (neviem ci sa na ne zabudlo alebo fakt nerteba)
o nepriateloch sme hovorili v suvislosti s itemami
So say we all!

Domino_666

ďakujem, odteraz považujem debugger za svätý, mal som tam nechtiac votretú "večnú pravdu", teda pri každom prejdení cyklu sa vytvoril nový Fred. Podľa debuggera sa ich vytvorilo cez 2800  ;D (a to som mal v pláne vytvoriť len singleplayer hru  ;D)
každopádne už mi to ide, dík za rady  :thumbs-up: