2D TileMap "Engine" preview

  • 19 Antworten
  • Neuester Beitrag
Diskutiere 2D TileMap "Engine" preview im Android Spiele Entwicklung im Bereich Android App Entwicklung.
Railwanderer

Railwanderer

Ambitioniertes Mitglied
So
etwas verspätet und natürlich noch lange nicht fertig will ich euch
mein bisherigen Stand bei meinem ersten eigen geschriebenem "Game" vorstellen ;)

Es soll ein mini 2D Tile Rpg werden, oder in diese Richtung gehen.
Bisher gibt es eine Insel, man kann über die karte laufen und auf die nächste wechseln und sich über die Minimal die InselKarte anschauen.

Kollision Desertion wird tilebasiert abgefragt, es gibt sprite Tiles, bisher nur 2,
da ich die Grafik auch selber zeichne und bisher nur grob gemalt habe um den
Fokus erstmal auf der Code Logik zu lassen.

Als nächstes möchte ich noch Pathfinding über A* einbauen, damit das lästige
steuerkreutz wegfällt und dass man in Häuser/ Höhlen gehen kann.
Danach möchte ich mich an den Versuch von Inventory und Läden wagen,
das alles dauert noch da noch bei den Maps selbst vieles leer ist und es noch
grundlegende Dinge bedarf. Nichts desto trotz kann man es schon ausprobieren
und ich hoffe ihr habt viel Kritik ;)


Mich würde einfach mal interessieren ob es bei euch überhaupt läuft,
wie die Grafik aussieht es ruckelt oder nicht etc. die Grafiken sind in einer Auflösung von 32*32 Pixeln, und der FrameBuffer auf den ich zeichne ist
608 x 416 gross, und wird auf euer Display hochskaliert, den Pixel Effekt
finde ich gut ( auf meinem Sgs 3 ) und die App ist somit nicht für Tablett Grössen etc ausgelegt.

Könnt ihr auch den LogCat bei einem Start der App ausführen?
Ich habe noch ziemliche GarbageCollector Probleme :rolleyes2:

Ihr muesst es vermutlich vom pc runterladen, vom handy direkt
scheint der link nicht zu klappen bzw laed ne htm datei runter:
TinyUpload.com - best file hosting solution, with no limits, totaly free


 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Lad am besten das File als signed apk auf einem file hosted deiner Wahl hoch
 
Railwanderer

Railwanderer

Ambitioniertes Mitglied
Zuletzt bearbeitet:
F

Feuerstern

Fortgeschrittenes Mitglied
Hab mir deine Preview mal angesehen.
Die Framerate liegt auf meinem Moto G 2014 bei 27-29 Fps und die Grafik ist so wie sie auf deinem Vorschaubild zusehen ist.
Was ist A* ?

mit freundlichen Grüßen
Feuerstern
 
Railwanderer

Railwanderer

Ambitioniertes Mitglied
A* Algorithmus ist für pathfinding gedacht ;)
A* Pfadfindung fr Anfnger

hier mein java mapeditor fürs spiel ;) auch mein erstes "grösseres" java Programm
 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Hi ich kriege Men parsing Fehler beim download
habe Android 5.0.1 Note 4 schade

A* da weiß ich nur wie es funktioniert vom Prinzip

Der ursprüngliche Beitrag von 00:14 Uhr wurde um 00:16 Uhr ergänzt:

Coole pixel Grafik btw
 
Railwanderer

Railwanderer

Ambitioniertes Mitglied
Wie meinst du parsing fehler? Soll ich den ordnernmal hochladen?
Gerade du musst es ausprobieren :D
 
Jaiel

Jaiel

Experte
Also ich kann die apk runterladen aber nicht installieren...komisch ich merke grad die download größe soll nur 7,9 kb groß sein ich guck mal ob ich etwas falsch geamcht habe...
scheint wohl probleme zu geben wenn ich sie direkt aufs handy downloade habe aber jetzt am pc nochmal runtergeladen :thumbsup:

Der ursprüngliche Beitrag von 01:13 Uhr wurde um 01:15 Uhr ergänzt:

alles klar ich teste die mal gebe dir dann später mein feedback :)
 
Railwanderer

Railwanderer

