Как передавать данные из surface view в его родительскую активность?

#java #android #android-studio-2.1

#java #Android #android-studio-2.1

Вопрос:

Это мой код в моем surfaceview, я хочу передать свою монету и лучшее в моей родительской активности

 package com.example.dazx15.sampleapplication;

import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
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 {
    public static final int WIDTH = 856;
    public static final int HEIGHT = 480;
    public static final int MOVESPEED = -5;
    private long smokeStartTime;
    private long powerupStartTime;
    private long missileStartTime;
    private long coinStartTime;
    private MainThread thread;
    private Background bg;
    private Player player;
    private ArrayList<PowerupShield>shield;
    private ArrayList<SmokePuff> smoke;
    private ArrayList<Missile> missiles;
    private ArrayList<Coins> coins;
    private ArrayList<TopBorder> topborder;
    private ArrayList<BotBorder> botborder;
    private static SharedPreferences prefs;
    private Random rand = new Random();
    private int maxBorderHeight;
    private int minBorderHeight;
    private boolean topDown = true;
    private boolean botDown = true;
    private boolean newGameCreated;


    //increase to slow down difficulty progression, decrease to speed up difficulty progression
    private int progressDenom = 20;

    private Explosion explosion;
    private long startReset;
    private boolean reset;
    private boolean dissapear;
    private boolean started;
    private int best=0;
    private int coin = 0;
    public String saveScore="best";
    public String saveCoin="coin";
    private SurfaceHolder holder;



    public GamePanel(Context context) {

        super(context);
        prefs=context.getSharedPreferences("com.example.dazx15.spaceevasion", context.MODE_PRIVATE);
        String spackage="com.example.dazx15.spaceevasion";
        coin=prefs.getInt(saveCoin, 0);

        best=prefs.getInt(saveScore, 0);


        //add the callback to the surfaceholder to intercept events
        getHolder().addCallback(this);


        //make gamePanel focusable so it can handle events
        setFocusable(true);
    }


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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {



        prefs.edit().putInt("saveScore", best).commit();
        prefs.edit().putInt("saveCoin",coin).commit();
        SampleActivity.mediaPlayer.stop();
        boolean retry = true;
        int counter = 0;
        while (retry amp;amp; counter < 1000) {
            counter  ;
            try {
                thread.setRunning(false);
                thread.join();
                retry = false;
                thread = null;

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

        }

    }


    @Override
    public void surfaceCreated(SurfaceHolder holder) {





        SampleActivity.mediaPlayer.setLooping(true);
        SampleActivity.mediaPlayer.start();
        bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.bg1));
        bg.setVector(-5);
        player = new Player(BitmapFactory.decodeResource(getResources(), R.drawable.playr), 100, 35, 3);
        smoke = new ArrayList<>();
        missiles = new ArrayList<>();
        coins = new ArrayList<>();
        shield=new ArrayList<>();
        topborder = new ArrayList<>();
        botborder = new ArrayList<>();
        smokeStartTime = System.nanoTime();
        missileStartTime = System.nanoTime();
        coinStartTime = System.nanoTime();
        powerupStartTime=System.nanoTime();

        thread = new MainThread(getHolder(), this);

        //safely start the game loop
        thread.setRunning(true);
        thread.start();

    }





    @Override
    public boolean onTouchEvent(MotionEvent event) {




        if (event.getAction() == MotionEvent.ACTION_DOWN) {

            if (!player.getPlaying() amp;amp; newGameCreated amp;amp; reset) {
                player.setPlaying(true);
                player.setUp(true);

                //sp.release();



            }
            if (player.getPlaying()) {

                if (!started) started = true;
                reset = false;
                player.setUp(true);

                //sp.release();

            }
            return true;

        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
            player.setUp(false);
            SampleActivity.mediaPlayer1.stop();
            return true;


        }

        return super.onTouchEvent(event);
    }


    public void update()

    {
        if (player.getPlaying()) {

            if (botborder.isEmpty()) {
                player.setPlaying(false);
                return;
            }
            if (topborder.isEmpty()) {
                player.setPlaying(false);
                return;

            }
            if (player.getScore() == 300) {
                bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.bg1));
                bg.setVector(-10);
            } else if (player.getScore() == 500) {
                bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.c));
                bg.setVector(-20);
            } else if (player.getScore() == 700) {
                bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.b));
                bg.setVector(-30);
            } else if (player.getScore() == 1000) {
                bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.c));
                bg.setVector(-40);
            } else if (player.getScore() == 1500) {
                bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.b));
                bg.setVector(-50);
            }


            bg.update();
            player.update();

            //calculate the threshold of height the border can have based on the score
            //max and min border heart are updated, and the border switched direction when either max or
            //min is met

            maxBorderHeight = 30   player.getScore() / progressDenom;
            //cap max border height so that borders can only take up a total of 1/2 the screen
            if (maxBorderHeight > HEIGHT / 4) maxBorderHeight = HEIGHT / 4;
            minBorderHeight = 5   player.getScore() / progressDenom;

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

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

            //update top border
            this.updateTopBorder();

            //update bottom border
            this.updateBottomBorder();
            //add shield on timer
            long shieldElapsed=(System.nanoTime()- powerupStartTime)/100000;
            if (shieldElapsed>(2000-player.getScore()/4))
            {
                //first shield always goes down the middle
                if(shield.size()==0)
                {
                    shield.add(new PowerupShield(BitmapFactory.decodeResource(getResources(), R.drawable.
                            shieldnathis), WIDTH   20, HEIGHT / 3, 59, 57, player.getScore(), 7));
                }
                else
                {

                    shield.add(new PowerupShield(BitmapFactory.decodeResource(getResources(), R.drawable.shieldnathis),
                            WIDTH   10, (int) (rand.nextDouble() * (HEIGHT - (maxBorderHeight * 2))   maxBorderHeight), 59, 57, player.getScore(), 7));
                }

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

                if(collision(shield.get(i),player))
                {

                    coin--;
                    shield.remove(i);
                    player.setPlaying(true);

                }
                //remove shield if it is way off the screen
                if(shield.get(i).getX()<-100)
                {
                    shield.remove(i);
                    break;
                }
            }

            //add coins on timer
            long coinElapsed = (System.nanoTime() - coinStartTime) / 1000000;
            if (coinElapsed > (2000 - player.getScore() / 4)) {
                // first coin goes up the middle
                if (coins.size() == 0) {
                    coins.add(new Coins(BitmapFactory.decodeResource(getResources(), R.drawable.coins), WIDTH 10, HEIGHT/2, 45, 19, player.getScore(), 10));
                    coins.add(new Coins(BitmapFactory.decodeResource(getResources(), R.drawable.coins), WIDTH 12, HEIGHT/4, 45, 19, player.getScore(), 10));
                    coins.add(new Coins(BitmapFactory.decodeResource(getResources(), R.drawable.coins), WIDTH 14, HEIGHT/4, 45, 19, player.getScore(), 10));
                    coins.add(new Coins(BitmapFactory.decodeResource(getResources(), R.drawable.coins), WIDTH 16, HEIGHT/4, 45, 19, player.getScore(), 10));
                } else {
                    coins.add(new Coins(BitmapFactory.decodeResource(getResources(), R.drawable.coins),
                            WIDTH   10, (int) (rand.nextDouble() * (HEIGHT - (maxBorderHeight * 2))   maxBorderHeight), 45, 19, player.getScore(), 10));
                    coins.add(new Coins(BitmapFactory.decodeResource(getResources(), R.drawable.coins),
                            WIDTH   12, (int) (rand.nextDouble() * (HEIGHT/2 - (maxBorderHeight * 2))   maxBorderHeight), 45, 19, player.getScore(), 10));
                    coins.add(new Coins(BitmapFactory.decodeResource(getResources(), R.drawable.coins),
                            WIDTH   14, (int) (rand.nextDouble() * (HEIGHT/2 - (maxBorderHeight * 2))   maxBorderHeight), 45, 19, player.getScore(), 10));
                    coins.add(new Coins(BitmapFactory.decodeResource(getResources(), R.drawable.coins),
                            WIDTH   16, (int) (rand.nextDouble() * (HEIGHT/2 - (maxBorderHeight * 2))   maxBorderHeight), 45, 19, player.getScore(), 10));
                }
                coinStartTime = System.nanoTime();
            }
            //loop through every missile and check collision and remove
            for (int i = 0; i < coins.size(); i  ) {
                //update missile
                coins.get(i).update();

                if (collision(coins.get(i), player)) {

                    coin  ;
                    coins.remove(i);
                    player.setPlaying(true);

                }
                //remove missile if it is way off the screen
                if (coins.get(i).getX() < -90) {
                    coins.remove(i);
                    break;
                }
            }

            //add missiles on timer
            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.
                     itona2),WIDTH   10, HEIGHT/2, 60, 66, player.getScore(), 6));
            }
              else
               {

                  missiles.add(new Missile(BitmapFactory.decodeResource(getResources(),R.drawable.itona2),
                          WIDTH 10, (int)(rand.nextDouble()*(HEIGHT - (maxBorderHeight * 2)) maxBorderHeight),60,66, player.getScore(),6));
               }

            //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;
               }
           }

        //add smoke puffs on timer
          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

    {
        player.resetDY();
        if (!reset) {
            newGameCreated = false;
            startReset = System.nanoTime();

            dissapear = true;

            explosion = new Explosion(BitmapFactory.decodeResource(getResources(), R.drawable.explosion), player.getX(),
                    player.getY() - 30, 100, 100, 25);
            reset = true;
        }

        explosion.update();

        long resetElapsed = (System.nanoTime() - startReset) / 1000000;
        if (resetElapsed > 2500 amp;amp; !newGameCreated) {
            bg = new Background(BitmapFactory.decodeResource(getResources(), R.drawable.bg2));
            bg.setVector(-5);
            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 scaleFactorX = getWidth()/(WIDTH*1.f);
        final float scaleFactorY = getHeight()/(HEIGHT*1.f);

        if(canvas!=null) {
            final int savedState = canvas.save();
            canvas.scale(scaleFactorX, scaleFactorY);
            bg.draw(canvas);
            if(!dissapear) {
                player.draw(canvas);
            }
            //draw smokepuffs
            for(SmokePuff sp: smoke)
            {
                sp.draw(canvas);
            }
            //draw missiles
            for(Missile m: missiles)
            {
                m.draw(canvas);
            }
            //draw coins
            for(Coins c: coins)
            {
                c.draw(canvas);
            }

            //draw topborder
            for(TopBorder tb: topborder)
            {
                tb.draw(canvas);
            }

            //draw botborder
            for(BotBorder bb: botborder)
            {
                bb.draw(canvas);
            }
            //draw explosion
            if(started)
            {
                explosion.draw(canvas);
            }
            drawText(canvas);
            canvas.restoreToCount(savedState);

        }
    }

    public void updateTopBorder()
    {
        //every 50 points, insert randomly placed top blocks that break the pattern
        if(player.getScore()%50 ==0)
        {
            topborder.add(new TopBorder(BitmapFactory.decodeResource(getResources(), R.drawable.border3
            ), topborder.get(topborder.size() - 1).getX()   20, 0, (int) ((rand.nextDouble() * (maxBorderHeight
            ))   1)));
        }
        for(int i = 0; i<topborder.size(); i  )
        {
            topborder.get(i).update();
            if(topborder.get(i).getX()<-20)
            {
                topborder.remove(i);
                //remove element of arraylist, replace it by adding a new one

                //calculate topdown which determines the direction the border is moving (up or down)
                if(topborder.get(topborder.size()-1).getHeight()>=maxBorderHeight)
                {
                    topDown = false;
                }
                if(topborder.get(topborder.size()-1).getHeight()<=minBorderHeight)
                {
                    topDown = true;
                }
                //new border added will have larger height
                if(topDown)
                {
                    topborder.add(new TopBorder(BitmapFactory.decodeResource(getResources(),
                            R.drawable.border3),topborder.get(topborder.size()-1).getX() 20,
                            0, topborder.get(topborder.size()-1).getHeight() 1));
                }
                //new border added wil have smaller height
                else
                {
                    topborder.add(new TopBorder(BitmapFactory.decodeResource(getResources(),
                            R.drawable.border3),topborder.get(topborder.size()-1).getX() 20,
                            0, topborder.get(topborder.size()-1).getHeight()-1));
                }

            }
        }

    }

    public void updateBottomBorder()
    {
        //every 40 points, insert randomly placed bottom blocks that break pattern
        if(player.getScore()%40 == 0)
        {
            botborder.add(new BotBorder(BitmapFactory.decodeResource(getResources(), R.drawable.border3),
                    botborder.get(botborder.size()-1).getX() 20,(int)((rand.nextDouble()
                    *maxBorderHeight) (HEIGHT-maxBorderHeight))));
        }

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

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


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

                if (botDown) {
                    botborder.add(new BotBorder(BitmapFactory.decodeResource(getResources(), R.drawable.border3
                    ), botborder.get(botborder.size() - 1).getX()   20, botborder.get(botborder.size() - 1
                    ).getY()   1));
                } else {
                    botborder.add(new BotBorder(BitmapFactory.decodeResource(getResources(), R.drawable.border3
                    ), botborder.get(botborder.size() - 1).getX()   20, botborder.get(botborder.size() - 1
                    ).getY() - 1));
                }
            }
        }
    }
    public void newGame()
    {
        dissapear = false;

        botborder.clear();
        topborder.clear();

        coins.clear();
        missiles.clear();
        smoke.clear();

        minBorderHeight = 5;
        maxBorderHeight = 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)
            {
                topborder.add(new TopBorder(BitmapFactory.decodeResource(getResources(),R.drawable.border3
                ),i*20,0, 10));
            }
            else
            {
                topborder.add(new TopBorder(BitmapFactory.decodeResource(getResources(),R.drawable.border3
                ),i*20,0, topborder.get(i-1).getHeight() 1));
            }
        }
        //initial bottom border
        for(int i = 0; i*20<WIDTH 40; i  )
        {
            //first border ever created
            if(i==0)
            {
                botborder.add(new BotBorder(BitmapFactory.decodeResource(getResources(),R.drawable.border3)
                        ,i*20,HEIGHT - minBorderHeight));
            }
            //adding borders until the initial screen is filed
            else
            {
                botborder.add(new BotBorder(BitmapFactory.decodeResource(getResources(), R.drawable.border3),
                        i * 20, botborder.get(i - 1).getY() - 1));
            }
        }

        newGameCreated = true;


    }
    public void drawText(Canvas canvas)
    {
        if(player.getScore()>best)
        {
            best = player.getScore();

        }


        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setTextSize(30);
        paint.setTypeface(Typeface.create(Typeface.MONOSPACE, Typeface.BOLD));
        canvas.drawText("DISTANCE: "   player.getScore()   "Km", 10, HEIGHT - 410, paint);
        canvas.drawText("BEST: "   best   "Km", WIDTH - 215, HEIGHT - 410, paint);
        canvas.drawText("Coin: "  coin, WIDTH-215, HEIGHT- 380, paint);


        if(!player.getPlaying()amp;amp;newGameCreatedamp;amp; reset) {
            Paint paint1 = new Paint();
            paint1.setColor(Color.BLUE);
            paint1.setTextSize(40);
            paint1.setTypeface(Typeface.create(Typeface.DEFAULT_BOLD, Typeface.BOLD));
            canvas.drawText("PRESS TO START", WIDTH/2, HEIGHT/2, paint1);

            paint1.setTextSize(20);
            canvas.drawText("PRESS AND HOLD TO GO UP", WIDTH/2-50, HEIGHT/2   20, paint1);
            canvas.drawText("RELEASE TO GO DOWN", WIDTH/2, HEIGHT/2   40, paint1);
        }
    }


}
  

