Spiel - Mücke (brauche Hilfe beim Tier hinzufügen)

  • Antworten:108
Patrick M.
  • Forum-Beiträge: 84

19.03.2014, 22:14:12 via App

Ok.
Werde es versuchen.

Da hab ich noch viel zum lernen :O

Antworten
Patrick M.
  • Forum-Beiträge: 84

20.03.2014, 20:08:11 via Website

Ich hab jetzt den onClick hoffentlich richtig geschrieben.

1public void onClick(View muecke) {
2 if (muecke.getId() == R.id.pause) {
3 boolean paused = false; {
4 onPause(); {
5 return;
6 }
7 }
8 }

Nur bei onPause() komm ich nicht auf die sprünge
1@Override
2 protected void onPause() {
3 super.onPause();
4 if (Pause.getId()== R.id.pause){
5 boolean paused = true; {
6 zeitHerunterzaehlen(); // Wie soll ich dies sonst schreiben, damit die stoppen???
7 mueckenBewegen(); {
8 return;}
9 }}
10 }


impjor

***Edit***:
Ich glaube, du hast return falsch verstanden.
Eine Funktion in Java kann einen Wert zurück geben (int, boolean, ein Objekt (View, ...), ...) muss aber nicht.
Der return Befehl beendet die Funktion (der Rest wird nicht mehr ausgeführt). Gibt die Funktion einen Wert zurück, muss return mit diesem Wert aufgerufen werden.
(...)
return true;

Die Funktion gibt also true zurück.
Das hat jetzt aber gar nichts mit deinem Pause-Problem zu tun.

Das hat mich jetzt komplett verwirrt.
Was soll ich dann bei paused schreiben???
private int paused; ????
oder doch boolean?

Schluss endlich hast mich komplett herausgebracht!!

— geändert am 20.03.2014, 20:09:53

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.03.2014, 20:34:58 via App

Du brauchst eine Eigene Funktion stoppen und diese muss den timer etc. der in der zeit funktion aufgerufen wird, stoppen.
Nix mit return etc.
und die if ist immernoch unsinnig.
Wie sieht denn die zeit herunterzählen funktion aus?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

20.03.2014, 21:13:58 via App

Sorry Computer--->>>Internet hat was

1private static final long HOECHSTALTER_MS = 2000;

1private void zeitHerunterzaehlen() {
2 zeit = zeit -1;
3 float zufallszahl = zufallsgenerator.nextFloat();
4 double wahrscheinlichkeit = muecken * 1.5 / 60;
5 if(wahrscheinlichkeit > 1) {
6 eineMueckeAnzeigen();
7 if(zufallszahl < wahrscheinlichkeit-1) {
8 eineMueckeAnzeigen();
9 }
10 } else {
11 if(zufallszahl < wahrscheinlichkeit) {
12 eineMueckeAnzeigen();
13 }
14 }
15 mueckenVerschwinden();
16 bildschirmAktualisieren();
17 if(!pruefeSpielende()) {
18 if(!pruefeRundenende()) {
19 handler.postDelayed(this, 1000);
20 }
21 }
22 }

Meinst du damit, dass ich alles einzeln bei onPause() eingeben muss an statt zeitHerunterzaehlen()??
Also z.B.

zeit.pause oder zeit.stop



Ok, impjor hat mir mit if-else bei onClick mal überredet!!!

Pascal
Wie würde dann onClick bei dir aussehen, ohne if-else funktion??

— geändert am 20.03.2014, 21:15:25

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.03.2014, 13:06:11 via Website

Die Zeit herunterzählen Funktion müsstest du bei Pause eigentlich ganz weglasse, da das ja eigentlich der Knotenpunkt des Spielsist.


ich würde dein ganzes Konzept nochmal überdenken.
Ich versuche dir das Jetzt mal zu erklären:
Also du hast eine Klassenvariable, diese gibt an ob das Spiel Pausiert ist oder nicht.
1public boolean isPaused = false; //Standartmäßig läuft dein Spiel

Dann musst du Prüfen, in welchen Situationen das Spiel Pausiert ist oder Pausiert werden soll.
Dafür benutzen wir jetzt einen Button mit OnClick Event.
1public void onClick()
2{
3//OnClick Methode des Pause Buttons
4//Am einfachsten wir lagern den hier reingehörigen Code aus, damit wir ihn nicht mehrmals scheiben müssen
5//Statdessen benutzen wir eine Funktion
6pause();
7}

Nun benötigt diese Funktion pause auch eine Definition:
1public boolean pause()
2{
3//Hier kommt das Zeugs zum pausieren des Spiels rein
4//Da ich den kompletten Code des Spiels nicht habe, kann ich schlecht alles was da rein muss nachvollzieheh. Das musst du dann machen.
5isPaused= true; //Die am Anfang gesetzte Globale Variable auf true (gerade Pausiert) setzen
6
7//Dann könntest du noch nen Dialog mit Stats oder so oder einem Weiter Button reinmachen.
8//Nun gilt es, dass du verschiedene Dinge mit der Grafik macht und schaust, dass der Timer nicht weiterläuft.
9//Das kommt dann alles hier rein
10// Evntl noch das Speichern der aktuellen stände, falls man irgendwann weiterspielen will.}


Wenn das Spiel nun Beendet wird, wird die OnPause Funktion aufgerufen, in diese kommt dann so etwas:
1protected void onPause() {
2super.onPause();
3
4if(!isPaused) // Wenn das Spiel beendet wird ohne dass der Pause Button gedrückt wird,
5{
6pause(); //dann rufe die Standart Pausefunktion auf.
7}
8
9}}
10 }

