Probleme mit mehreren Objekten in Canvas

  • Antworten:7
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 18

15.05.2013, 22:06:00 via Website

Hallo zusammen,
ich versuche gerade ein kleines Game auf Android umzusetzen und weiß nicht so recht, wie ich mehrere Objekte desselben Typs darstellen und modifizieren(bzw. deren Koordinaten) kann. Zum Bildaufbau habe ich onDraw überschrieben und zeichne mit z.B. canvas.drawcircle einen Kreis, der meinen Player darstellt. Jetzt habe z.B. die Klasse enemy die ich mehrmals mit unterschiedlichen Koordinaten zeichnen möchte, allerdings ist die Menge der "enemys" abhängig von der aktuellen Spielsituation. Ich möchte also nur wissen, wie genau ich in der onDraw unterschiedlich viele Objekte (abhängig von der Spielsituation) darstellen/entfernen kann, um z.B. Gegner oder Schüsse darzustellen.

Ein Denkanstoß wäre super, vielen Dank

— geändert am 16.05.2013, 14:37:53

Antworten
LitteM
  • Forum-Beiträge: 141

16.05.2013, 00:37:25 via Website

Habe gestern selbst ein bisschen nach so etwas gesucht was du meinst. Hier im Forum bin ich dabei auf zwei Threads gestoßen (siehe unten).
Werde mich allerdings erst in den nächsten Tagen selbst damit befassen, daher kann ich dir momentan relativ wenig weiterhelfen.
Wenn ich mich richtig erinnere müsstest du mit Canvas jedes Mal wenn sich etwas auf dem Bildschirm bewegt/ändert das komplette Bild neu zeichnen.
Ich habe mit Canvas ein Bild gezeichnet über die ich einen Kreis durch onTouch mit meinem Finger bewege.
In der onDraw beide Elemente zeichnen. Jedes Mal wenn du den Bildschirm berührst kannst du eine Variable aktualisieren und die onDraw erneut aufrufen um alles neu zu zeichnen. Ob das für dein Projekt ausreicht weiß ich allerdings nicht. Wühl dich mal durch die Threads, da steht interessantes drin.

https://www.nextpit.de/de/android/forum/thread/398213/2D-Games-pure-Java-oder-OpenGL
https://www.nextpit.de/de/android/forum/thread/416820/Performance-Tipps-fuer-Spieleprogrammierung?si=40


Grüße

— geändert am 16.05.2013, 00:37:44

Antworten
Gelöschter Account
  • Forum-Beiträge: 8.246

16.05.2013, 06:44:20 via Website

Hallo

Bitte bearbeite noch mal deinen Threadtitel gemäß unseren Regeln, damit auch klar wird worum es überhaupt geht.
Um den Threadtitel zu ändern im ersten Posting auf bearbeiten klicken.
Danke.

Viele Grüße

Freakyno1
Das AndroidPIT Moderatoren und Administratoren Team

Antworten
Gelöschter Account
  • Forum-Beiträge: 18

16.05.2013, 14:47:36 via Website

LitteM
Habe gestern selbst ein bisschen nach so etwas gesucht was du meinst. Hier im Forum bin ich dabei auf zwei Threads gestoßen (siehe unten).
Wenn ich mich richtig erinnere müsstest du mit Canvas jedes Mal wenn sich etwas auf dem Bildschirm bewegt/ändert das komplette Bild neu zeichnen.
Ich habe mit Canvas ein Bild gezeichnet über die ich einen Kreis durch onTouch mit meinem Finger bewege.
In der onDraw beide Elemente zeichnen. Jedes Mal wenn du den Bildschirm berührst kannst du eine Variable aktualisieren und die onDraw erneut aufrufen um alles neu zu zeichnen. Ob das für dein Projekt ausreicht weiß ich allerdings nicht. Wühl dich mal durch die Threads, da steht interessantes drin.
Grüße

Servus, danke für dein Feedback. Das Zeichnen mit Canvas ist kein Problem, das Game wird von einem UI- und einem Game-thread geloopt. Mein Problem ist, dass ich noch nicht genau weiß, wie viele Objekte letztendlich im Spiel gezeichnet werden (z.B. wie viele Schüsse gezeichnet werden). D.h. ich brauche eine Art Schleife zum Zeichnen von Objekten. Das habe ich bis jetzt mit einer for-Schleife gemacht, sieht mir aber alles zu "wackelig" aus. Was ich meine ist eine Methode zum Zeichnen von mehreren Objekten, der ich dann die Anzahl sowie z.B. Koordinaten-Arrays übergebe (in etwa so etwas: drawPoints(float[] pts, int offset, int count, Paint paint) -> Draw a series of points.). Ich hoffe das das ein wenig genauer war :grin:

Grüße Mo

Antworten
impjor
  • Forum-Beiträge: 1.793

16.05.2013, 14:52:28 via App

Ich würde dir empfehlen eine Klasse/Interface zu schreiben, welche eine draw(Canvas c) - Methode besitzt.
Dann noch eine ArrayList erzeugen, in der alle zu malenden Objekte sind. in der onDraw gehst du dann durch die ArrayList und rufst für jedes Element die draw-Methode auf.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Gelöschter Account
  • Forum-Beiträge: 18

16.05.2013, 19:52:22 via Website

Hi, danke für die Antwort. Also die View läuft schon einwandfrei. Meine Frage besteht lediglich darin, ob ich - angenommen ich brauche einen Kreis 10 mal - diesen in einer for-Schleife 10mal zeichnen soll oder ob es dafür eine elegantere Lösung gibt.

Grüße

Antworten
impjor
  • Forum-Beiträge: 1.793

16.05.2013, 21:37:07 via App

Wie gesagt, ich würde eine Basis- Klasse schreiben, die Koordination und Größe verwaltet und eine draw() Methode besitzt. Dann leitest du davon z.B. eine Kreis- Klasse ab, die die draw- Methode überschreibt und eine Kreis malt.
Letztendlich zeichnest du in einer for- Schleife dann nicht Kreise, sondern lässt die Kreis- Klasse das machen.
Wenn du irgendwann eine Rechteck- Klasse hast, brauchst du nichts zu ändern, außer eine draw-Methode in der Rechteck- Klasse.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Gelöschter Account
  • Forum-Beiträge: 18

17.05.2013, 17:29:24 via Website

Hi, ich werde deinen Vorschlag ausprobieren. Danke :-)

Antworten