Ambitioniertes Mitglied
hehe ja das hab ich auch grade gemerkt da kommt nur ne htm Datei an,
ich schau nochmal nach einem anderen uploader fürs nächste update ;)
ich hoffe über den pc klappte :)

okay :) es gibt noch kleine grafikbugs mit dem ladebalken und der map an sich ( obere reihe und links)
bei Bewegungen :p mal schauen was sich noch findet^^
 
F

Feuerstern

Fortgeschrittenes Mitglied
Jaiel schrieb:
Hi ich kriege Men parsing Fehler beim download
habe Android 5.0.1 Note 4 schade
Den hab ich auch bekommen als ich die Datei vom Handy aus runtergeladen habe. Wenn man die Datei aber vom PC aus lädt und aufs Handy kopiert geht es.

EDIT:
Nutzt du ein Framework für dein Game und den Map Editor?
 
Zuletzt bearbeitet:
Railwanderer

Railwanderer

Ambitioniertes Mitglied
Ne alles selbsr geschrieben u ausgedacht. Nur standard sachen
habe ich aus einen buch uebernommen sowas wie:
Drawpixmap() oder input.getEvent(). Aber dabhoerts schon auf ;)
Ahja ein screen interface ist da auch dabei, dass die grafik in eins
surface view packt. Ich werde die tage meinen code im app entwickler club
(Siehe unten) mal posten. :)
 
Jaiel

Jaiel

Experte
Hey hab das mal getestet

Ich finde es sieht sehr gut aus für den Anfang und man merkt dass du dir damit Mühe gemacht hast.
Die Übergänge der Texturen sehen gut aus und man erkennt gar keine Nahtstellen.
Du hast gesagt dass irgendwas oben und links noch nicht so sauber aussieht.
Vielleicht meinst du dass wenn man sich bewegt dann sieht man das sich die vers. Texturen aus denen deine map besteht für einen kurzen Zeitraum nicht gleichmäßig bewegen...Also dafür muss man wirklich genau hinschauen um es zu erkennen und als die Person die das programmiert fällt sowas einem natürlich ins Auge oder wenn man sehr konzentriert auf sowas achtet aber für den Normalo kaum auszumachen.

Weiterhin lässt es viel Gameplay Potenzial erkennen.

Man kann zur Zeit ja nicht viel zum Gameplay sagen. Deswegen gehe ich mal auf die Sachen ein die schon vorhanden sind.

Es gibt einige wenige Sachen welche man noch verbessern könnte.

Die Steuerung scheint noch nicht so flüssig zu sein
1. Wenn man mit dem Daumen die Steuerrichtung ändert dann läuft man erstmal 1 Block weiter und dann erst ändert er die Richtung. Das game reagiert zu spät darauf.
2. Wenn man auf ein Richtung drückt und den Finger auf dem Schirm hält dann läuft er weiter in die Richtung. ..Könnte von Vorteil sein falls man seine Finger nicht bei langen Märschen verkrampfen möchte und etwas bewegungsraum braucht.
3. Ich kann mir vorstellen dass man aus versehen an das Inventar ran kommt wenn man nicht aufpasst...Entweder versteckst du das Inventar wenn man es nicht braucht, platzierst es an eine andere Stelle oder führst ein Dynamisches Steuerkreuz das sichtbar wird wenn der User den linken Bereich berührt an der berührungsstelle
https://lh5.ggpht.com/PLupGMe8Q2Xfo2fIHx_07JVydEWEz5s7P6u8gW04H0UjsD_a13FW86cY05p3ewBTkw=h900
4. Ich hab mich dabei erwischt irgendwo auf die Landschaft zu klicken in der Hoffnung dass sich der nackte Typ dann dahin bewegt...vllt auch eine gute Möglichkeit sich zu bewegen?


Die Map und Kamerabewegung
Ich würde als User es lieber haben wenn die Map vollständig begehbar ist ohne Übergänge...Gibt es eine Möglichkeit die Map dynamisch zur Laufzeit Stück für Stück nachzuladen so dass man flüssig über die gesamte Map laufen kann?


Die Hardbuttons sind ständig an...Ich weiß nicht wieso das Spiel das macht und die App braucht auch die Permission das Gerät on zu halten.