In der Weiter Funktion genauso in der onResume() musst du dann die isPaused wieder auf false setzen, da das Spiel weiterlaufen soll.

Ich hoffe ich konnte dir ein Wenig helfen

LG
Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

21.03.2014, 13:24:27 via Website

Danke Pascal

Hast mir sehr geholfen

Das einzige was ich nicht wusste ist,
dass ich einen eigenen Knotenpunkt public boolean paused() brauche.
Daher ist mir das mit der Variable paused auch etwas spanisch vorgekommen

Danke nochmals, jetzt werd ichs wohl schaffen
LG

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.03.2014, 13:26:23 via Website

Gut, bei weiteren Fragen einfach nachfragen :)

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

21.03.2014, 13:32:09 via Website

Keine sorge

Dass werde ich machen :)

Danke nochmals

Antworten
Patrick M.
  • Forum-Beiträge: 84

21.03.2014, 23:16:15 via Website

Ich könnte gerade durchzucken

Wie ich auf dem Heimweg war, hab ichs verstanden. Jetzt ist wieder alles nur Bahnhof

1public boolean paused = false

1@Override
2 public void onClick(View muecke) {
3 if (muecke.getId() == R.id.pause) {
4 paused = true; {
5 onPause();
6 }
7 }
8 else if(muecke.getTag(R.id.tier) == FLIEGE) {
9 punkte -= 500 - schwierigkeitsgrad*50;
10 } else {
11 gefangeneMuecken++;
12 punkte += 100 + schwierigkeitsgrad*100;
13 }
14 bildschirmAktualisieren();
15 mp.pause();
16 Animation animationTreffer = AnimationUtils.loadAnimation(this, R.anim.treffer);
17 animationTreffer.setAnimationListener(new MueckeAnimationListener(muecke));
18 muecke.startAnimation(animationTreffer);
19 muecke.setOnClickListener(null);
20 }
21
22 private class MueckeAnimationListener implements AnimationListener {
23 private View muecke;
24 public MueckeAnimationListener(View m) {
25 muecke = m;
26 }
27 @Override
28 public void onAnimationEnd(Animation arg0) {
29 handler.post(new Runnable() {
30 @Override
31 public void run() {
32 spielbereich.removeView(muecke);
33 }
34 });
35 }
36 }
37 @Override
38 public void run() {
39 mueckenBewegen();
40 frame++;
41 if(frame >= 1000/INTERVALL_MS) {
42 zeitHerunterzaehlen();
43 frame = 0;
44 }
45 if(!pruefeSpielende()) {
46 if(!pruefeRundenende()) {
47 handler.postDelayed(this, INTERVALL_MS);
48 }
49 }
50 }
51 @Override
52 protected void onDestroy() {
53 mp.release();
54 super.onDestroy();
55 }
56 @Override
57 protected void onPause() {
58 super.onPause();
59 if (Pause.getId()== R.id.pause){
60 paused = true; {
61 paused();}
62 paused = false; {
63 onResume();}
64 }
65 }
66 public boolean paused() {
67 spielLaeuft = false;
68 return paused;
69 }
70
71 @Override
72 protected void onResume() {
73 super.onResume();
74 paused = false; {
75 spielLaeuft = true;
76 }
77 return;
78 }

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.03.2014, 23:46:29 via App

Erstmal musst du eine PauseFunktion schreiben die das spiel dann pausiert.
Wenn du diese hast, dann kommt erst das managen über button ind onPaused.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.03.2014, 12:26:36 via App

Kommt drauf an was du dir davon versprichst.
Das Buch oben im Link ist mehr als Nachschlagewerk gedacht.
Zum lernen aber nicht.
Du kannst dir ne Menge Tuts im inet durchlesen aber du brauchst halt dann die übung.

Aber wieso bekommst du das nicht hin.
So schwierig ist das doch nicht.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

30.03.2014, 13:09:10 via Website

Ok.
Aber zum lernen ist dann eher dieses Buch "Java ist mehr als eine Insel"

Ich hab keine Ahnung. Irgendwas ist immer
Entweder versteh ichs nicht oder i bin zu blöde

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.03.2014, 14:31:37 via Website

