- Forum-Beiträge: 71
25.01.2014, 10:53:33 via Website
25.01.2014 10:53:33 via Website
Hallo,
ich habe eigentlich gleich 2 Probleme:
und zwar entwickle ich gerade eine App, bei der man auf einem Boden laufen kann, und immer wieder unten als Boden Lava auftaucht, sprich ein Jump&Run, wo man über Lava auf dem Boden drüber springen muss.
Nun die 2 Probleme,
das erste: Ich habe das Runnable Interface implementiert, und die run-Methode ruft immer wieder eine Funktion zeitZaehlen() auf, welche die x-Position des Spielers bewegt, und die Punkte aktualisiert und die y-Position übernimmmt (wenn gesprungen wird). Jetzt habe ich folgendes Problem: sobald das Spiel startet, funktioniert alles wunderbar, man kann springen usw, allerdings anfangs nur vielleicht über ein viertel des Bildschirms, so wie auch eigentlich sein soll. Jetzt wird im Laufe des Spiels die Figur aber immer schneller (sprich eigentlich müsste das daran liegen, dass die Funktion zeitZaehlen immer schneller aufgerufen wird(warum auch immer)) und man kann nach geschätzten 20 Sekunden schon "über den ganzen Bildschirm springen". An was könnte das liegen? Hier noch Quelltext-Ausschnitte:
2
3 private int round;
4 private int points;
5
6 private Handler handler=new Handler();
2 {
3 round++;
4 bildschirmAktualisieren();
5 handler.postDelayed(this, 30);
6 }
7
8 private void bildschirmAktualisieren()
9 {
10 TextView tvround=(TextView)findViewById(R.id.round_view);
11 tvround.setText(Integer.toString(round));
12 TextView tvpoints=(TextView)findViewById(R.id.points_view);
13 tvpoints.setText(Integer.toString(points));
14 }
15
16 private void zeitzaehlen()
17 {
18 xPos=xPos+9;
19 yPos=Sprung.sprungposition;
20 points++;
21 pruefeRundenende();
22 pruefeSpielende();
23 bildschirmAktualisieren();
24 draw();
25 handler.postDelayed(this,30);
26 }
2 public void run()
3 {
4 zeitzaehlen();
5 }
Ich hoffe, ihr könnt mir hier vielleicht helfen.
Nun noch das zweite Problem, was eigentlich eher eine Frage ist, bzw, wobei ich eher eine Hilfestellung brauche.
Und zwar kann man zwar schon springen und alles, allerdings passiert noch 0 wenn man in die Lava schnurstracks reinläuft. Jetzt wollte ich euch fragen, wie ihr das möglichst effizient machen würdet. Das Programm bzw. Layout ist letztendlich so aufgebaut:
Ich habe 2*14 ImageViews, die immer aktualisiert werden, das heißt ich habe 14 ImageViews in der ersten Reihe nebeneinander, und dann drüber nochmal 14 ImageViews. Diese sind ganz am Anfang mit Steinen belegt, und dann kommt nach und nach Lava dazu. Dieses "dazukommen" der Lava habe ich so gelöst: durch die Methode zeitZaehlen werden immer die Punkte hochgezählt und ich sage nun einfach in meiner Draw-Methode, dass wenn zum Beispiel 90 Punkte oder 180 Punkte erreicht sind, dass dann z.B ImageView 5 oder ImageView 18 oder welche auch immer Lava anzeigen soll, Beispiel:
2 {
3 case 90:
4 xPos=-42;
5 bild19.setImageDrawable(getResources().getDrawable(R.drawable.volcano_lava_big));
6 bild20.setImageDrawable(getResources().getDrawable(R.drawable.volcano_lava_big));
7 bild21.setImageDrawable(getResources().getDrawable(R.drawable.volcano_lava_big));
8 break;
9
10 case 180:
11 xPos=-42;
12 bild19.setImageDrawable(getResources().getDrawable(R.drawable.volcano_stone_big));
13 bild20.setImageDrawable(getResources().getDrawable(R.drawable.volcano_lava_big));
14 bild21.setImageDrawable(getResources().getDrawable(R.drawable.volcano_lava_big));
15 bild23.setImageDrawable(getResources().getDrawable(R.drawable.volcano_stone_big));
16 bild24.setImageDrawable(getResources().getDrawable(R.drawable.volcano_stone_big));
17 bild25.setImageDrawable(getResources().getDrawable(R.drawable.volcano_stone_big));
18 bild26.setImageDrawable(getResources().getDrawable(R.drawable.volcano_stone_big));
19 break;
Nun will ich eben eine Funktion machen, die das Spielende überprüft. Jetzt ist das Problem, dass die Lava ja immer an einer anderen Stelle ist, habt ihr da eine Idee wie ich das abprüfen kann? Klar wäre es möglich dann in der pruefeSpielende()-Funktion zu schauen, wie viele Punkte erreicht sind, und dann über die Draw-Methode schauen, wo gerade die Lava ist, dann irgendwie die x-Positionen der Lava herausfinden, und wenn an der x-Position der Lava die y-Position der Spielfigur noch gleich ist, wie auf dem Boden, dann den Game-Over-Screen anzeigen. Allerdings wäre das viel zu viel Arbeit, nicht nur für mich zum schreiben, sondern selbst mein Handy würde dann wahrscheinlich schon extrem belastet werden, denn es würde schließlich immer erst jedesmal die Punkte abgeprüft und was weiß ich was noch alles. Also fällt die Möglichkeit aus.
Also habt ihr da vielleicht eine Idee, wie ich das am geschicktesten lösen kann? Also im Prinzip, dass man sobald man die Lava berührt, bzw versucht "darüberzulaufen" der Game-Over-Screen erscheint?
Bei Fragen gerne fragen, ist mein erster Beitrag, hoffe alles ist ok.
Wenn ihr sonst noch Tipps habt, könnt ihr sie auch gerne loswerden.
Schon mal im Vorhinein vielen vielen Dank für die Antworten.
Lg
Florian
Ps: das ganze sieht dann so aus (ohne Lava)
Jeder von diesen Steinen ist also eine einzelne ImageView.
— geändert am 28.01.2014, 12:47:09