Ein Bug hab ich dabei entdeckt wenn das Display abgeschaltet wird: man kommt ins Hauptmenü und der klicksound wird 2 mal abgespielt.

Im Menü fragt das Game auch nur einen up event ab so kann ich zum Beispiel irgendwo auf den Bildschirm tatschen zum Sound hinbewegen und beim hochheben wird dieser Button ausgewählt.

Ein paar Vorschläge von mir für die weitere Entwicklung

Lade während eines Splashscreens schon mal alles nötige vor so dass wenn man spielen möchte es auch sofort losgeht...Kannst ja die Animation wo man in die Spielewelt eintaucht trotzdem beibehalten.


Ja das wars erstmal von mir. Alle Achtung! Bleib dran es sieht sehr gut aus und mach was tolles daraus.

LG

Jaiel

P.S. Mal ne frage wofür nutzt du den A* Algorithmus? Für den nackten Mann sehe ich da keine Anwendung aber für die KI schon.
 
Zuletzt bearbeitet:
Railwanderer

Railwanderer

Ambitioniertes Mitglied
Vielen Dank fuer das ausfuehrliche feedback :)

Du hast recht, ich meinte genau diesen mini bug der beim
bewegen die mal oben und links um einen pixel versetzt zeichnet,
mir wurde aber auch von einem freund gesagz dass es vernachlaessigbar ist.

zur steuerung:
Hier habe ich es mir wirklich schwer getan, wenn ich die tage den code poste
wird sich sicher so mancher fragen wieso das spiel ueberhaupt funkrioniert ;)

Die bewegung wird in einem extra thread berechnet. Der spieler ja an die tiles
gebunden und bewegt sich immer von tile zu tile. Meine befuerchtung ist:
Der impuls zum richtung aendern wird im gameloop verarbeitet.
Mit synchronisierung kenne ich mich leider noch nicht aus, daher kommt
sicher dieser impuls zu spaet im seperaten movement thread an.
dieser reagiert/checkt immer erst die richtung wenn er den spieler
vollstaendig auf den naechsten tile bewegt hat. In der zwischenzeit ignoriert
er alles.

abhilfe will ich mir mit a* pathfinding schaffen um genah das zu erreichen
was du schon gemerkt hast: iwo hinklicken und der player soll
dort hinlaufen. Ehelich gesagt habe ich mich soweit sehr an dem spiel
"Warspear online" orientiert. Dort wird es genau so gemacht.
allerdings ist mein a* noch verbuggt. Ich poste bei gelegenheit eine
anschauliche version dienzeigt wie er sucht.

die karte waehrend des laufens vorau zu "buffern" sollte eigendlich
gut machbar sein, da ich einen 2d int array zum speichern der tile
infos nehme.ab einer gewissen position, muesste ich somit nur
die entsprechenden zeilen in den array laden. Das ist auch ein guter tip
da er die spielwelt sicher fluessiger erscheinen laesst :)

Auf dem handy meiner freundin (sg s3 neo) sind die fps signifikant
Weniger hoch. Merkwuerdig denn im endeffekt ja das selbe handy wie meins(sg s3)

Ich denke wenn ich den garbage collector entlaste (laeuft anscheinend auf
hochtouren) werden die fps bestimmt wieder sehr hoch sein.
ich halte euch auf dem laufenden ;)
 
Jaiel

Jaiel

Experte
Dann bin ich mal gespannt auf den Code...Die Steuerung vor allem das klingt mir echt ungünstig es separat zu behandeln so groß kann der Aufwand ja nicht um es auszulagern ?

Warum findet die Bewegung eigentlich nur von Tile zu Tile statt ? Kannst du die Tiles nicht in kleinere Quadrate unterteilen auf denen man sich bewegen kann?

Wie gesagt bin mal gespannt auf den source...
 
Railwanderer

Railwanderer

Ambitioniertes Mitglied
Mein gedanke war einfach : wenn ich ihn nur von tile zu teil bewegen lasse,
ist kollison detection und sachen wie : nutze geganstand auf tile vor dir oder swich map
einfacher zu handhaben. Auch ob gegner anfangen anzugreifen oder nicht. Wenn ich mich nicht an die tiles halte koennte da bestimmt komplizierter werden.

