Von einer Klasse in eine GameOver Klasse

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Von einer Klasse in eine GameOver Klasse

    Ich möchte im gameOver teil in eine klasse namens gameOver springen da ich hier aber View extende bin ich leider hilflos :(

    Quellcode

    1. package com.example.a223;
    2. import android.content.Context;
    3. import android.content.Intent;
    4. import android.graphics.Canvas;
    5. import android.graphics.Color;
    6. import android.graphics.Paint;
    7. import android.graphics.Typeface;
    8. import android.view.MotionEvent;
    9. import android.view.View;
    10. public class GameView extends View {
    11. /*
    12. Farbtabelle
    13. 0 = blau
    14. 1 = black
    15. 2 = red
    16. */
    17. //Maih
    18. MainActivity mainActivity = new MainActivity();
    19. //Ball
    20. private int blueX;
    21. private int blueY = -40;
    22. int blueSpeed = 15;
    23. private Paint bluePaint = new Paint();
    24. private int zufallzahl;
    25. //Game
    26. public boolean gameOver = false;
    27. private Paint gameOverPaint = new Paint();
    28. private int currColor = 0;
    29. public int currGameColor = 0;
    30. public int score = 0;
    31. private boolean touchflg = false;
    32. private boolean gamenotStart = true;
    33. private boolean starttap = false;
    34. private Paint untenviereckPaint = new Paint();
    35. Paint lvlUpPaint = new Paint();
    36. int currLvl =1;
    37. int currLvlUpScore = 10;
    38. //canvas
    39. int canvasWith;
    40. int canvasHigh;
    41. //Status Check
    42. //Score
    43. private Paint scorePaint = new Paint();
    44. public GameView(Context context) {
    45. super(context);
    46. scorePaint.setColor(Color.BLACK);
    47. scorePaint.setTextSize(55);
    48. scorePaint.setTypeface(Typeface.DEFAULT_BOLD);
    49. scorePaint.setAntiAlias(true);
    50. gameOverPaint.setColor(Color.BLACK);
    51. gameOverPaint.setTextSize(70);
    52. gameOverPaint.setTypeface(Typeface.DEFAULT_BOLD);
    53. gameOverPaint.setAntiAlias(true);
    54. lvlUpPaint.setColor(Color.LTGRAY);
    55. lvlUpPaint.setTextSize(60);
    56. lvlUpPaint.setTypeface(Typeface.SANS_SERIF);
    57. lvlUpPaint.setAntiAlias(true);
    58. //bluePaint.setColor(Color.BLUE);
    59. }
    60. @Override
    61. protected void onDraw(Canvas canvas) {
    62. canvasWith = getWidth();
    63. canvasHigh = getHeight();
    64. //Blue Ball
    65. if(touchflg){
    66. if(currGameColor == 0) untenviereckPaint.setColor(Color.BLUE);
    67. if(currGameColor == 1) untenviereckPaint.setColor(Color.BLACK);
    68. if(currGameColor == 2) untenviereckPaint.setColor(Color.RED);
    69. if(currGameColor ==3) untenviereckPaint.setColor(Color.GREEN);
    70. }
    71. if(gamenotStart){
    72. canvas.drawText("Tap Screen to start Game!",getWidth()/6,getHeight()/2 ,gameOverPaint);
    73. if(starttap){
    74. gamenotStart = false;
    75. }
    76. }
    77. //Game Over
    78. else if(gameOver){
    79. }else{
    80. blueX = canvasWith / 2;
    81. blueY +=blueSpeed;
    82. if(blueY > canvasHigh - 200 ) {
    83. if(score == currLvlUpScore){
    84. currLvl++;
    85. blueSpeed = blueSpeed+1;
    86. currLvlUpScore = currLvlUpScore+currLvlUpScore+currLvl;
    87. }
    88. blueY = -80;
    89. zufallzahl = (int) Math.floor(Math.random() * 4);
    90. if (currColor == currGameColor) {
    91. score++;
    92. } else {
    93. gameOver = true;
    94. }
    95. }
    96. }
    97. if(zufallzahl == 0){
    98. bluePaint.setColor(Color.BLUE);
    99. currColor = 0;
    100. }else if (zufallzahl == 1){
    101. bluePaint.setColor(Color.BLACK);
    102. currColor = 1;
    103. }else if(zufallzahl == 2){
    104. bluePaint.setColor(Color.RED);
    105. currColor = 2;
    106. }else if(zufallzahl == 3){
    107. bluePaint.setColor(Color.GREEN);
    108. currColor = 3;
    109. }
    110. canvas.drawRect(0,canvasHigh,canvasWith,canvasHigh - 200,untenviereckPaint);
    111. canvas.drawCircle(canvasWith/2,canvasHigh-60,50,untenviereckPaint);
    112. canvas.drawCircle(blueX, blueY,30,bluePaint);
    113. canvas.drawText("Score : " + score, 50,100,scorePaint);
    114. canvas.drawText("Level : " + currLvl , canvasWith-300,100,scorePaint);
    115. }
    116. @Override
    117. public boolean onTouchEvent(MotionEvent event) {
    118. if(event.getAction() == (MotionEvent.ACTION_DOWN)){
    119. if(gamenotStart) starttap = true;
    120. if(gameOver){
    121. score = 0;
    122. gameOver = false;
    123. return true;
    124. }
    125. currGameColor ++;
    126. if(currGameColor == 4) currGameColor =0;
    127. touchflg = true;
    128. }
    129. return true;
    130. }
    131. }
    Alles anzeigen
  • Hallo gehe ich richtig in der Anahme das du deine eigene „View“ neu zeichnen lassen willst, also die onDraw Methode aufrufen willst?

    Die solltest du nicht selber aufrufen dafür gibt es die „invalidate()“ Methode der View.
    Damit wird ein neu zeichnen der View vom System veranlasst.
    Um die onDraw Methode deiner Klasse aufzurufen hast du zb. gar nicht das „canvas“ zum übergeben somit wird das nie funktionieren.
    Also benutze „deineView.invalidate();“ zum neu Zeichnen.
    Ein Feedback auf Tipps ist auch schön. :P
  • Hallo habe mir deine Klasse noch mal angesehen ich denke du willst gleich in dieser Klasse deine Spielsteuerung machen. Finde ich zwar nicht so toll. Aber wenn du das willst musst du in deine Event Methode am ende mittels invalidate(); deine onDraw wieder aufrufen.

    Ps. solte meine hilfe dir nicht reichen erläre aber erstmal etwas genauer. Von wo nach wo willst du was Aufrufen wie hast du deine View eingebuten so ist Hilfe sehr Schwer.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Hallo erstmal danke für deine hilfe die ganze Klasse GameView wierd alle 10 millisekunden in der Main klasse aufgerufen also mittels invalidate(); sonst hätte ich da keine bewegung vom ball drin ich wollte jetzt einfach nur das wenn gameOver aufgerufen wierd allso wenn der ball nicht die farbe hat das dann ein neues Fenster aufgerufen wierd das ich dann z.b auch wieder individuell bearbeiten kann

    P.S Wie gesagt bin neu wie würdest du dass denn machen mit der Steuerung und dem View?
  • Am einfachsten für dich wird es wohl sein. Da du sowieso schon eine Zeitschleife hast und ständig die Klasse aufruft das du zwischendurch prüft ob deine gameover variable Gesetz ist. Und wenn ja beendest du deine Dauer Schleife.
    Das ganze ist sowie so kein schöner workaround. Da kommt es auf diesen Schönheits Fehler such nicht mehr an.

    An sonsten würde ich das mit Interface, callback, und listner machen.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Ok Danke.
    Ich wolte nur sicher gehen ob du es mit thread s gelöst hast. Und nicht den Main thread an hälst.
    Aber funktionrt denn das mit dem setContentView im thread?

    Auch wenn das so geht und du nach Game over wohl dein layout der activity wieder lädst. Solltest du den timer auch beenden.
    Besser wäre aber deine view in einer eigenen activity laufen zu lassen. Und nach gameover wider zu Main activity zu gehen. Beim nechsten Spiel Durchlauf startest du wider die Game activity.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Was soll ich da erklären. Das ist eigentliche Java und ist nicht undedingt android spezifisch.
    Stelle eine korrekte Frage dann kann ich es versuchen.
    Einen Wechsel der activity und somit auch Bildschirm Seite wird in Android mit einen Intent gemacht. Dem du auch Parameter mit übergeben kannst. Schaue die dazu mal Intent an. Anders als in Java ist das wenn du eine activity verlässt sie beendet wird. Und auch deine Variablen der activity sind Inder anderer nicht vorhanden und werd n gelöscht.
    Ein Feedback auf Tipps ist auch schön. :P
  • Habe mal eine andere Frage es kann sein das du das damit gemeint hast habe das jetzt mal ein bisschen weiter gemacht und jetzt stehe ich vor einem anderen problem das programm schmiert immer ab wenn ich die onClick aufrufe:(

    Java-Quellcode

    1. package com.example..a223;
    2. import android.graphics.Canvas;
    3. import android.graphics.Color;
    4. import android.graphics.Paint;
    5. import android.os.Handler;
    6. import android.support.v7.app.AppCompatActivity;
    7. import android.os.Bundle;
    8. import android.view.View;
    9. import android.widget.TextView;
    10. import java.util.Timer;
    11. import java.util.TimerTask;
    12. public class gameOver extends AppCompatActivity {
    13. GameView gameView;
    14. MainActivity mainActivity;
    15. TextView scoreView;
    16. private int score;
    17. @Override
    18. protected void onCreate(Bundle savedInstanceState) {
    19. super.onCreate(savedInstanceState);
    20. setContentView(R.layout.activity_game_over);
    21. gameView = new GameView(this);
    22. score = gameView.score;
    23. mainActivity = new MainActivity();
    24. }
    25. public void onClick(View v){
    26. mainActivity.gameSchleife();
    27. }
    28. }
    Alles anzeigen


    Quellcode

    1. public void gameSchleife(){
    2. setContentView(gameView);
    3. timer.schedule(new TimerTask() {
    4. @Override
    5. public void run() {
    6. handler.post(new Runnable() {
    7. @Override
    8. public void run() {
    9. gameView.invalidate();
    10. gameOver = gameView.gameOver;
    11. if (gameOver) {
    12. timer.cancel();
    13. setContentView(R.layout.activity_main);
    14. }
    15. }
    16. });
    17. }
    18. }, 0, TIMER_INTERVAL);
    19. }
    Alles anzeigen
  • Hallo

    Wenn du von einer Activity zu einer anderen willst sagte ich das dies mittels einem „Intent“ geht.

    Ich glaube du hast noch nicht verstanden was eine Activity ist.


    Eine Activity ist nicht nur eine Klasse sondern es ist quasi die Umgebung in der deine Bildschirm Seite läuft.
    Die kannst du nicht selber mittels einer Instanz und Kostrucktor aufrufen.

    Das siehst du doch schon daran das du für eine von Activity oder AppCompatActivity abgeleitete Klasse keine Konstruktor haben du dort auch keinen anlegen kannst .


    Die Kasse ist so zusagen dein Programm Anfang. Und wird vom System aufgerufen gestartet.
    (auch der Start deiner App erfolgt vom system selber mit einem Intent)


    Mit einen Intent teilst du dem System mit das du die aktuelle Activity verlassen möchtest und ein neue starten willst. Intest sind System Nachrichten. Es gibt es verschiedene arten von Intens.
    Du brauchst einen Expliziten Intent.

    Beim Verlassen der Activity wird aber auch der Speicher vor der Klasse wieder freigegeben, und deine Variablen sind somit lehr wenn du wieder zurück gehst . Denn es wird auch wieder die onCreate Methode aufgerufen. Du kannst dir eine Activity wie ein kleines eigenes Programm in deiner App vorstellen was immer wieder neu gestattet wird wenn du von einer Avtivity zu anderen gehst.
    Schaue dir auch mal den LifeCycle einer Activity an . Dann verstehst du es vielleicht besser.


    Starte deine Activity so.

    Quellcode

    1. Intent intent = new Intent(this , MainActivity.class);
    2. startActivity(intent);


    So nun einige Fragen zu deinem Code.


    Wie bist du überhaupt von deiner MainActivity in die „gameOver“ Klasse gekommen? Da du Intent nicht kennst denke ich das du es nicht so wie ich beschrieben habe gemacht hast.
    Nur als Tipp Klassennamen schreibt man Groß.


    In welcher Klasse ist eigentlich deine gameSchleife?


    Wieso macht du das "setContentView(gameView); " und was ist gameView ?

    Hier gehört eigentlich ein Layout rein und keine Instanz einer Klasse.



    Also eigentlich müsste das so aussehen.


    In jeder GameActivity hast du ein Layout in xml. In dem Layout erstellst du eine View von deiner eigenen View „GameView“ mit den üblichen Eigenschaften Höhe, Weite, ID ,….


    <dein_Package.GameView
    android:id="@+id/ganeView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>


    Dieses Layout wird wie üblich in die Activity mit setContentView geladen.

    So nun brauchst du die Instanz auf deine eigene View die hoslst du die wie üblich mit findViewById genau wie ZB. einer TextView.

    GameView mGameView = (GameView) findViewById(R.id.deineID);

    So nun hast eine Instanz und kannst auf deine Klasse zugreifen.

    Willst du nun in der Game Klasse etwas ändern oder abfragen macht man das über gett und Setter Methoden in der klasse um von der Activity mittels der eben ermittelten Instanz zuzugreifen. Oder wenn die Variablen Public sind auch direkt.

    Auch in der Klasse (Activity) ist deine Zeitschleife und der Rück Sprung zur Mainactivity .
    Den Start der GameActivit auch natürlich mit Intent . Willst du dem Intent noch etwas mitgeben geht das auch entweder über putExtra oder das Bundle. Das Extra musst du natürlich in der anderen Activity wieder aus dem Intent selber raushohlen. Denn wie ich schon am anfangs sagte sind Activitys abgeschlossenere Einheiten und wenn du eine verlassen hast kannst du nicht mehr auf Variablen der alten zugreifen. Deshalb die Übergabe mit putExtra. Schau dir das in der Doku an.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von jogimuc ()