immer nur letzter eintrag einer arraylist wird gemalt ...

  • Antworten:22
  • Bentwortet
L3322
  • Forum-Beiträge: 467

24.01.2011, 17:51:49 via App

Also zur zeit spiele ich wieder ein bisschen mit canvas und wollt einen Raumschiff machen dass jede Sekunden eine Bitmap schießt ..
das Raumschiff wird wunderbar dargestellt und alles bewegt sich wie gewollt, und die Schüsse habe ich mir gedacht fasse ich einfach mal in einer arraylist mit den Koordinaten zusammen.
ein sSchuss wird auch angezeigt allerdings wird sobald es nochmal schiest der neue Schuss angezeigt die vorherigen aber nicht!!!
ich habe das ganze in eine For schleife gesetzt sodass alle nacheinander gezeichnet werden sollten ...
woran könnte das liegen?
falls nötig poste ich den Code nachher!

"Hard work beats talent, when talent fails to work hard"

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

24.01.2011, 17:53:50 via Website

naja ohne code wird man schwer sehen können was das problem ist ;)

swordiApps Blog - Website

Antworten
L3322
  • Forum-Beiträge: 467

24.01.2011, 17:59:24 via App

ja hab mir nur gedacht falls jemand ein ähnliches Problem hatte. :)
kennt jemand vielleicht eine andere Lösung?
ich poste den Code gleich

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

24.01.2011, 18:13:17 via Website

Also die Einträge in der ArrayList werden immer mehr daran liegts nicht.
1ArrayList nm = rocket.normalArray();
2 for(int i = 0; i < nm.size(); i++) {
3 NormalMissile norm = (NormalMissile) nm.get(i);
4 c.drawBitmap(norm.getMissBitmap(), norm.getMissX(), norm.getMissY(), bitmappaint);
5}

und wie gesagt es wird immer nur der neueste Schuss gezeichnet!
wie würdet ihr das machen?

— geändert am 24.01.2011, 18:35:45

"Hard work beats talent, when talent fails to work hard"

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

24.01.2011, 22:39:38 via Website

L3322
Also die Einträge in der ArrayList werden immer mehr daran liegts nicht.
1ArrayList nm = rocket.normalArray();
2 for(int i = 0; i < nm.size(); i++) {
3 NormalMissile norm = (NormalMissile) nm.get(i);
4 c.drawBitmap(norm.getMissBitmap(), norm.getMissX(), norm.getMissY(), bitmappaint);
5}

und wie gesagt es wird immer nur der neueste Schuss gezeichnet!
wie würdet ihr das machen?

1) Nutze Generics:
1ArrayList<NormalMissile> nm = rocket.normalArray();


Kommt bei normalArray() auch nen Raw-Typ zurück?? ;)

2) nimm ne einfachere Schleife ("foreach"):
1for (NormalsMissle norm: nm)
2{
3 c.drawBitmap(norm.getMissBitmap(), norm.getMissX(), norm.getMissY(), bitmappaint);
4}

3) Wo aktualisierst du den Canvas nach dem zeichnen? Woher soll er wissen, dass sich was bei ihm geändert hat?

Seid nett zueinander: AndroidPIT-Regeln ;)

Antworten
L3322
  • Forum-Beiträge: 467

24.01.2011, 22:52:47 via App

danke ich werde das gleich morgen probieren!

das Problem ist nicht wie es gezeichnet wird sondern dass immer nur der neueste Eintrag gezeichnet wird, sonst läuft alles korrekt!

"Hard work beats talent, when talent fails to work hard"

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

24.01.2011, 22:55:35 via Website

Was steht denn in dem Array drin, über das du da itterierst? Schau mal genau nach, wie oft du die Schleife durchläufst und welches NormalMissle-Objekt du am Wickel hast.

Das andere ist nur "sauberer" Stil ;)

Seid nett zueinander: AndroidPIT-Regeln ;)

Antworten
L3322
  • Forum-Beiträge: 467

25.01.2011, 15:06:17 via Website

Erstmal danke für deine Antwort :bashful:
Hat aber keine Änderung gebracht!! Also denke ich die for-Schleife stimmt nicht aber ich zeig dir jetzt den ganzen Code!

Hier wird sekündlich ein neuer Schuss "erzeugt":
1normal_miss.add(new NormalMissile(x + rocket.getWidth()/2, y));

