Entwerfe Entscheidungen / Ratschläge für ein einfaches Spiel auf Android

8

Ich brauche deinen Ratschlag für die beste Möglichkeit, ein scrollbares Spielfeld in einem einfachen Spiel zu implementieren. Das Feld besteht aus mehreren Zeilen mit jeweils 9 Zellen in jeder Zeile. Die Reihen können im Laufe des Spiels dynamisch hinzugefügt und entfernt werden. Jede Zelle hat eine Ziffer und optional mehrere überlagerte Bilder, wie Auswahl, Auswahl über, Durchgestrichen usw. (siehe Bild unten). Der Benutzer sollte in der Lage sein, auf einzelne Zellen einer Zeile zu klicken, um die berührten Zellen auszuwählen / abzuwählen / zu kreuzen. Zu jedem Zeitpunkt im Spiel kann es 0 bis 3000 Zellen geben (0 bis etwa 333 Zeilen). Das Feld sollte sanft nach oben und unten scrollen.

Ich habe über eine ListView nachgedacht, bei der jede Zeile eine Zeile auf dem Feld ist. Auf diese Weise konnte ich während des Spiels dynamisch Zeilen hinzufügen / entfernen. Wie genau sollte ich jedoch eine Zeile implementieren: eine Bitmap, die eine Zeile darstellt, und dann, wenn der Benutzer sie berührt - die Koordinaten des Berührungsbereichs abrufen und herausfinden, welche Zelle betroffen ist, und dann darauf reagieren. Ist es möglich, die Touch-Koordinaten einer Zeile in ListView zu erhalten? Wenn nicht, sollte ich 9 Dummy-Bildplatzhalter in jeder Zeile platzieren und dann darauf reagieren, dass der Benutzer diese berührt? Was ist mit Leistung?

Oder sollte ich ein riesiges Bitmap / Canvas haben, das das gesamte Feld darstellt, es in eine ScrollView einfügen und dann alle Koordinaten berechnen und aktualisieren, wenn der Benutzer damit interagiert? Wird es schneller oder langsamer als das ListView?

Irgendwelche anderen Lösungen?

Ich bevorzuge es, ein "normales" App-Typ-Spiel zu sein, kein Loop-basiertes Spiel, da ich glaube nicht, dass ich wirklich 30 Mal pro Sekunde neu zeichnen muss.

Ich bin ziemlich neu in Android. Danke für Ihre Vorschläge.

    
Levon 21.12.2010, 08:14
quelle

2 Antworten

4

Sie können diese Art von Setup schnell mit einer "Game Loop" / SurfaceView-Kombination ausführen. Das bedeutet keine ListView, nur benutzerdefinierte Zeichnung und Ereignisbehandlung. Glücklicherweise ist die Ereignisbehandlung nicht so schwierig und Sie werden später gewinnen, weil Sie viel mehr Kontrolle über die Benutzeroberfläche haben, als wenn Sie mit einer Reihe von benutzerdefinierten Ansichten und Layouts gegangen wären.

Ich würde das Tutorial von www.droidnova.com vermeiden, es verwendet HashMaps unnötigerweise, was Sie nur in der Leistung kostet.

So würde ich gehen:

  1. Erstellen Sie ein Objekt, das Ihre Zellendaten enthält. In diesem Beispiel würde ich ein Objekt mit einer ID (zum Drucken) und einem x und y für die Stelle auf dem Bildschirm verwenden.
  2. Entscheiden Sie sich für eine Boardgröße, die ohne Scrollen auf Ihren Bildschirm passt, sagen Sie 10x10. Sie werden das Scrollen später hinzufügen.
  3. Erstellen Sie ein zweidimensionales Array von Zellenobjekten mit Längen boardSize x boardSize. Füllen Sie die Objekte mit ID und X- und Y-Position auf dem Bildschirm.
  4. In Ihrem benutzerdefinierten onDraw durchlaufen Sie jede "Zeile" und "Spalte" Ihres einzelnen Arrays und zeichnen das Objekt an seinem gespeicherten x- und y-Wert.

