#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();