游戏循环结束后退出到其他活动?

时间:2018-04-04 10:15:39

标签: android

我希望我的游戏退出并在用户发生碰撞时转到单独的Activity。例如,我希望它回到我的主菜单。我尝试添加Button,新意图方法等,但这些都不起作用。我无法在任何地方找到答案,而且在我学习的过程中,我知之甚少。我已经在互联网上搜索过但没有任何帮助。任何建议都会很棒。我的想法是改变newgame()方法退出游戏?

import android.content.Context;

import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.ArrayList;
import java.util.Random;

public class GamePanel extends SurfaceView implements SurfaceHolder.Callback {

private Threading threading;
private BackgroundImage bg;
public static final int WIDTH = 856;
public static final int HEIGHT = 480;
public static final int MovementSpeed = -8;
private Player player;
private ArrayList<BorderTop> borderTop;
private ArrayList<BorderBottom> borderBottom;
private ArrayList<Smokepuff> smoke;
private ArrayList<Missile> missiles;
private int MaximumBorderHeight;
private int MinimumBorderHeight;
private boolean topDown = true;
private boolean botDown = true;
private int progressDifficulty = 20;
private Random rand = new Random();
private boolean newGameCreated;
private long smokeStartTime;
private long missileStartTime;



public GamePanel(Context context) {
    super(context);

    getHolder().addCallback(this);


    setFocusable(true);
}


@Override
public void surfaceCreated(SurfaceHolder holder) {

    bg = new BackgroundImage(BitmapFactory.decodeResource(getResources(), R.drawable.grassbg1));
    player = new Player(BitmapFactory.decodeResource(getResources(), R.drawable.smallcatfinal), 40, 44, 1);
    borderTop = new ArrayList<BorderTop>();
    borderBottom = new ArrayList<BorderBottom>();
    smoke = new ArrayList<Smokepuff>();
    missiles = new ArrayList<Missile>();
    smokeStartTime=  System.nanoTime();
    missileStartTime = System.nanoTime();

    threading = new Threading(getHolder(), this);
    threading.setRunning(true);
    threading.start();



}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

    boolean retry = true;
    int counter = 0;
    while (retry && counter < 1000) {
        counter++;
        try {
            threading.setRunning(false);
            threading.join();
            retry = false;
            threading = null;


        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    }



@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (!player.getPlaying()) {
            player.setPlaying(true);
            player.setUp(true);
        }else{
            player.setUp(true);
        }
        return true;
    }
    if (event.getAction() == MotionEvent.ACTION_UP) {
        player.setUp(false);
        return true;
    }


    return super.onTouchEvent(event);
}

public void update() {
    if (player.getPlaying()) {
        bg.update();
        player.update();


        MaximumBorderHeight = 30 + player.getScore() / progressDifficulty;

        if (MaximumBorderHeight > HEIGHT / 4) MaximumBorderHeight = HEIGHT / 4;
        MinimumBorderHeight = 5 + player.getScore() / progressDifficulty;


        //check bottom border collision
        for (int i = 0; i < borderBottom.size(); i++) {
            if (collision(borderBottom.get(i), player))
                player.setPlaying(false);

        }

        //check top border collision
        for (int i = 0; i < borderTop.size(); i++) {
            if (collision(borderTop.get(i), player))
                player.setPlaying(false);

        }

        this.updateTop();
        this.updateBottom();

        long missileElapsed = (System.nanoTime() - missileStartTime) / 1000000;
        if (missileElapsed > (2000 - player.getScore() / 4)) {


            //first missile always goes down the middle
            if (missiles.size() == 0) {
                missiles.add(new Missile(BitmapFactory.decodeResource(getResources(), R.drawable.
                        missile), WIDTH + 10, HEIGHT / 2, 45, 15, player.getScore(), 13));
            } else {

                missiles.add(new Missile(BitmapFactory.decodeResource(getResources(), R.drawable.missile),
                        WIDTH + 10, (int) (rand.nextDouble() * (HEIGHT - (MaximumBorderHeight * 2)) + MaximumBorderHeight), 45, 15, player.getScore(), 13));
            }

            //reset timer
            missileStartTime = System.nanoTime();
        }
        //loop through every missile and check collision and remove
        for (int i = 0; i < missiles.size(); i++) {
            //update missile
            missiles.get(i).update();

            if (collision(missiles.get(i), player)) {
                missiles.remove(i);
                player.setPlaying(false);
                break;
            }
            //remove missile if it is way off the screen
            if (missiles.get(i).getX() < -100) {
                missiles.remove(i);
                break;
            }
        }


        long elapsed = (System.nanoTime() - smokeStartTime) / 1000000;
        if (elapsed > 120) {
            smoke.add(new Smokepuff(player.getX(), player.getY() + 10));
            smokeStartTime = System.nanoTime();
        }

        for (int i = 0; i < smoke.size(); i++) {
            smoke.get(i).update();
            if (smoke.get(i).getX() < -10) {
                smoke.remove(i);
            }
        }
    } else {


        newGameCreated = false;
        if (!newGameCreated) {
            newGame();
        }
    }

    public boolean collision (GameObject a, GameObject b)
    {
        if (Rect.intersects(a.getRectangle(), b.getRectangle())) {
            return true;
        }
        return false;
    }

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
    final float ScaleX = (float) getWidth() / WIDTH*1.f;
    final float ScaleY = (float) getHeight() / HEIGHT*1.f;
    if (canvas != null) {
        final int savedState = canvas.save();
        canvas.scale(ScaleX, ScaleY);
        bg.draw(canvas);
        player.draw(canvas);
        for(Smokepuff sp: smoke)
        {
            sp.draw(canvas);
        }
        //draw missiles
        for(Missile m: missiles)
        {
            m.draw(canvas);
        }

        for(BorderTop bt: borderTop)
        {
            bt.draw(canvas);
        }
        for(BorderBottom bb: borderBottom)
        {
            bb.draw(canvas);
        }

        canvas.restoreToCount(savedState);
    }
}