Sie haben nun ein Raster mit Objekten, die auf Ihrem Bildschirm angezeigt werden. Jetzt möchten Sie die Anzahl der aktuell angezeigten Zeilen einschränken und einige Funktionen hinzufügen, um zu ändern, welche Zeilen sichtbar sind. Dies geschieht folgendermaßen:

  1. Richten Sie während der Initialisierung einige globale Ints als mCurrentRow = 0 und mNumVisibleRows = 3 ein. Diese definieren Ihr "Ansichtsfenster".
  2. Ändern Sie Ihren Zeichencode so, dass nur Zeilen beginnend bei mCurrentRow und endend bei mCurrentRow + mNumVisibleRows gezeichnet werden. Das Ergebnis davon sollte sein, dass Sie nur mNumVisibleRows-Zeilen sehen und welche Gruppe von Zeilen Sie sehen, hängt davon ab, was Sie mCurrentRow festlegen.
  3. Fügen Sie einige Dreiecke rechts neben der Rasterzeichnung hinzu, und tippen Sie auf Berührungsereignisse in diesen Bereichen, um Inkrementen / Dekrementen von mCurrentRow zuzuordnen. Offensichtlich sollten Sie diesem Wert nicht erlauben, außerhalb Ihrer Zeilenanzahlgrenzen zu gehen.
  4. Wenn du edel werden willst, zeichne eine Linie zwischen deinen Dreiecken für einen Scroll-Bereich und ordne Berührungsereignisse dort auf etwas wie newCurrentRow = (touch.y / canvas.height()) * boardSize; zu. Das erfordert einige Feinabstimmungen, aber du kommst auf die Idee.

Dieser Ansatz hat den Nachteil, dass nur eine ganze Reihe von Zeilen gleichzeitig angezeigt wird, sodass das Scrollen nicht reibungslos ist. Sie haben jedoch die vollständige Kontrolle über Ihre Arbeitsfläche und das, was Sie zeichnen. Mit ein wenig mehr Mathematik könnten Sie also einen reibungslosen Scroll-Mechanismus implementieren, der um eine Bruchzeilenhöhe in y-Richtung anstelle von ganzen Zeilen versetzt wäre.

    
Josh 21.12.2010, 17:15
quelle
1

Ich weiß nicht, ob Sie ein Spiel, wie Sie es beschrieben haben, mit guter Leistung erstellen können. Ich würde mich mit der grundlegenden Programmierung von Kacheln beschäftigen.

Aber durch die Vermeidung der Standard-Ansicht müssen Komponenten, die alle Logik selbst schreiben, ziemlich viel Arbeit erfordern. Dinge wie die Handhabung von "Klick" -Ereignissen in verschiedenen Reihen müssen anhand der Kachelposition relativ zur Spielkamera berechnet werden. Es gibt also viele neue Sachen, um zu lernen, Spiel auf einer niedrigeren Ebene zu entwickeln.

Sie müssen das Rendering Ihres Spiels auch selbst in die Hand nehmen, indem Sie eine Spielschleife entwickeln, die Ihre Kacheln ständig aktualisiert und aus einem Hintergrundthread zeichnet, um den Bildlauf / Status Ihres Spiels widerzuspiegeln. Weitere Informationen zu den Grundlagen einer Spielschleife erhalten Sie unter:

Ссылка

Wenn Sie mehr erfahren möchten, sollten Sie die folgenden Keynotes von android sehen.

Ссылка Ссылка

Das gibt Ihnen einen sehr guten Einblick in die Entwicklung von Spielen für Andriod auf einem niedrigen Level, wo Sie die Performance optimieren können.

    
Mads Lee Jensen 21.12.2010 08:35
quelle

Tags und Links