1// rocket.normalArray(); = das Array oben!
2ArrayList nm = rocket.normalArray();
3 for(int i = 0; i < nm.size(); i++) {
4 NormalMissile norm = (NormalMissile) nm.get(i);
5 c.drawBitmap(norm.getMissBitmap(), norm.getMissX(), norm.getMissY(), bitmappaint);
6 }

Okay grade hab ich noch den Integer i getestet der läuft aber auch ordnungsgemäß durch!! wieso zeichnet es nur den letzten eintrag???
Mysteriös^^

— geändert am 25.01.2011, 15:10:31

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

25.01.2011, 15:55:14 via Website

Also i habe ich getestet das läuft gut durch aber wenn ich statt i bei:
1NormalMissile norm = nm.get(i);

1NormalMissile norm = nm.get(0);
eintrage kommt exakt das selbe ergebebnis raus immer nur der neueste Schuss!!
und wenn ich 1 oder mehr einsetze bekomme ich folgenden Error:

01-25 15:52:26.374: ERROR/AndroidRuntime(5586): java.lang.IndexOutOfBoundsException: Invalid index 5, size is 5
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at java.util.ArrayList.get(ArrayList.java:311)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at com.tapps.rocketfighter.GameView.spielfeld(GameView.java:89)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at com.tapps.rocketfighter.GameView.playGame(GameView.java:73)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at com.tapps.rocketfighter.GameView.paint(GameView.java:50)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at com.tapps.rocketfighter.GameView.onDraw(GameView.java:45)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at android.view.View.draw(View.java:6880)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at android.view.View.draw(View.java:6883)
01-25 15:52:26.374: ERROR/AndroidRuntime(5586): at android.widget.FrameLayout.draw(FrameLayout.java:357)
/.............\
achja da habe ich zum beispiel 5 eingesetzt!

heißt das jetzt dass die alten einträge null gesetzt werden ??? oder was?

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

25.01.2011, 16:39:27 via Website

Entfernt werden sie gar nicht!
geaddet werden sie hier:
1normal_miss.add(new NormalMissile(x + rocket.getWidth()/2, y));

Achja normal_miss.size() wird immer größer!


Die NormalMissile Klasse
1static int x, y;
2 Bitmap nm;
3
4 public NormalMissile(int x, int y) {
5 nm = ArcadeGame.getImage(R.drawable.missiles);
6
7 this.x = x;
8 this.y = y;
9 }
10
11 public static void moveMiss() {
12 y -= 5;
13 }
14
15 public int getMissX() {
16 return x;
17 }
18 public int getMissY() {
19 return y;
20 }
21 public Bitmap getMissBitmap() {
22 return nm;
23 }
24 public Rect getMissRect() {
25 return new Rect(x, y, x + nm.getWidth(), y + nm.getHeight());
26 }

"Hard work beats talent, when talent fails to work hard"

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

25.01.2011, 16:45:10 via Website

Mit vereinzelten Schnipseln ist das immer ein Rätselraten.

Die size der Liste ÜBER DIE DU ITERIEST ist 1, sonst würde beim Zugriff auf Index 1 (also das zweite Element) keine IndexOutOfBounds fliegen.
Das muss aber nicht zwangsläufig die Liste sein, der du die Raketen hinzufügst.

Meine Vermutung: Du erstellst irgendwann eine Kopie der Liste und fügst die Raketen zu einer anderen Instanz hinzu.

Also bitte mal mehr Quellcode, oder zumindest die Methode normalArray()

— geändert am 25.01.2011, 16:45:40

Antworten
L3322
  • Forum-Beiträge: 467

25.01.2011, 16:53:50 via Website

In der Rocket klasse werden sie hinzugefügt:
1public void fire(int mode) {
2 if(mode == big) {
3
4 }
5 if(mode == normal) {
6 normal_miss.add(new NormalMissile(x + rocket.getWidth()/2, y));
7 }
8 if(mode == around) {
9
10 }
11 }
12
13 public ArrayList normalArray() {
14 return normal_miss;
15 }

GameView Klasse
1nm = rocket.normalArray();
2 for(int i = 0; i < nm.size(); i++) {
3 NormalMissile norm = (NormalMissile) nm.get(i);
4
5 c.drawBitmap(norm.getMissBitmap(), norm.getMissX(), norm.getMissY(), bitmappaint);
6 }

"Hard work beats talent, when talent fails to work hard"

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

25.01.2011, 16:57:56 via Website