public void updateBottom() {

  if (player.getScore() % 40 == 0) {
        borderBottom.add(new BorderBottom(BitmapFactory.decodeResource(getResources(), R.drawable.brick),
             borderBottom.get(borderBottom.size() - 1).getX() + 20, (int) ((rand.nextDouble()
               * MaximumBorderHeight) + (HEIGHT - MaximumBorderHeight))));
   }

    //update bottom border
    for (int i = 0; i < borderBottom.size(); i++) {
        borderBottom.get(i).update();

        //if border is moving off screen, remove it and add a corresponding new one
        if (borderBottom.get(i).getX() < -20) {
            borderBottom.remove(i);


            //determine if border will be moving up or down
            if (borderBottom.get(borderBottom.size() - 1).getY() <= HEIGHT - MaximumBorderHeight) {
                botDown = true;
            }
            if (borderBottom.get(borderBottom.size() - 1).getY() >= HEIGHT - MinimumBorderHeight) {
                botDown = false;
            }

            if (botDown) {
                borderBottom.add(new BorderBottom(BitmapFactory.decodeResource(getResources(),R.drawable.brick
                ), borderBottom.get(borderBottom.size() - 1).getX() + 20, borderBottom.get(borderBottom.size() - 1
                ).getY() + 1));
            } else {
                borderBottom.add(new BorderBottom(BitmapFactory.decodeResource(getResources(), R.drawable.brick
                ), borderBottom.get(borderBottom.size() - 1).getX() + 20, borderBottom.get(borderBottom.size() - 1
                ).getY() - 1));
            }


        }
    }
}


    public void updateTop()
    {
       if (player.getScore() % 50 == 0) {
          borderTop.add(new BorderTop(BitmapFactory.decodeResource(getResources(), R.drawable.brick), borderTop.get(borderTop.size() - 1).getX() + 20, 0, (int) ((rand.nextDouble() * (MaximumBorderHeight)) + 1)));
       }
        for (int i = 0; i < borderTop.size(); i++) {
            borderTop.get(i).update();
            if (borderTop.get(i).getX() < -20) {
                borderTop.remove(i);


                if (borderTop.get(borderTop.size() - 1).getHeight() >= MaximumBorderHeight) {
                    topDown = false;
                }
                if (borderTop.get(borderTop.size() - 1).getHeight() <= MinimumBorderHeight) {
                    topDown = true;

                }
                if (topDown) {
                    borderTop.add(new BorderTop(BitmapFactory.decodeResource(getResources(), R.drawable.brick), borderTop.get(borderTop.size() - 1).getX() + 20, 0, borderTop.get(borderTop.size() - 1).getHeight() + 1));
                } else {
                    borderTop.add(new BorderTop(BitmapFactory.decodeResource(getResources(), R.drawable.brick), borderTop.get(borderTop.size() - 1).getX() + 20, 0, borderTop.get(borderTop.size() - 1).getHeight() - 1));
                }
            }
        }


    }
public void newGame() {

    borderBottom.clear();
     borderTop.clear();
     missiles.clear();
    smoke.clear();


      MinimumBorderHeight = 5;
     MaximumBorderHeight = 30;

     player.resetDY();
    player.resetScore();
    player.setY(HEIGHT/2);

    //create initial borders

    //initial top border
     for(int i = 0; i*20<WIDTH+40;i++)
    {
   // first top border create
    if(i==0)
      {borderTop.add(new BorderTop(BitmapFactory.decodeResource(getResources(),R.drawable.brick
         ),i*20,0, 10));
     }
       else
       {
         borderTop.add(new BorderTop(BitmapFactory.decodeResource(getResources(),R.drawable.brick
         ),i*20,0, borderTop.get(i-1).getHeight()+1));
      }
     }
      //initial bottom border
      for(int i = 0; i*20<WIDTH+40; i++)
       {
          //first border ever created
        if(i==0)
        {
          borderBottom.add(new BorderBottom(BitmapFactory.decodeResource(getResources(),R.drawable.brick)
     ,i*20,HEIGHT - MinimumBorderHeight));
      }
    //adding borders until the initial screen is filed
      else
      {
          borderBottom.add(new BorderBottom(BitmapFactory.decodeResource(getResources(), R.drawable.brick),
     i * 20, borderBottom.get(i - 1).getY() - 1));
      }
     }

    newGameCreated = true;
    }
}

0 个答案:

没有答案