Der bewegungsthread ist in einem seperatem thread da ich nicht wusste, wie ich es sonst
anstelle dass er laeuft bis er ankommt. Mit einer while schleife haenge
ich natuerlich die ganze app mit auf, bzw ich muesste ihn dann abhaengig
von den fps oder so bewegen^^ da war ich schlicht ueberfordet.

die hardbuttons sind uebrigens an weil ich wakelock nutze,
ich hasse es wenn man im spiel ist, kurz was am pc macht (mukke
wechselt oder aehnliches) aufs handy schaut u man rausgeflogen ist,
Chat nachrichten somit nicht mehr ankamen etc. Bei meinem spiel
jetzt nicht gravierend aber ich wollte es gleich einbauen ;)
 
Railwanderer

Railwanderer

Ambitioniertes Mitglied
und hier, nicht zum nachmachen gedacht, der code:
Android Studio Projekt.zip

ja, ich habe mir natürlich zuviel vorgenommen und ja, auch viele viele
Denkfehler im code, abeeer ich habe auch sehr viel gelernt ;)
 
Railwanderer

Railwanderer

Ambitioniertes Mitglied
Grober Leitfaden durch den Code:


Bei Bedarf gebe ich gerne noch den Code zum dazugehörigen MapEditor,
evtl muss dort jedoch der Pfad, inwelchen die map 2Darrays gespeichert werden,
auf windows spezifische Pfade geändert werden da ich unter mac entwickle.

zur Android app:
meine App strukturiert sich im package android.railwanderer.mapwindowtest wie folgt:

game framework:

/generics
/implementation
/interfaces


meine Codes:

Assets (Klasse)
LoadingScreen(Klasse)
MainActivity (Klasse und MainActivity)
MainMenueScreen(Klasse)
/TopDownTile
/PlayerStuff


das gameframework habe ich aus dem buch, ich habe es fast komplett übernommen,
aber bin es Zeile für Zeile mit Haufen text im buch durchgegangen. Lediglich
kleine Veränderungen habe ich vorgenommen, z.b eine beenden Funktion implementiert,
oder die scaled bitmap draw function verändert, um mit anderen filtern zu scalieren.
Es arbeitet wie folgt:

im ordnet /interfaces wird ein grober plan festgelegt, was das spiel braucht
die interfaces werden dann durch die Klassen

im ordner /implementation
für android implementiert. der Vorteil ist dass man später weniger aufwand
beim Porten für reine desktop Anwendungen haben soll, da man einfach die
jeweiligen Interfaces für die Nutzung als java Applikation schreibt.
im ordner /generics habe ich die pool klasse abgelegt, da ich diese <> liste
noch nicht 10000% verstanden habe ;) eigl. gehört sie zur implementation unter
android, da sie mit der AndroidInput Klasse zu tun hat. Es geht hier um die wiederbenutzung der Input events um Garbage Collector Probleme zu vermeiden.
Im Buch ist das alles sehr ausführlich erläutert.

In der Klasse AndroidGame
läuft dann alles zusammen, es wird ein FrameBuffer erstellt, bei mir eben 608/416 festgelegt, da das mit der Anzahl an angezeigten Tiles auf dem Screen
gut passt. Auf diesen FrameBuffer wird dann gezeichnet und das Bild hochskaliert. Das zeichnen u skalieren passiert in der Klasse FastRenderView.

Diese View wird gesetzt sobald der Constructor der AndroidGameKlasse abschliesst.

In dieser FastRenderView läuft der Gameloop.

game.getCurrentScreen().update(deltaTime);
game.getCurrentScreen().present(deltaTime);

das AndroidGame (Klasseninstanz) gibt bei getCurrentScreen() den screen zurück,
da dieser im Constructor durch getStartScreen() zugewiesen wurde.

die methode getStartScreen() ist jedoch nur im Interface deklariert.
Daher wird diese in der MainActivity meiner App überschrieben. Das ist neben Settingsladen
auch das einzige was in die MainActivity geschrieben wird. Somit kann das
Framework schnell übernommen werden.

in der MainActivity wird in der getStartScreen Methode ein new LoadingScreen zurück gegeben, und der GameLoop läuft.
Dabei werden eben getcurrentScreen.update() und .present() aufgerufen.
diese Methoden beschreibe ich dann in meinen ScreenKlassen.

