2016-10-06 18 views
0

私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 && 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() && newGameCreated && 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 && !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()&&newGameCreated&& 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)); 

    } 

} 

答えて

0

あなたがしたいGamePanelのクラスで2つの変数(getCoin、getBest)のゲッター関数を作成します。

アクティビティクラスでは、作成時にGamePanelの参照を保存する必要があります。そうしないと、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();

で例えばコインにアクセス
関連する問題