Sorry, aber Logikfehler findet man schlicht und ergreifend nicht mit solchen Codeschnipseln und das ist definitiv ein Logikfehler, oder ein Fehler in der zeitlichen Folge der Anweisungen.
Das geht nur, wenn man alle Stellen analysieren kann, an denen die Liste verwendet wird.

Antworten
L3322
  • Forum-Beiträge: 467

25.01.2011, 17:06:41 via Website

http://tapps.de.im/download/rocketfighter.zip
habs mal hochgeladen freu mich auch auf tipps!!

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

25.01.2011, 19:46:43 via Website

Niemand???
wie könnte ich es Alternativ machen?


Danke für die Bemühungen

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

25.01.2011, 22:27:40 via App

ja macht nichts ist eh super das du es versuchst danke ...
ich habe alles probiert ich glaub ich spinn echt ...

"Hard work beats talent, when talent fails to work hard"

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

26.01.2011, 08:38:01 via Website

OK Fehler gefunden: Mal wieder die bösen static Variablen...
Mein Ratschlag für Einsteiger in der Objekt-orientierten Programmierung ist ja immer: VERWENDE NIE STATIC !
...es sei denn du weisst, was das ist, weisst was es tut und es gibt keinen anderen guten Weg ;-)

static ist böse, static ist die dunkle Seite der Macht, static ist prozedurale Programmierung und nicht Objekt-orientiert :)
Mit static geht zwar einiges scheinbar einfacher, aber es ist in den meisten Fällen einfach nur unsauber programmiert...quick & dirty.

Das Problem ist static Variablen gelten FÜR ALLE INSTANZEN EINER KLASSE !!!

1public class NormalMissile {
2
3 static int x, y;
4 Bitmap nm;
5
6 public NormalMissile(int x, int y) {
7 nm = ArcadeGame.getImage(R.drawable.missiles);
8
9 this.x = x;
10 this.y = y;
11 }

D.h. jedes mal wenn du eine neue NormalMissile erzeugst, setzt du die Koordinaten FÜR ALLE RAKETEN um.
D.h. weiter, es gibt mehrere Raketen, aber die werden alle übereinander gemalt, weil sie alle auf dieselben Koordinaten zugreifen.

Also: verwende static am besten garnicht. Verwende saubere Kapselung in deinen Datenklassen mit private Variablen und getter/setter Methoden.

Zum Beispiel so:

1public class NormalMissile {
2
3 private int x, y;
4
5 public NormalMissile(int x, int y) {
6 this.x = x;
7 this.y = y;
8 }
9
10 public int getX() {
11 return x;
12 }
13
14 public void setX(int x) {
15 this.x = x;
16 }
17
18...

BTW: Per Konvention sollte man getter und setter exakt nach der Variable benennen und den ersten Buchstaben der Variable groß schreiben.
Das nennt sich dann "Bean-konform".

Also immer:

1private String variable;
2public String getVariable() {
3return variable;
4}

Ich hoffe das hilft dir weiter...auch langfristig :)

Grüße,
Rafael

— geändert am 26.01.2011, 08:41:00

Antworten
L3322
  • Forum-Beiträge: 467

26.01.2011, 15:01:40 via Website

verdammt da hätte ich auch selber drauf kommen können:mad:

Aber wirklich danke!
das ist das Problem bei mir immer ein bisschen schlampig ^^

Ich werds mir merken:

STATIC IST BÖÖÖÖÖÖÖÖÖSE:what:

"Hard work beats talent, when talent fails to work hard"

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

26.01.2011, 21:17:24 via App

Hey Danke!
Fang auch erst an und weiß jetzt endlich, was static genau ist (außer, dass Eclipse es manchmal vorschlägt oO) :grin:
Lg Ansgar

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

27.01.2011, 08:42:44 via Website

Gut...hab ich wenigstens ein paar Leute auf die gute Seite zurückgerettet :)
Das war die lange Erklärung doch glatt wert :)

Das war jetzt nämlich mal ein perfektes Beispiel was man sich für Seiteneffekte mit static einhandeln kann.
Man sieht dann einen Effekt, den man sich nicht erklären kann, weil er ganz woanders sichtbar wird, als man die static Geschichte benutzt hat.
Man sucht das Problem dann an der völlig falschen Stelle.

Eclipse ist auch leider immer sehr schnell mit Vorschlägen, die dazu verleiten etwas mal eben als static zu deklarieren.
Eclipse geht aber halt auch einfach davon aus, dass man um die Konsequenzen weiss.

— geändert am 27.01.2011, 08:49:26

Antworten