Die anderen Klassen des Gameframeworks bieten eben Funktionen um auf
den Canvas zu zeichnen, Input events abzufragen etc.

Bisher hin ist alles sehr professionell gelöst, und schön geordnet bzw getrennt.


Und hier, im LoadingScreen fängt nun mein Part an, alles ausserhalb der 3 gameframework packages ist mein code:

im loadingscreen werden in der update Methode, die nur einmal durchgegangen wird, alle bilder etc geladen. die present Methode zeigt eigl ein logo auf schwarzem
hintergrund an aber es geht so schnell die Bilder zu laden, dass man es nicht wirklich sieht.

chaotischerweise wird in der present Methode der Screen auf einen anderen (Mainmenü) gesetzt sobald die update Methode alle assets geladen hat....fällt mir grad auf, gehört wohl auch eher in die update Methode.

danach gehts im MainMenueScreen weiter.
in der update methode check ich nur nach Input events, schalte sound off wenn
der sound button geklickt wird, ansonsten lade ich die MaplayerViews (mapLayer)
und Zeichne dabei den LadeBalken. Im thread stelle ich fest ob alles geladen wurde (GameScreen) und wenn ja ist die run Methode fertig und ich
jump in die GameScreen Klasse ( /topDownTile).

Diese GameScreenKlasse hat einen MapHandler, der die 40 Mapstücke der Insel lädt (im Constructor). Dieser ruft den Maploader auf
und in der lademethode dort Steigere ich den Ladebalken, dass man sieht wie weit er ist.
es sind also nicht die Bilder die lange vorladen müssen aber meine Maps,
die 10 Layer pro Map haben, und 20x20 tiles pro layer ;)

dort im gamescreen wird nun die spielwelt gezeichnet u geupdated, je nach State.

Sie ruft den MapHandler auf (/TileStuff).

dieser wiederum hat die 40 geladenen Maps und eine welche die aktuelle ist,
auf der sich der Spieler befindet.
Diese wird je nach state gezeichnet:
StateRunning = rumlaufen
StateBackground = Insel karten ansicht.

die einzelnen Maps sind MapBoundle Instanzen, und bestehen aus der Map-Klasse
der unteresten Ebene Bilder, und der LayerMap Klasse,
welche die 10 Layer darüber bilden, also bäume, Felsen etc etc
Die Namensgebung (Map für eine Schicht der map) ist unglücklich gewählt,
so ne Sache wie viele die ich ändern muss ;)

die Map- und LayerMaps- haben jeweils eine MapView oder 10 LayerViews.
in dieser wird abhängig v Spieler gecheckt, welche ausschnitte des [][]Tileobjects
Layer gezeigt werden müssen, da das Sichtfeld ja nur einen ausschnitt der aktuellen karte zeigen kann (17?,8?)
Dazu wird geschaut wo der Spieler ist, und der Offset berechnet, den die karte braucht
um auf dem Bildschirm zu bleiben ;) denn bewegt sich der Spieler bewegt sich die karte,
zumindest bis zu gewissen rändern, an denen dann diese CenterX u CenterY Variablen (Mittelpunkt des Ausschnittes, wo der Spieler läuft) "festgesetzt" werden, damit die karte zb bündig mit dem linken bildschirmrand stehen bleibt.
sobald der spieler in diese ecke geht kann er sich frei bewegen.
Ansonsten würde sich die kartenecke zum mittelpunkt des Bildschirms verschieben.

die verschiedenen layer können das tileobject zeichnen, oder später zeichnen lassen,
damit ich gewisse Sachen je nach position des Spielers über ihn zeichnen kann.

um sich die tiles anzuschauen muss man die klasse tiles öffnen und tilesobject, welche von tiles erbt.
in tiles ist die Beschreibung für jedes tile, je nachdem welches layersheet (int)
der layer hat, wird ein gewisses bild ausgesucht, allerdings muss ich das auch mit
weniger code hinbekommen können...es ist dort noch sehr chaotisch da alte
Sachen noch halb mit drin hängen. aber wenn man sich im kopf behält das die
layer 2d Arrays aus tiles oder tileobject Instanzen haben welche je nach übergebenen
layersheet gewisse Eigenschaften haben, und diese zeichnen lassen,
kann man verstehen wie mein tilemap engine versuch funktioniert ;)