Dann fangen wir nochmal an.
Was ist denn deine Frage oder an welchem Punkt genau scheiterst du?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

30.03.2014, 15:07:18 via Website

Alles
Ich scheitere bei pausieren.

Ich hab jetzt alles nochmal zum alten umgeändert
Dust dir leichter beim mitzulesen

Das was nicht gebraucht wird, hab ich mal weggelassen

Ich weiß, es sieht sehr viel aus, ist aber eine täuschung
1package de.androidnewcomer.mueckenfang;
2
3import java.util.Date;
4import java.util.Random;
5
6import android.app.Activity;
7import android.content.Intent;
8import android.media.MediaPlayer;
9import android.os.Bundle;
10import android.os.Handler;
11import android.view.Gravity;
12import android.view.View;
13import android.view.View.OnClickListener;
14import android.view.ViewGroup;
15import android.view.ViewGroup.LayoutParams;
16import android.view.animation.Animation;
17import android.view.animation.Animation.AnimationListener;
18import android.view.animation.AnimationUtils;
19import android.widget.Button;
20import android.widget.FrameLayout;
21import android.widget.ImageView;
22import android.widget.TextView;
23
24public class GameActivity extends Activity implements OnClickListener, Runnable {
25
26 private static final long HOECHSTALTER_MS = 2000;
27 private int runde;
28 private int punkte;
29 private int muecken;
30 private int gefangeneMuecken;
31 private int zeit;
32 private float massstab;
33 private Random zufallsgenerator = new Random();
34 private ViewGroup spielbereich;
35 private Handler handler = new Handler();
36 private MediaPlayer mp;
37 private Random rnd = new Random();
38 private int schwierigkeitsgrad;
39 private static final String FLIEGE = "FLIEGE";
40 private Button pause;
41
42 @Override
43 protected void onCreate(Bundle savedInstanceState) {
44 super.onCreate(savedInstanceState);
45 setContentView(R.layout.game);
46 massstab = getResources().getDisplayMetrics().density;
47 spielbereich = (ViewGroup) findViewById(R.id.spielbereich);
48 mp = MediaPlayer.create(this, R.raw.summen);
49 schwierigkeitsgrad = getIntent().getIntExtra("schwierigkeitsgrad", 0);
50
51 pause = (Button) findViewById(R.id.schliessen);
52 pause.setOnClickListener(this);
53
54 spielStarten();
55 }
56
57 private void spielStarten() {
58 runde = 0;
59 punkte = 0;
60 starteRunde();
61 }
62
63 private void starteRunde() {
64 runde = runde +1;
65 muecken = runde *(10 + schwierigkeitsgrad *10);
66 gefangeneMuecken = 0;
67 zeit = 60;
68 bildschirmAktualisieren();
69 handler.postDelayed(this, 1000);
70 }
71
72 private void zeitHerunterzaehlen() {
73 zeit = zeit -1;
74 float zufallszahl = zufallsgenerator.nextFloat();
75 double wahrscheinlichkeit = muecken * 1.5 / 60;
76 if(wahrscheinlichkeit > 1) {
77 eineMueckeAnzeigen();
78 if(zufallszahl < wahrscheinlichkeit-1) {
79 eineMueckeAnzeigen();
80 }
81 } else {
82 if(zufallszahl < wahrscheinlichkeit) {
83 eineMueckeAnzeigen();
84 }
85 }
86 mueckenVerschwinden();
87 bildschirmAktualisieren();
88 if(!pruefeSpielende()) {
89 if(!pruefeRundenende()) {
90 handler.postDelayed(this, 1000);
91 }
92 }
93 }
94
95 private void mueckenVerschwinden() {
96 int nummer=0;
97 while(nummer < spielbereich.getChildCount()) {
98 ImageView muecke = (ImageView) spielbereich.getChildAt(nummer);
99 Date geburtsdatum = (Date) muecke.getTag(R.id.geburtsdatum);
100 long alter = (new Date()).getTime() - geburtsdatum.getTime();
101 if(alter > HOECHSTALTER_MS) {
102 spielbereich.removeView(muecke);
103 } else {
104 nummer++;
105 }
106 }
107 }
108
109 private boolean pruefeSpielende() {
110 if(zeit == 0 && gefangeneMuecken < muecken) {
111 gameOver();
112 return true;
113 }
114 return false;
115 }
116
117 private void gameOver() {
118 setResult(punkte);
119 startActivity( new Intent(this, GameOverActivity.class));
120 finish();
121 }
122
123 private boolean pruefeRundenende() {
124 if(gefangeneMuecken >= muecken) {
125 starteRunde();
126 return true;
127 }
128 return false;
129 }
130
131 @Override
132 public void onClick(View muecke) {
133 if (muecke.getId() ==R.id.pause) {
134
135 }

136 if else (muecke.getTag(R.id.tier) == FLIEGE) {
137 punkte -= 500 + schwierigkeitsgrad *100;
138 } else {
139 gefangeneMuecken++;
140 punkte += 100 + schwierigkeitsgrad*100;
141 }
142
143 bildschirmAktualisieren();
144 mp.pause();
145 Animation animationTreffer = AnimationUtils.loadAnimation(this, R.anim.treffer);
146 animationTreffer.setAnimationListener(new MueckeAnimationListener(muecke));
147 muecke.startAnimation(animationTreffer);
148 muecke.setOnClickListener(null);
149 }
150
151 private class MueckeAnimationListener implements AnimationListener {
152 private View muecke;
153 public MueckeAnimationListener(View m) {
154 muecke = m;
155 }
156 @Override
157 public void onAnimationEnd(Animation arg0) {
158 handler.post(new Runnable() {
159 @Override
160 public void run() {
161 spielbereich.removeView(muecke);
162 }
163 });
164 }
165
166 @Override
167 public void run() {
168 zeitHerunterzaehlen();
169 }
170
171 @Override
172 protected void onDestroy() {
173 mp.release();
174 super.onDestroy();
175 }
176
177 @Override
178 protected void onPause() {
179 super.onPause();
180 handler.removeCallbacks(this);
181 }
182}

Antworten
impjor
  • Forum-Beiträge: 1.793

30.03.2014, 19:37:21 via Website

Dir fehlt noch einiges:
  • es fehlt die Variable, ob das Spiel pausiert ist: boolean paused = false;
  • in deiner onClick() muss in das if (... = R.id.pause) der Variable gesetzt werden: paused = true;
  • in der onClick() wird die View vom Spielfeld entfernt. Bei einer Mücke ist das i.O., beim Pause-Knopf aber nicht
  • in deiner zeitHerunterzaehlen() musst du prüfen, ob paused gesetzt ist. Wenn paused gesetzt ist, rufst du nur handler.postDelayed(...); auf, sonst nicht. Wenn paused == false ist, dann alles was da bisher drin steht
  • in der onClick muss geprüft werden, ob das Spiel pausiert ist, damit man nicht in der Pause einfach alle Mücken antippen kann

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 19:18:58 via App

Ok. Nur das im zeitHerunterzaehlen versteh ich nicht ganz.
Wie soll ich das schreiben?

zeitHerunterzaehlen () {
.....
handler.postDelayed()
paused = true {
???? }

was ich hier reinschreiben muss, verstehe ich nicht

Antworten
impjor
  • Forum-Beiträge: 1.793

31.03.2014, 19:23:01 via Website

Was ist das bei dir für ein Konstrukt:

paused = true {
???
}

Das ist kein richtiges Java. Es muss so ungefähr aussehen:

if (paused) {
    wenn Spiel pausiert...
} else {
    wenn nicht pausiert...
}

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 19:39:43 via Website

ok, dass heißt, ich muss auch einen eigenen Knotenpunkt erstellen
Ja

private boolean paused() {
return true;
}

Und wenn ja, würde dann bei diesem Knotenpunkt handler.postDelayed() reinkommen oder garnichts

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 19:57:18 via Website

Ich weiß dass, ihr schön langsam die Hoffnung verliert, das ich das endlich mal verstehe

Aber was ist wenn ich 2 onClick() mache?
Es würde im Prinzip das gleiche rauskommen oder?

1private boolean onClick1(View paused) {
2 if (paused.getId()== R.id.pause) {
3 paused();
4 return true;
5 }
6 return false;
7 }
8
9
10 @Override
11 public void onClick(View muecke) {
12 if (muecke.getTag(R.id.tier) == FLIEGE) {
13 punkte -= 500 + schwierigkeitsgrad *100;
14 } else {
15 gefangeneMuecken++;
16 punkte += 100 + schwierigkeitsgrad*100;
17 }

Antworten
impjor
  • Forum-Beiträge: 1.793

31.03.2014, 20:01:03 via Website

Ich verstehe jetzt nicht, was das OnClick damit zu tun hat? Das war doch richtig.
Außerdem solltest du deine Java-Kenntnisse etwas auffrischen: Eine Funktion (du nennst es "Knotenpunkt") hat nichts mit einer Variable zu tun.
Deine paused()-Funktion liefert einfach immer true, was ja sinnlos ist. Eine Variable kann einen Wert speichern.

Sieh dir doch noch mal mein if an, so muss es aussehen.

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 20:10:36 via Website

OK.
Machen wir das jetzt alles nach der reihe nach, wenn du lust hast

Also onClick
1@Override
2 public void onClick(View muecke) {
3 if (muecke.getId()== R.id.pause) {
4 paused = true; {
5 zeitHerunterzaehlen();
6 }
7 } else {
8 paused = false;
9 }


Und bei zeitHerunterzaehlen
1private void zeitHerunterzaehlen() {
2 zeit = zeit -1;
3 float zufallszahl = zufallsgenerator.nextFloat();
4 double wahrscheinlichkeit = muecken * 1.5 / 60;
5 if(wahrscheinlichkeit > 1) {
6 eineMueckeAnzeigen();
7 if(zufallszahl < wahrscheinlichkeit-1) {
8 eineMueckeAnzeigen();
9 }
10 } else {
11 if(zufallszahl < wahrscheinlichkeit) {
12 eineMueckeAnzeigen();
13 }
14 }
15 mueckenVerschwinden();
16 bildschirmAktualisieren();
17 if(!pruefeSpielende()) {
18 if(!pruefeRundenende()) {
19 handler.postDelayed(this, 1000);
20 }
21 } if (!paused) {
22 handler.postDelayed(this, zeit);
23 }

24 }

Passt das mal soweit?

— geändert am 31.03.2014, 20:12:56

Antworten
impjor
  • Forum-Beiträge: 1.793

31.03.2014, 20:18:10 via Website

In der onClick():
Warum befindet sich nach paused = true; eine öffnende "{" in der onClick? Die ist nicht notwendig, sonst alles richtig.

In zeitHerunterzaehlen():
Nun werden immernoch Mücken erstellt usw. Änder das bitte wie folgt um:
public void zeitHerunterzaehlen() {
if (!paused) {
//Mücken erstellen etc.
handler.postDelayed(this, zeit);
}
}

So werden nur Mücken erstellt, wenn das Spiel nicht pausiert ist.

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 20:21:23 via Website

OK
Wurde gemacht
Und jetzt

****Edit****
Kann die Sources nicht öffnen!!!

03-31 20:25:02.098: D/AndroidRuntime(6821): Shutting down VM
03-31 20:25:02.098: W/dalvikvm(6821): threadid=1: thread exiting with uncaught exception (group=0x41000ac8)
03-31 20:25:05.041: E/AndroidRuntime(6821): FATAL EXCEPTION: main
03-31 20:25:05.041: E/AndroidRuntime(6821): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.androidnewcomer.mueckenfang/de.androidnewcomer.mueckenfang.GameActivity}: java.lang.NullPointerException
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2249)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.app.ActivityThread.access$700(ActivityThread.java:154)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.os.Handler.dispatchMessage(Handler.java:99)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.os.Looper.loop(Looper.java:137)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.app.ActivityThread.main(ActivityThread.java:5306)
03-31 20:25:05.041: E/AndroidRuntime(6821): at java.lang.reflect.Method.invokeNative(Native Method)
03-31 20:25:05.041: E/AndroidRuntime(6821): at java.lang.reflect.Method.invoke(Method.java:511)
03-31 20:25:05.041: E/AndroidRuntime(6821): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
03-31 20:25:05.041: E/AndroidRuntime(6821): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
03-31 20:25:05.041: E/AndroidRuntime(6821): at dalvik.system.NativeStart.main(Native Method)
03-31 20:25:05.041: E/AndroidRuntime(6821): Caused by: java.lang.NullPointerException
03-31 20:25:05.041: E/AndroidRuntime(6821): at de.androidnewcomer.mueckenfang.GameActivity.onCreate(GameActivity.java:53)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.app.Activity.performCreate(Activity.java:5255)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
03-31 20:25:05.041: E/AndroidRuntime(6821): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
03-31 20:25:05.041: E/AndroidRuntime(6821): ... 11 more

— geändert am 31.03.2014, 20:37:28

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.03.2014, 21:13:23 via App

Fehler in der Game Activity Zeile 53.

Also zur logik:
Gehen wir chonologisch vor.
Du hast deine Funktion Zeit herunterzählen diese ist das eigentliche spiel also die Logik und knotenpunkt.
Das post des Handlers ist der Timer der die Views bewegt etc.
Was würde passieren wenn dieses nicht mehr ausgeführt wird?
Das spiel wäre Pausiert.
So jetzt brauchst du ne Klassenvariable in der steht ob das Spiel pausiert ist oder nicht.
das ist die boolean paused.
Dann musst du diese in der zeit funktion abfragen und entsprechend reagieren.
Wenn das spiel nicht pausiert ist, muss der Handler aufgerufen werden bei pausiertem speil nicht.
Somt wäre es fast vollständig, jetzt brauchst du nur noch einen event der dir die paused Variable setzt.
Dafür hast du die onClick des Buttons.
Wenn du den btn für pause und start verwenden willst geht das auch.
Dazu dann die var. abfragen und dann genau das gegenteil schreiben
Wenn die paused jetzt also auf true steht also spiel pausiert dann musst du sie auf false setztn und andersrum.
Das mit der id etc. musst du weglassen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 21:16:45 via Website

Funktioniert wieder.

!Problem!
Ich kann das Spiel immer noch nicht pausieren und innerhalb von 2 sekunden ist das spiel zu ende!!!

Ähm, was tun???

Nochmal der Code
1@Override
2 public void onClick(View muecke) {
3 if(muecke.getTag(R.id.tier) == FLIEGE) {
4 punkte -= 500 + schwierigkeitsgrad *100;
5 } else {
6 gefangeneMuecken++;
7 punkte += 100 + schwierigkeitsgrad*100;
8 }
9 if (muecke.getId()== R.id.pause) {
10 paused = true;
11 zeitHerunterzaehlen();
12 }else {
13 paused = false;
14 }

15 bildschirmAktualisieren();
16 mp.pause();
17 Animation animationTreffer = AnimationUtils.loadAnimation(this, R.anim.treffer);
18 animationTreffer.setAnimationListener(new MueckeAnimationListener(muecke));
19 muecke.startAnimation(animationTreffer);
20 muecke.setOnClickListener(null);

Und bei zeitHerunterzaehlen läuft jetzt alles 6 fach so schnell.
Eine Spielrunde dauer 60sec

1public void zeitHerunterzaehlen() {
2 zeit = zeit -1;
3 float zufallszahl = zufallsgenerator.nextFloat();
4 double wahrscheinlichkeit = muecken * 1.5 / 60;
5 if(wahrscheinlichkeit > 1) {
6 eineMueckeAnzeigen();
7 if(zufallszahl < wahrscheinlichkeit-1) {
8 eineMueckeAnzeigen();
9 }
10 } else {
11 if(zufallszahl < wahrscheinlichkeit) {
12 eineMueckeAnzeigen();
13 }
14 }
15 mueckenVerschwinden();
16 bildschirmAktualisieren();
17 if(!pruefeSpielende()) {
18 if(!pruefeRundenende()) {
19 handler.postDelayed(this, 1000);
20 }
21 }
22 if (!paused) {
23 handler.postDelayed(this, 60000); // in 30sec spiel aus
24 }

25 }
Egal wo ich if (!paused) ...... hinpacke. Wenn ich statt die 60000millisec zeit hineinschreibe, ist es in 2sec spiel aus

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.03.2014, 21:24:25 via App

1. Was soll den das mit der id r.id.pause in der mücken view?
2.Die if musst du bei beiden post machen.
3.Wie wird die Pausevar jetzt gesetzt?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 21:41:10 via Website

Hi Pascal.

Wenn ich jetzt auf alle beide höre, kommt dann wahrscheinlich irgendwas heraus.

impjor

Ja, wie ich es gesehen habe, ist es am anfang
So

1public void zeitHerunterzaehlen() {
2 if (!paused) {
3 //Mücken erstellen etc.
4 handler.postDelayed(this, zeit);
5 }
6 zeit = zeit -1;
7 float zufallszahl = zufallsgenerator.nextFloat();
8 double wahrscheinlichkeit = muecken * 1.5 / 60;
9 if(wahrscheinlichkeit > 1) {
10 eineMueckeAnzeigen();
11 if(zufallszahl < wahrscheinlichkeit-1) {
12 eineMueckeAnzeigen();
13 }
14 } else {
15 if(zufallszahl < wahrscheinlichkeit) {
16 eineMueckeAnzeigen();
17 }
18 }
19 mueckenVerschwinden();
20 bildschirmAktualisieren();
21 if(!pruefeSpielende()) {
22 if(!pruefeRundenende()) {
23 handler.postDelayed(this, 1000);
24 }
25 }
26 }

Antworten
impjor
  • Forum-Beiträge: 1.793

31.03.2014, 21:45:22 via App

Deine Version im letzten Posting ist fast richtig: Nur muss all das, was unter dem if steht noch ins if hinein. Die Funktion soll ja nichts machen, wenn das Spiel pausiert wird.

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 21:57:28 via Website

Alles ins 1.if (!paused) hinein oder in einen extra if oder was wie jetzt???
Weil irgendwie will ich das heut fertig haben aber mein Bett ruft schon :bored:

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.03.2014, 21:59:47 via App

Von wollen ist nicht die rede entweder oder.
Kann auch ggf. noch zeit brauchen.
Du musst alles in eine if schreiben dodass wen es pausiert ist nix ausgeführt wird.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 22:03:16 via Website

Also so
Die klammer "{" hab ich mal fett gemacht

1public void zeitHerunterzaehlen() {
2 if (!paused){
3 handler.postDelayed(this, zeit);
4
5 zeit = zeit -1;
6 float zufallszahl = zufallsgenerator.nextFloat();
7 double wahrscheinlichkeit = muecken * 1.5 / 60;
8 if(wahrscheinlichkeit > 1) {
9 eineMueckeAnzeigen();
10 if(zufallszahl < wahrscheinlichkeit-1) {
11 eineMueckeAnzeigen();
12 }
13 } else {
14 if(zufallszahl < wahrscheinlichkeit) {
15 eineMueckeAnzeigen();
16 }
17 }
18 mueckenVerschwinden();
19 bildschirmAktualisieren();
20 if(!pruefeSpielende()) {
21 if(!pruefeRundenende()) {
22 handler.postDelayed(this, 1000);
23 }
24 } }
25 }

Antworten
Patrick M.
  • Forum-Beiträge: 84

31.03.2014, 22:15:38 via Website

OK
Danke euch. Ihr bekommt 2x GEFÄLLT MIR

Jetzt lässt sich das Spiel pausieren aber nicht mehr fortsetzen 8o

1public void onClick(View muecke) {
2 if (muecke.getTag(R.id.tier) == FLIEGE) {
3 punkte -= 500 + schwierigkeitsgrad *100;
4 } else {
5 gefangeneMuecken++;
6 punkte += 100 + schwierigkeitsgrad*100;
7 }
8 if (muecke.getId()== R.id.pause) {
9 paused = true;
10 zeitHerunterzaehlen();
11 }else {
12 paused = false;
13 }
14 bildschirmAktualisieren();
15 mp.pause();
16 Animation animationTreffer = AnimationUtils.loadAnimation(this, R.anim.treffer);
17 animationTreffer.setAnimationListener(new MueckeAnimationListener(muecke));
18 muecke.startAnimation(animationTreffer);
19 muecke.setOnClickListener(null);
20 }
Wer noch sehr nett, wenn ihr mir dies noch sagen würdet, warum dies nicht funktioniert.

PS: Gute Nacht

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.04.2014, 16:16:48 via Website

Nun warum wird das nicht gestartet?
Tipp: Im else Zweig fehlt ein Zeit herunterzaehlen.

LG Pascal //It's not a bug, it's a feature. :) ;)

impjor

Antworten
Patrick M.
  • Forum-Beiträge: 84

01.04.2014, 18:50:14 via Website

Das ist ein sehr guter Tipp. Danke Pascal
Jetzt funktioniert dies, nur ist neben bei ein anderes Problem aufgetreten und zwar:
Die Zeit lauft von 60sec auf 0sec.
Wenn ich aber auf die Mücke klicke, läuft die Zeit statt -1, -2!!!
Also genauer gesagt, je mehr Mücken ich klicke, desto schneller geht die Zeit.

Sobald ich den Pause-Button drücke wird es pausiert und wenn ich fortsetze läuft die Zeit normal und wenn ich wieder eine Mücke erwische, fangt das ganze darra wieder an.

Eins hab ich schon mal selbst herausgefunden, onClick umschreiben, aber wie???:unsure:

1public void onClick(View muecke) {
2 if (muecke.getTag(R.id.tier) == FLIEGE) {
3 punkte -= 500 + schwierigkeitsgrad *100;
4 } else {
5 gefangeneMuecken++;
6 punkte += 100 + schwierigkeitsgrad*100;
7 }
8 if (muecke.getId()== R.id.pause) {
9 paused = true;
10 zeitHerunterzaehlen();
11 }else {
12 paused = false;
13 zeitHerunterzaehlen();
14 }

Antworten
impjor
  • Forum-Beiträge: 1.793

01.04.2014, 22:07:31 via App

Das Problem ist, dass du abfragst, ob der Pause-Button gedrückt wurde, dann ...., **sonst zeitHerunterzaehlen aufrufen**. D.b. immer wenn du nicht den Pausebutton drückst, sondern eine Mücke dann wird zeitHerunterzaehlen aufgerufen. ZeitHerunterzaehlen ruft sich über den Handler aber immer wieder auf, sodass dein Szenario zustande kommt.
zeitHerunterzaehlen darf nur aufgerufen werden, wenn das Spiel bis gerade pausiert war.

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

01.04.2014, 22:42:47 via App

Was willst du mir jetzt damit sagen??
Willst mir sagen das bei der
onClick
....
muecke.getId......pause {
....
}else {.... false...zeitHerunterzählen() }
löschen soll

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.04.2014, 07:18:05 via App

Von der Logik her schon wenn du alles richtig maches willst wäre es sinvoll diese zu ändern

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
impjor
  • Forum-Beiträge: 1.793

02.04.2014, 14:12:01 via App

Patrick M.
Was willst du mir jetzt damit sagen??
Willst mir sagen das bei der
onClick
....
muecke.getId......pause {
....
}else {.... false...zeitHerunterzählen() }
löschen soll
Nein, das habe ich ja nicht geschrieben:
impjor

zeitHerunterzaehlen darf nur aufgerufen werden, wenn das Spiel bis gerade pausiert war.

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

02.04.2014, 15:24:01 via App

Also noch ein weiterer zweig
}else{ ?

— geändert am 04.04.2014, 15:24:10

Antworten
Patrick M.
  • Forum-Beiträge: 84

10.04.2014, 20:51:03 via App

Ok. Alles versucht. Sogar mit return!!

1public void onClick (View muecke) {if (muecke..... R.id.pause) {
2paused =true;
3zeitHerunterzaehlen();
4return;
5}

6
7if (muecke...Tag (R.id.tier) == FLIEGE) {
8.........} else{ .........}
9
10if (muecke.getId.... R.id.pause) {
11paused = false;
12zeitHerunterzaehlen();
13}

14}

Mir gehen die Ideen aus
Hilfe!!!!!
(Hab neben bei herausgefunden, was return noch alles bewirkt, was Ihr bestimmt schon wisst)

LG

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.04.2014, 21:11:23 via App

Du hast ja nicht viel geändert.
If muecke !=R.id.pause
dann zei herunterzählen sonst nicht.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Patrick M.
  • Forum-Beiträge: 84

10.04.2014, 21:23:08 via App

Ja. Ich hab auch switch versucht. Läuft aber nicht. Und sonst weiß ich nicht weiter. Bin ja jeden Tag dran. Nur das was ich mach. Kennt sich niemand aus.
Daher hab ich jetzt alles zurück gestellt und ja.

Antworten
impjor
  • Forum-Beiträge: 1.793

10.04.2014, 22:55:01 via App

Wenn du nicht weiterkommst, hilft es sich das Problem strukturierter aufzuzeichnen:
- Wenn View = Fliege und nicht pausiert
---- Pukte -= ...

-Wenn View != Fliege und View != Pause und nicht pausiert
---- gefangene Mücken++
---- punkte += ....

- Wenn View = Pause und nicht pausiert
---- paused = true

- Wenn View = Pause und pausiert
---- (Spiel wieder fortsetzen)
---- paused = false
---- zeitHerunterzaehlen()

Das sollte in mehreren ifs unterzubringen zu sein.

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

17.04.2014, 18:05:32 via Website

impjor

Wenn du nicht weiterkommst, hilft es sich das Problem strukturierter aufzuzeichnen: - Wenn View = Fliege und nicht pausiert ---- Pukte -= ...

-Wenn View != Fliege und View != Pause und nicht pausiert ---- gefangene Mücken++ ---- punkte += ....

  • Wenn View = Pause und nicht pausiert ---- paused = true

  • Wenn View = Pause und pausiert ---- (Spiel wieder fortsetzen) ---- paused = false ---- zeitHerunterzaehlen()

Das sollte in mehreren ifs unterzubringen zu sein.

Ich weiß was du meinst, aber trotzdem krieg ich das nicht hin. Egal ob ich developer.android schau oder Videotrainings.

Bringt mir nichts weiter!!!

if (muecke.getTag(R.id.tier) == FLIEGE) { punkte -= 500 + schwierigkeitsgrad *100; paused = false; } else { gefangeneMuecken++; punkte += 100 + schwierigkeitsgrad*100; paused = false; }if (muecke.getId()== R.id.pause) {
paused = true; } else {
paused = false; zeitHerunterzaehlen(); return; }

Antworten
impjor
  • Forum-Beiträge: 1.793

17.04.2014, 18:32:18 via App

Es muss so in etwa aussehen:
if ( View = Fliege && nicht pausiert) {
---- Pukte -= ...
} else if (View != Fliege && View != Pause und nicht pausiert) {
---- gefangene Mücken++
---- punkte += ....
} else if ( View = Pause und nicht pausiert) {
---- paused = true
} else if (View = Pause und pausiert) {
---- (Spiel wieder fortsetzen)
---- paused = false
---- zeitHerunterzaehlen()
}

— geändert am 17.04.2014, 18:33:33

Liebe Grüße impjor.

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

Antworten
Patrick M.
  • Forum-Beiträge: 84

17.04.2014, 19:10:22 via Website

Ja. Soweit hatte ich es auch schon vor ca. 1er Woche. Nur ohne diese else if

Es funktioniert jetzt nur so halbwegs Wenn ich auf Pause, lässt es sich zwar pausieren aber nicht mehr fortsetzen.

public void onClick(View muecke) {
     if (muecke.getTag(R.id.tier) == FLIEGE) {
        punkte -= 500 + schwierigkeitsgrad *100;
        paused = false;
    } else if (muecke.getTag(R.id.tier) == MUECKE ){
        gefangeneMuecken++;
        punkte += 100 + schwierigkeitsgrad*100;
        paused = false;
    }else if (muecke.getId()== R.id.pause) {            
        paused = true;
    }else if (muecke.getId()== R.id.pause){          
        paused = false;
        zeitHerunterzaehlen();
    }

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.04.2014, 20:49:51 via Website

else if (muecke.getId()== R.id.pause) {
paused = true; }else if (muecke.getId()== R.id.pause){
paused = false; zeitHerunterzaehlen(); }

Zweimal die gleiche if Bedingung mach doch keinen Sinn... in der Ersten zeit herunterzählen aufrufen die Zweite einfach löschen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten