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

Tvůrce

Zobrazeno 49 zpráv z 49.
//= 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.
Tak link zde:
http://uloz.to/…iner-v01-rar
Heslo: fugiczek
Cením každou hru, která není naklikaná v GameMakeru Jakým způsobem to vykresluješ,
používáš nějaký framework? Dost mi vadí, že nemohu šipky jen držet,
ale musím je stále mačkat. Také by mě zajímalo, jakým způsobem
spravuješ ten všemi směry nekonečný svět. Ty obrázky se mi vůbec
nelíbí, stáhni si nějaké ikonky z iconarchive.com. koukej na licence, bude
tam spousta diamantů, zlata atd.
Na vykreslování používám normální metodu paint(). Šipky šli držet
ale pak jsem to změnil z důvodu dalších updatů kdy pohyby budou omezeny
fyzikou. Svět je nekonečný jen směrem dolů, na to používám arraylist a
při každém snížením dolů kde není ještě vygenerován obsah tak se
vygeneruje jedna vrstva navíc. Obrázky chci mít své vlastní. Je to úplně
první verze, grafiku budu určitě ještě několikrát měnit
Neměl jsem na mysli jméno metody, ale komponentu, na kterou kreslíš. Z tvé odpovědi jsem pochopil, že framework nepoužíváš a kreslíš na něco ze swingu, je to tak?
Používám Graphics, takže starší -> AWT Jinak kreslím na JPanel ze swingu.
Takže taková kombinace
Obrázek z nově přidaného inventáře:
http://img204.imageshack.us/…minerinv.png
Jak jsem psal že je to kopie minecraftu tak to sem se nepodíval pořádně, je to vidět, pouze se mi to na první pohled zdálo podle té kostičkované grafiky.
Takze je k dispozici verze 0.2
Link zde:
http://uloz.to/…minerv02-jar
Novinky:
Jen bych dodal ze inventar se otevira "ickem" a shop "eskem"
Odstranil bych tu prodlevu předtím, než se začne stisknutá klávesa opakovat (pokud to tedy nějak jde). Měl bys používat nějaký framework, který kreslí akcelerovanou grafikou a má lepší ovladače na klávesnici, jsou jich pro Javu desítky. Uděláš něco s tou grafikou? Mohlo by to vypadat o hodně líp. Jinak dobrej nápad s tou gravitací, připomíná mi to boulder dash, budou nepřátelé?
Na tu prodlevu kouknu do dalsi verze. Ano s grafikou neco udelam. Na ty
frameworky se podivam. Tohle je teprv druhá verze co jsem vydal, nápadů mám
spousty. Klidně přidám i nepřátelé, jen to nejaky cas potrvá. Pokud se mi
nejaky framework zalíbí tak pristi verze nejdriv bude tak za tyden, mozna za
dva. Spis ty dva, predelam tu grafiku a pridam framework kdyz jinak nedas
Jinak diky za kazdy nazor, bez nich bych se tak nehnal do vyvoje te hry
Sem jsi koukal http://www.itnetwork.cz/index.php?… ?
Nekoukal, kouknu
Jen se chci zeptat jestli mas nejaky framework ktery by jsi doporucil, premyslel
jsem nad lwjgl, ale nevim jestli to neni zbytecne moc
V Javě moc nedělám, ale zahlédl jsem toto: http://jmonkeyengine.com/ a asi je to takový nejprofláklejší.
Ne tak ten je jen na 3D hry asi, koukni sem: http://www.java-gaming.org/index.php?…, ta libgdx vypadá dobře http://code.google.com/p/libgdx/ Si projdi ty 3 na 2D hry.
Na 2D grafiku se mi celkem líbí libGDX (viz. http://libgdx.badlogicgames.com/) S tímto frameworkem
můžeš hry vyvíjet nezávisle na platformě. Stačí pak jen dopsat starter
pro danou platformu (jsou podporované: Windows, Linux, MacOS a Android) a ten
má kolem deseti řádků. Jinak na 3D mi taky příjde nejlepší ten
jMonkeyEngine. Je na něj spousta tutoriálů, celkem velká komunita a má
pěknou upoutávku . Navíc má
vlastní vývojové prostředí (založené na Eclipse), ve kterém se dobře
pracuje.
Diky za nazor, zitra ten libGDX omrknu
jMonkeyEngine asi ne protoze na 3D grafiku si zatim netroufnu
Takze to budu predelavat do libGDX, ale nevim jak dlouho mi to potrva. Celej
kod musim psat od znova a navic je to celkem slozity (to se mi zdala i Java kdyz
jsem ji poprve videl ),
zitra se zacnu prokousavat pomalu tridama co libGDX obsahuje a snad zacatkem
tydne zacnu psat
Navíc
vsechny navody jsou anglicky a je jich malo, takze se ucit budu muset z
dokumentace a nejakych zdrojaku co maji na strankach. Kazdej zdrojak je psanej
jinym zpusobem takze uvidime jestli vubec neco vytvorim
Určitě dej pak vědět, budu se jí také časem zabývat, možná o ní i
něco napíšu
Půl dne resim problem proc mi to nechce cist soubory. Zkousel jsem ruzne
menit adresare a zpusoby cteni (Gdx.file.internal/external/classpath).
Nakonec jsem zjistil ze mu vadilo ze soubor ma dve koncovky napr. *.txt.txt
Nevím jestli mám davat vinu Winum ze jsou tak vypatlany ze davaji 2 koncovky a
tvari se ze dali jen jednu. Nebo jave ze to neumi prechroustat
Nastesti jsem koncovky prepsal pomoci total commandera a muzu pokracovat dal
Ted mam sice problem kdyz najedu do menu hry tak mi java hodí fatal error, ale
na to ze vcera jsem skoro vubec nic nevedel tak postupuji celkem dobre
Vypni si "Skrývat příponu souborů známých typů" v Ovládací panely
-> Možnosti složky. To je první věc, co po instalaci Windows dělám
Náhled z meho postupu ve vyvoji
Miner: Creating game
Miner: Retrieving profile
Miner: Resizing game to: 800 x 480
Miner: Showing screen: SplashScreen
Miner: Resizing screen: SplashScreen to: 800 x 480
Miner: Setting screen: SplashScreen
FPSLogger: fps: 0
FPSLogger: fps: 65
FPSLogger: fps: 63
Miner: Hiding screen: SplashScreen
Miner: Disposing screen: SplashScreen
Miner: Showing screen: MenuScreen
Miner: Resizing screen: MenuScreen to: 800 x 480
Miner: Setting screen: MenuScreen
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000fea411e0, pid=1072, tid=4432
#
# JRE version: 8.0-b41
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.0-b12 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [msvcrt.dll+0x11e0]
toto se mi deje celý den
Tak, podarilo se mi konecne zprovoznit menu tak zde je nahled
http://img42.imageshack.us/…enumains.png
Potreboval bych poradit aspon od par lidi zde co by se vam vic libilo.
Nekonecnej svet smerem dolů s omezením do stran (tak jak to bylo v predchozich
verzich), nebo nekonecnej svet do stran s omezenou hloubkou (zde by slo
regulovat vyskyt kovu vzhledem k hloubce). Slo by to i skombinovat ale to by
bylo hard-core
Budu rad za kazdy nazor
Bylo by drsný to udělat že začínáš ve prostřed nekonečna. Aby to
bylo prostě nekonečný na všechny strany.
Co ty tam používáš hashmapu?
Pokud by to zesložitilo celý algoritmus, pak bych volil asi doprava. Vypadá
to, že jedeš za cílem. Kdežto dolů to je takový pád.
Pred tim jsem pouzival normalne ArrayList, to do vsech stran budu muset vymyslet aby to zbytecne nezatezovalo moc pamet a taky zpusob ukladani toho sveta.
Tak treba muzu kopat nekde v cerne dire kde neni konce ani zacatku
Můžeš si vytvořit objekt políčko a ty navazovat mezi sebou 4mi referencemi, svět potom poroste do nekonečna přesně tam, kam jdeš a snížíš zátěž paměti. Celé bys to obalil třídou Svet. Vzhledem k povaze hry by to ani nemuselo být náročné. Pokud tě dobře chápu, teď máš jednu stranu toho pole napevno, což mi přijde jako plýtvání pamětí. Nevím jak to má Java s implementací indexerů, ale teoreticky by šlo udělat, aby se ta struktura chovala navenek jako pole. Nevím, jak jsi na tom s algoritmizací, ale nemuselo by to být tak složité.
s tou jsem na tom spatne no logika jde mimo me
ale tak trochu jsem premyslel a udelam to nekonecny do boku, do vsech stran je
to takovy neprirozeny, navíc kdyz to bude do stran tak muzu upravit generovani
kovu tak aby ty nejdrazsi byly dole a nahore na povrchu by byly obchody na
vylepsovani atd... a jinak ten zpusob s tema referencemi vyzkousim, zatim si
stejne jen hraju s menu, nastavenim a pripravou objektu na hru samotnou
Uděláš si něco jako
class Policko
{
public Policko vlevo = null;
public Policko vpravo = null;
public Policko nahore = null;
public Policko dole = null;
public int hodnota; // samotná hodnota - diamant, nic...
}
S tím, aby to vypadalo jako pole, jsem se asi spletl, bylo by to zbytečně
neohrabané. Měl bys metody, co by ti vygenerovaly řadu takovýchto políček
a to vlevo, vpravo, nahoře a dole. Další metoda by ti zpočátku vygenerovala
obrazovku. Takto bys měl v paměti přesně to, co potřebuješ. Stačilo by ti
potom udržovat si referenci na políčko, na kterém je hráč (to by bylo
vždy uprostřed obrazovky). Podle této reference bys i obrazovku vykreslovat a
podobně. Jestli si jen hraješ, tak to zkus, procvičí ti to mozek a budeš to
mít opravdu chytře napsané
Ještě dodám, že nevýhodou výše popsané struktury je nemožnost přistoupit na konkrétní souřadnice ve světě (např. 1241;351), ale to by snad nemělo vadit. Hrdina se pohybuje o 1 a pokud bys ho potřeboval např. někam telepotovat, bude mít teleport referenci na cílové políčko.
No ja si jen hraju, neplanuji verzi 0.3 vydat nekdy brzo. S tym svetem si
jeste pohraju, potrebuju aby si to ty policka pamatovalo vsechny takze nejlepe
aby se ty nepotrebny nekam zapisovaly.
Premyslel jsem ze ten svet rozdelnym na levou a pravou stranu. Pro kazdou stranu
bych udelal dynamicky pole s polem a v nech bych ukladal ty jednotlivy policka.
Nebo svet rozdelit na useky o urcite velikosti, napr 100x100, a kdyz bych byl na
souradnicich x 100 tak by se vytvoril dalsi sektor...
To je také řešení, ale ztíží se ti přesun mezi jednotlivými poli. Podle mne se pole k tvému případu vůbec nehodí.
Já bych to udělal tak, jak jsem ti radil, využiješ přesně tolik paměti, kolik potřebuješ a není to ani moc složité. Navíc to pak jednoduše uložíš třeba do listu a pak do souboru. Než přemýšlet nad nějakými dynamickými poli, které dělit na sektory, se už vyplatí se zamyslet pořádně a navrhnout kvalitní strukturu.
No kdyz se mi podari vyresit tato pekna chyba tak mam vyhrano
com.badlogic.gdx.utils.SerializationException: Field not found: world (java.util.ArrayList)
To bys toho musel poslat víc Takhle nic nevidíme
WorldManager:
package com.fugiczek.miner.services;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Base64Coder;
import com.badlogic.gdx.utils.Json;
import com.fugiczek.miner.Miner;
import com.fugiczek.miner.domains.World;
public class WorldManager {
private static final String WORLD_DATA_FILE="data/world/world-v1.json";
private World world;
public WorldManager(){}
public World retrieveWorld(){
FileHandle worldDataFile=Gdx.files.local(WORLD_DATA_FILE);
Gdx.app.log(Miner.LOG, "Retrieving world from: " + worldDataFile.path());
if(world!=null)return world;
Json json = new Json();
if(worldDataFile.exists()){
try{
String worldAsText=worldDataFile.readString().trim();
if(worldAsText.matches("^[A-Za-z0-9/+=]+$")) {
Gdx.app.log(Miner.LOG, "Persisted world is base64 encoded");
worldAsText = Base64Coder.decodeString(worldAsText);
}
world=json.fromJson(World.class, worldAsText);
}
catch(Exception e){
Gdx.app.error(Miner.LOG, "Unable to parse existing world data file", e );
world=new World();
persist(world);
}
}
else{
world=new World();
persist(world);
}
return world;
}
protected void persist(World world)
{
FileHandle profileDataFile = Gdx.files.local(WORLD_DATA_FILE);
Gdx.app.log(Miner.LOG, "Persisting world in: " + profileDataFile.path() );
Json json = new Json();
String profileAsText = json.toJson(world);
if( !Miner.DEV_MODE ) {
profileAsText = Base64Coder.encodeString( profileAsText );
}
profileDataFile.writeString( profileAsText, false );
}
public void persist()
{
if( world!= null ) {
persist(world);
}
}
}
A svet:
package com.fugiczek.miner.domains;
import java.util.ArrayList;
import java.util.List;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.Json.Serializable;
import com.badlogic.gdx.utils.OrderedMap;
public class World implements Serializable{
public List<Box> world=new ArrayList<Box>();
public World(){world.add(new Box(Ores.STONE));}
@Override
public void read(Json json, OrderedMap<String, Object> jsonData) {
json.readField(world, "world", Box.class, jsonData);
}
@Override
public void write(Json json) {
json.writeValue("world", world);
}
}
A presna chyba:
Miner: Unable to parse existing world data file
com.badlogic.gdx.utils.SerializationException: Field not found: world (java.util.ArrayList)
at com.badlogic.gdx.utils.Json.readField(Json.java:616)
at com.badlogic.gdx.utils.Json.readField(Json.java:603)
at com.fugiczek.miner.domains.World.read(World.java:18)
at com.badlogic.gdx.utils.Json.readValue(Json.java:722)
at com.badlogic.gdx.utils.Json.fromJson(Json.java:591)
at com.fugiczek.miner.services.WorldManager.retrieveWorld(WorldManager.java:36)
at com.fugiczek.miner.Miner.create(Miner.java:42)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:144)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:131)
Chyba je v tom ze pri cteni v tom objektu world nevidí to pole, ale nevím proc...
To je divné, ten json soubor je uvnitř určitě ok? Aby to nebylo, že world není v tom jsonu, ne v Java kódu.
díval jsem se a je tam zapsanej takhle:
{"world":[{"class":"com.fugiczek.miner.domains.Box","down":null,"left":null,"ore":"STONE","up":null,"right":null}]}
Podobny zpusob zapisovani a cteni mam u ProfilManageru jenze tam zadny pole neni, tam jsou jen promenne a to funguje...
Já s jsonem nikdy nedělal, takže tady bohužel nemůžu sloužit. Já bych postupoval tak, že bych si zkusil někde bokem (třeba v novém projektu) vytvořit takové pole a uložit ho a následně načíst do jsonu. Mám zkušenosti, že řešit tohle v originálním projektu je matoucí a když je to čisté, člověk na to spíše přijde.
Urcite to timhle postupem vyzkousim, dekuji za radu. Vyzkousim ruzne
konstruktory readField (ma jich asi +-6) a vyzkousim to i s ruznymi typy pole.
Snad na tu chybu prijdu
Zitra se ozvu jak jsem dopadl, dneska uz jsem toho udelal dost, takze dneska mam
padla
Toto jsem nasel, jenze to je pro HashMap
// libgdx handles the keys of JSON formatted HashMaps as Strings, but we
// want it to be an integer instead (levelId)
Map<String,Integer> highScores = json.readValue( "highScores", HashMap.class,
Integer.class, jsonData );
for( String levelIdAsString : highScores.keySet() ) {
int levelId = Integer.valueOf( levelIdAsString );
Integer highScore = highScores.get( levelIdAsString );
this.highScores.put( levelId, highScore );
}
Zkusil jsem prepsat i metodu na cteni takhle:
@SuppressWarnings("unchecked")
@Override
public void read(Json json, OrderedMap<String, Object> jsonData) {
List<Box>world=json.readValue("world", ArrayList.class, Box.class, jsonData);
for(int i=0;i<world.size();i++){
this.world.add(world.get(i));
}
}
A vysledek:
Miner: Unable to parse existing world data file
com.badlogic.gdx.utils.SerializationException: Class cannot be created (missing no-arg constructor): com.fugiczek.miner.domains.Box
at com.badlogic.gdx.utils.Json.newInstance(Json.java:839)
at com.badlogic.gdx.utils.Json.readValue(Json.java:719)
at com.badlogic.gdx.utils.Json.readValue(Json.java:762)
at com.badlogic.gdx.utils.Json.readValue(Json.java:680)
at com.fugiczek.miner.domains.World.read(World.java:19)
at com.badlogic.gdx.utils.Json.readValue(Json.java:722)
at com.badlogic.gdx.utils.Json.fromJson(Json.java:591)
at com.fugiczek.miner.services.WorldManager.retrieveWorld(WorldManager.java:36)
at com.fugiczek.miner.Miner.create(Miner.java:42)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:144)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:131)
Caused by: java.lang.InstantiationException: com.fugiczek.miner.domains.Box
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at com.badlogic.gdx.utils.Json.newInstance(Json.java:825)
... 10 more
Caused by: java.lang.NoSuchMethodException: com.fugiczek.miner.domains.Box.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
... 13 more
Heuréka!!
Problém vyresen, ta metoda pri cteni dela novou instanci toho objektu, jenze ji
vytvarela spatne protoze se pri vytvareni musi zadavat jakej je to typ kostky.
Tak jsem zvlast pro cteni vytvoril prazdnej konstruktor a jede to.
Takze opet stacilo par hodin nervovani, nadavani a problem se vyresil
Zobrazeno 49 zpráv z 49.