Grassground und layer 1-8 sind die benutzen tileobjects, testlayer ist nur da
um meinen apath versuch zeichnen zu lassen.

im ordner GUIs sind die Elemente wie steuerkreutz minimap hotkeys etc gehandelt.

/MapCodes/MapProperties/ kann eigl ignoriert werden, das stammt noch aus der zeit vor dem Mapeditior,
und ist dummerweise noch teils verflochten ( die layersheets als int) was ich wie gesagt
noch bereinigen muss, damit ich meine Layersheets auch austauschen kann.
Die ganze Sache wie die Tiles die layersheets zugeordnet bekommen macht
mich noch nicht so glücklich ;)
schön wär es natürlich noch den mapeditor ein stück zu erweitern,
dass er bilder öffnen kann und diese als bytearray? speichert und die app das wie die tilecodes lädt.
dazu fehlt mir aber das wissen um Grundlagen wie buttons, popup windows, filepaths öffnen unter java.
ich könnte es über das Terminal hardcoden aber naja nicht das wahre :D ...kommt noch alles.
auch eine option ein tile im mapeditor gleich die Eigenschaften (toptile etc) zuzuweisen...
oder eine ingame cosonsole zum späteren ordentlichen testen.
zur zeit kann man "cheaten" bzw sich an einen begehbaren ort bringen falls es buggt, wenn man
auf dem handy den eigenedateien ordnet öffnet und gamnom.txt modifiziert.
ist leicht rauszulesen was x und y ist ;)

das war jetzt mal eine grober überblick und ausschnitt aber erstmal das grundgerüst dass man ein bissl
versteht. :)

andere Sachen wie Sprites, etc sind dann schon wieder neue Spielereien, die auch nur funktionieren aber
noch nicht weiter verbessert wurden, bzw effizient geschrieben sind ;)
 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Boah das ist wirklich viel was du geschafft hast. Arbeite weiter daran und versuch den Überblick zu behalten.

Ein Rat, den ich nciht beherzigt habe: alles gut Planen so dass man später nciht zu viel ändern muss. Ich schreibe grad 25% meiner app nochmal neu bzw. um. Und das dauert heute shcon den ganzen Tag und wird bestimmt noch bis morgen abend andauern...WE im Arsch bzw. Fortschritt gleich 0 bei mir zur Zeit :(
Ich freue mich schon darauf es endlich beenden zu können...sind nur noch einige features die eingebaut werden müssen...danach kann ich endlich ein enues projekt beginnen...

Was genau wird das eigentlich? Hatte glaub cih mal was von survival horror gelesen...bin mir nciht siocher ob es von dir war.

Aber coole Sache...da merkt man wieviel arbeit ein kleines Spiel so amchen kann:)
 
Railwanderer

Railwanderer

Ambitioniertes Mitglied
Hahaa ja allerdings! Ich habe ein aehnliches problem, ueberlege auch meins nochmal neu anzufangen
Und dabei gleich ordentlich zu strukturieren ;) viele stellen wuerde ich jetzt anders loesen bzw anders
Von anderen stellen im code abhaengig machen. Aber ich musste ja sowieso erstmal java verstehen
und in ein logisches denken reinkommen, dafuer bin ich trotz schlechter strukturierung stolz xD

Vieles wurde mir auch erst beim programmieren bewusst. Ich musste mir erstmal rechnungen etc
einfallen lassen um die kamera verfolgung umzusetzen wie ichs mir vorgestellt habe etc..in zukunft
werde ich auch alles neue erst auf dem papier vorskizzieren und dann noch wenn moeglich
gesondert testen ;)

aber danke schonmal fuer das lob! Ich habe auch in deinen code kurz reingeschaut, aber bisher leider
nur ueberflogen, ich hogfe heut abend wieder ein zwei std zu finden um nochmal zu reinzulesen ;)

mein app soll ein mini rpg werden, aber davor erstmal ein gescheiter 2d tilemap "engine" ;)
Wie du sagst, ein gutes grundgeruesst ist ueberlebenswichtig ;)
 
Jaiel

Jaiel

Experte
Ach verschwende deine Zeit nciht darauf...dein Projekt ist auch sehr arbeitsintensiv ;)