Это моя родительская активность SampleActivity:

 package com.example.dazx15.sampleapplication;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;


public class SampleActivity extends Activity {

    public static MediaPlayer mediaPlayer,mediaPlayer1, mediaPlayer2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        mediaPlayer=MediaPlayer.create(this, R.raw.chain);
        mediaPlayer2=MediaPlayer.create(this, R.raw.explosion);
        mediaPlayer1=MediaPlayer.create(this, R.raw.jump);

        //turn title off
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        //set to full screen
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(new GamePanel(this));

    }

}
  

Ответ №1:

В классе GamePanel вы хотели бы создать функции получения для двух переменных (getCoin, getBest).

В классе Activity вы должны сохранить ссылку на GamePanel при ее создании, иначе вы потеряете к ней доступ.

Добавить в GamePanel:

 public int getBest(){
    return best; 
}

public int getCoin(){
    return coin; 
}
  

Ваш новый класс SampleActivity:

 package com.example.dazx15.sampleapplication;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;


public class SampleActivity extends Activity {

    public static MediaPlayer mediaPlayer,mediaPlayer1, mediaPlayer2;

    public GamePanel gamePanel; // variable to store reference to GamePanel

    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        mediaPlayer=MediaPlayer.create(this, R.raw.chain);
        mediaPlayer2=MediaPlayer.create(this, R.raw.explosion);
        mediaPlayer1=MediaPlayer.create(this, R.raw.jump);

        //turn title off
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        //set to full screen
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        gamePanel = new GamePanel(this);

        setContentView(gamePanel);
    }
}
  

И вы получаете доступ к монетам, например, с помощью gamePanel.getCoin();