Hilfe beim ersten Spiel (Datenmodellierung und Performance)

  • Hallo,


    habe noch keine Erfahrung in der Programmierung von Spielen und wollt das deshalb mal mit einem Android-Spiel probieren.
    Dazu nehme ich als Vorlage ein vorhandenes Spiel (ist ja nur für mich gedacht).
    Bei dem Spiel geht es darum rechteckige Bereiche einzugrenzen und dadurch einzufärben. Eingefärbte Bereiche können von den Gegner-Bots nicht überquert, d.h. sie prallen davon ab. Außerdem werden Bereiche nicht eingefärbt, wenn sich ein Gegner darin befindet, dann wird nur die gezogene Linie eingefärbt (nicht die ganze Fläche darin). Ziel ist es einen bestimmten %-Satz des Spielfelds einzufärben.
    Problem:
    Ich weiß nicht, wie ich die Einfärbungen als Daten darstellen soll.
    Variante 1:
    Macht es Sinn, das Spielfeld in Spielpixel einzuteilen? Dadurch könnte man einfach alle Spielpixel durchgehen, wenn Dinge wie Kollision geprüft werden sollen. Allerdings erfodert das eben eine Menge Daten (2-dimensionales Array mit mindestens einem Wert Farbe). Ist das effizient machbar?
    Variante 2:
    Darstellung der eingefärbten Bereiche durch Einteilung in Rechtecke. Das zu programmieren ist aufwendiger durch viele Sonderfälle etc.


    Variante 3:
    Über die Grafikengine? Ist sowas möglich? Kann man da Prüfungen wie "liegt der Punkt (x,y) in einem eingeschlossenen, nicht-konvexen Bereich" ?
    Variante 4:
    Weitere Vorschläge? Best practice?


    Freue mich auf Tipps und Hilfen :)


    PS1: http://www.androidpit.de/de/an…iew/Spieleentwicklung_101 hab ich schon gefunden ;)
    PS2: Bin noch Student, daher der Mangel an Praxiswissen ;)

  • Sinnvollerweise trennst du Berechnung, Daten und Ausgabe.


    Die Daten werden wohl eine ArrrayList mit den Bots sein, die alle einen Punkt als Koordinaten haben - oder haben sie auch eine Fläche??
    Und die Rechtecke - auch in einer ArrayList - haben zwei gegenüberliegende Ecken.


    Eine Methode für die Prüfung if (bot.innerhalb(rechteck))... überlasse ich deiner Phantasie - das wird der einfachste Teil der Arbeit. 8)


    Für die Ausgabe brauchst du einen Canvas, auf dem du die Elemente nacheinander draufmalst - übrigens immer wieder, wenn sich ein Bot bewegt hat. Dazu gibt's genug Beispiele in den API-Demos der Android-Doku.


    Bei der Grafik solltest du auch an unterschiedliche Bildschirmauflösungen denken - auf einem Tablet solltest du nicht die volle Auflösung nutzen.


    Interessant wird es, wenn du viele Rechtecke und Bots rumlaufen hast - dann wird das Timing spannend... *g*

  • Danke für die Antwort :)











    Ja, es wird ein Array Enemies[] geben, die alle als Rechtecke definiert sind (alle 4 Seitenkoordinaten inkl. Länge und Breite), welche als Hitbox zu verstehen ist, in dem Rechteck (wird wohl auf kleine Quadrate hinauslaufen) kann man natürlich alles reinzeichnen.




    Eine Methode für die Prüfung if (bot.innerhalb(rechteck))... überlasse ich deiner Phantasie - das wird der einfachste Teil der Arbeit.




    Diese Methode wird tatsächlich nicht schwer, jedoch die Einteilung in Rechtecke. Der Spieler läuft wie im klassischen Snake frei übers Feld, wobei er am Rand startet und eine Spur hinter sich herzieht. Wenn die Spur wieder am Rand ankommt, wird der eingegrenzte Bereich inkl Spur eingfärbt (solange kein Gegner darin ist). Diese Fläche kann ein "komplexes" Vieleck sein, dass sich theoretisch in Rechtecke einteilen lassen würde, die man einzeln prüfen könnte.




    Alternativ könnte man aber auch virtuelle Pixel einführen, und dann zB definieren, dass der Spieler 10x10 Spielpixel groß ist etc. Dann hätte man ein Array Spielpixel[x][y], die alle eine Farbe speichern. Je feiner die Einteilung und je größer das Display, um so größer das Array und ich wüsst gern, ob regelmäßige Iteration über so ein großes Feld dann praktisch Kinderkram für ein typisches Android-Phone sind oder doch ordentlich Leistung+RAM fressen.




    Für die Ausgabe brauchst du einen Canvas, auf dem du die Elemente nacheinander draufmalst - übrigens immer wieder, wenn sich ein Bot bewegt hat. Dazu gibt's genug Beispiele in den API-Demos der Android-Doku.


    Noch weit von entfernt, aber ich werds mir merken ;)






    Bei der Grafik solltest du auch an unterschiedliche Bildschirmauflösungen denken - auf einem Tablet solltest du nicht die volle Auflösung nutzen.


    Guter Tipp, an Tablets habe ich noch gar nicht gedacht.


    Interessant wird es, wenn du viele Rechtecke und Bots rumlaufen hast - dann wird das Timing spannend... *g*






    Es werden zuerst die Bots berechnet (Enemey.move() welche auch Treffer auf Hindernisse wie Wände, Spieler und Spielerspur prüft), dann der Spieler und damit gleichzeitig die Neufärbung der Flächen. Wird sich dann später zeigen, wie das klappt ;)

  • Zitat

    es wird ein Array Enemies[] geben, die alle als Rechtecke definiert sind (alle 4 Seitenkoordinaten inkl. Länge und Breite)


    alle vier Koordinaten und noch Länge und Breite? Brauchst du die alle??


    Gerade am Anfang speichert man sich oft zu viele Sachen, die man besser bei Bedarf (der ist nämlich eher selten) schnell mal berechnen kann. Wenn die Enemies alle gleich groß sind, dann genügt bei denen wirklich nur ein Punkt als x- und y-Koordinate (am besten in der Mitte). Die Fläche interessiert dann nur in der Kollisionsberechnung (z.B. x+3, x-3...).


    Dasselbe gilt wahrscheinlich auch für deine Rechtecke. Du brauchst sie, um den Canvas neu zeichnen zu können, für die Kollision reicht aber das Rechteck des freien Platzes - es müssen ja alle Enemies innerhalb sein. Und wenn der User ein neues Rechteck abspaltet, den Teil in die ArrayList der Rechtecke einhängen, der Rest bleibt frei als freier Platz.


    Für die Rechtecke gibt's auch was von Android: RectF - das brauchst du sowieso für den Canvas.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!