I am having trouble stopping my GameScreen background music whenever I press the back button which takes me back to the MenuScreen. The music continues to play and the MenuScreen music begins to play so it sounds awful. Here is my MusicManager class.
每当我按下后退按钮将我带回MenuScreen时,我无法停止我的GameScreen背景音乐。音乐继续播放,MenuScreen音乐开始播放,听起来很糟糕。这是我的MusicManager课程。
public class MusicManager implements MediaPlayer.OnCompletionListener{
AudioManager amg;
private MediaPlayer mMediaPlayer;
private MediaPlayer mMediaPlayer1;
private String mAssetFile;
private boolean mIsPrepared = false;
private boolean mIsPrepared1 = false;
private ScreenManager mScreenManager;
public MusicManager(Game game, ScreenManager mScreenManager) {
super();
mScreenManager = new ScreenManager();
mMediaPlayer = new MediaPlayer();
mMediaPlayer1 = new MediaPlayer();
try{ AssetManager assetManager = game.getActivity().getAssets();
AssetFileDescriptor assetDescriptor = assetManager.openFd("Sounds/GameScreen1.wav");
AssetFileDescriptor assetDescriptor1 = assetManager.openFd(("Sounds/Game-Menu.ogg"));
//assetDescriptor = assets.openFd("clicksound");
mMediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(),
assetDescriptor.getStartOffset(),
assetDescriptor.getLength());
mMediaPlayer1.setDataSource(assetDescriptor1.getFileDescriptor(),
assetDescriptor1.getStartOffset(),
assetDescriptor1.getLength());
// Prep the audio for playback
mMediaPlayer.prepare();
mMediaPlayer1.prepare();
mIsPrepared = true;
mIsPrepared1 = true;
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer1.setOnCompletionListener(this);
} catch (IOException e) {
String errorTag = "Error:";
String errorMessage = "Music clip cannot be loaded.";
Log.w(errorTag, errorMessage);
}
}
public void play() {
if (mMediaPlayer.isPlaying())
return;
try {
synchronized (this) {
if (!mIsPrepared)
mMediaPlayer.prepare();
mMediaPlayer.start();
}
} catch (Exception e) {
String errorTag = "Error:";
String errorMessage = "Music clip1 cannot be played.";
Log.w(errorTag, errorMessage);
}
}
public void play1() {
if (mMediaPlayer1.isPlaying())
return;
try {
synchronized (this) {
if (!mIsPrepared1)
mMediaPlayer1.prepare();
mMediaPlayer1.start();
}
} catch (Exception e) {
String errorTag = "Error:";
String errorMessage = "Music clip cannot be played.";
Log.w(errorTag, errorMessage);
}
}
public void stop() {
mMediaPlayer.stop();
synchronized (this) {
mIsPrepared = false;
}
}
public void stop1() {
mMediaPlayer1.stop();
synchronized (this) {
mIsPrepared1 = false;
}
}
public void pause() {
if (mMediaPlayer.isPlaying())
mMediaPlayer.pause();
}
public void pause1() {
if (mMediaPlayer1.isPlaying())
mMediaPlayer1.pause();
}
/**
* Determine if the music clip will loop
*
* @param looping
* Boolean true to loop, false for play once.
*/
public void setLooping(boolean looping) {
mMediaPlayer.setLooping(looping);
}
public void setLooping1(boolean looping) {
mMediaPlayer1.setLooping(looping);
}
/**
* Set the playback volume
*
* @param volume
* Playback volume (0-1)
*/
public void setVolume(float volume) {
mMediaPlayer.setVolume(volume, volume);
}
public void setVolume1(float volume) {
mMediaPlayer1.setVolume(volume, volume);
}
/**
* Set the playback volume
*
* @param leftVolume
* Left channel playback volume (0-1)
* @param rightVolume
* Right channel playback volume (0-1)
*/
public void setVolume(float leftVolume, float rightVolume) {
mMediaPlayer.setVolume(leftVolume, rightVolume);
}
public boolean isPlaying() {
return mMediaPlayer.isPlaying();
}
public boolean isPlaying1() {
return mMediaPlayer1.isPlaying();
}
public boolean isLooping() {
return mMediaPlayer.isLooping();
}
public boolean isLooping1() {
return mMediaPlayer1.isLooping();
}
public void dispose() {
if(mScreenManager.getCurrentScreen().getName().equals("Menu Screen"))
if (mMediaPlayer.isPlaying())
mMediaPlayer.stop();
mMediaPlayer.release();
}
public void dispose1() {
if (mMediaPlayer1.isPlaying())
mMediaPlayer1.stop();
mMediaPlayer1.release();
}
@Override
public void onCompletion(MediaPlayer player) {
synchronized (this) {
mIsPrepared = false;
}
}
And here is the code where the sound is initialised and starts in the GameScreen class and also the onBackPressed function I am using to stop the music.
这里是声音初始化并在GameScreen类中启动的代码,以及我用来停止音乐的onBackPressed函数。
public CardDemoGameScreen(Game game) {
super("CardDemoGameScreen", game);
mSoundManager = new SoundManager(game);
mScreenManager = new ScreenManager();
mMusicManager = new MusicManager(game, mScreenManager);
...
...
public void update(ElapsedTime elapsedTime) {
//NOTE: elapsed time has time between frames AND time since program
started
mMusicManager.play();
mMusicManager.isPlaying();
mMusicManager.setLooping(true);
mMusicManager.isLooping();
mMusicManager.setVolume(0.1f);
...
...
@Override
public boolean onBackPressed() {
mMusicManager.dispose();
return true;
}
I have tried absolutely everything! I have tried using onKeyDown which doesn't work, I've tried starting the sound at the end MenuScreen class and stopping it there, which also doesnt work. Any help would be greatly appreciated
我绝对尝试过一切!我已经尝试使用onKeyDown,它不起作用,我尝试在最后的MenuScreen类中启动声音并在那里停止它,这也不起作用。任何帮助将不胜感激
EDIT GAMESCREEN CLASS
编辑GAMESCREEN CLASS
public class CardDemoGameScreen extends GameScreen {
private final float LEVEL_WIDTH = 1000.0f;
private final float LEVEL_HEIGHT = 1500.0f;
//value less than 1 means everything appears smaller, and vice versa
private float worldZoom;
GamePhase CurrentState = PHASE_DRAW;
private ScreenViewport mScreenViewport;
private LayerViewport mLayerViewport;
private Player mPlayer;
private Scribe mScribe;
private SubjectHelper mSubjectHelper;
//gameobject because it only needs a position and a bitmap
private GameObject mBackground;
private AssetStore assetManager = mGame.getAssetManager();
private GameEventHandler mGameEventHandler;
private Deck mDeck;
boolean newTurn = false;
boolean newPhase = false;
private SoundManager mSoundManager;
private MusicManager mMusicManager;
private ScreenManager mScreenManager;
public CardDemoGameScreen(Game game) {
super("CardDemoGameScreen", game);
mSoundManager = new SoundManager(game);
mScreenManager = new ScreenManager();
mMusicManager = new MusicManager(game, mScreenManager);
//mLayerViewport = new LayerViewport(240, 160, 480, 320);
//mScreenViewport = new ScreenViewport();
//GraphicsHelper.create3To2AspectRatioScreenViewport(game, mScreenViewport);
//the (0,0) puts it in the TOP left corner, then makes it the screen wide and the screen tall
mScreenViewport = new ScreenViewport(0, 0, game.getScreenWidth(), game.getScreenHeight());
mSubjectHelper = new SubjectHelper();
Card.setSubjectHelper(mSubjectHelper);
float shorterEdge = 480.0f; //TODO: make this a proper const
//so the layer viewport is the same aspect ratio as the screenviewport but a different size
if (mScreenViewport.width > mScreenViewport.height)
mLayerViewport = new LayerViewport(shorterEdge, shorterEdge * mScreenViewport.height / mScreenViewport.width, //this should automatically take care of any weird scaling but it somehow doesnt?
shorterEdge, shorterEdge * mScreenViewport.height / mScreenViewport.width);
else
mLayerViewport = new LayerViewport(shorterEdge * mScreenViewport.height / mScreenViewport.width, shorterEdge,
shorterEdge * mScreenViewport.height / mScreenViewport.width, shorterEdge);
worldZoom = 1.0f;
assetManager.loadAndAddBitmap("TrapCardTemplate", "img/trapcardtemplate.png");
assetManager.loadAndAddBitmap("UnimonTemplate", "img/monstertemplate.png");
assetManager.loadAndAddBitmap("ExpandedUnimonTemplate", "img/monstertemplateexpanded.png");
assetManager.loadAndAddBitmap("ExpandedTrapcardTemplate", "img/trapcardtemplateexpanded.png");
assetManager.loadAndAddBitmap("ExpandedSupportcardTemplate", "img/supportcardtemplateexpanded.png");
assetManager.loadAndAddBitmap("CharSheet", "img/charactersheettrans.png");
assetManager.loadAndAddBitmap("SupportCardTemplate", "img/supportcardtemplate.png");
assetManager.loadAndAddBitmap("Subject EEECS", "img/EEECS30.png");
assetManager.loadAndAddBitmap("Subject Civil", "img/civil30.png");
assetManager.loadAndAddBitmap("Subject Mech", "img/Mechanical30.png");
assetManager.loadAndAddBitmap("Subject Phil", "img/Philisophy30.png");
assetManager.loadAndAddBitmap("Subject Art", "img/art30.png");
assetManager.loadAndAddBitmap("Subject Engl", "img/english30.png");
assetManager.loadAndAddBitmap("Subject Phy", "img/physics30.png");
assetManager.loadAndAddBitmap("Subject Medic", "img/medicine30.png");
assetManager.loadAndAddBitmap("Subject Math", "img/math30.png");
assetManager.loadAndAddBitmap("Selected", "img/selected.png");
assetManager.loadAndAddBitmap("Background", "img/belfastmap.png");
assetManager.loadAndAddBitmap("DeckIcon", "img/DeckIcon.png");
TrapCard.setTemplate(assetManager.getBitmap("TrapCardTemplate"));
TrapCard.setExpandedTemplate(assetManager.getBitmap("ExpandedTrapcardTemplate"));
Unimon.setTemplate(assetManager.getBitmap("UnimonTemplate"));
Unimon.setExpandedTemplate(assetManager.getBitmap("ExpandedUnimonTemplate"));
SupportCard.setTemplate(assetManager.getBitmap("SupportCardTemplate"));
SupportCard.setExpandedTemplate(assetManager.getBitmap("ExpandedSupportcardTemplate"));
mGameEventHandler = new GameEventHandler();
mGameEventHandler.ResetFlags();
mPlayer = new Player(this, mGameEventHandler, game);
mPlayer.setSelectedBitmap(assetManager.getBitmap("Selected"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_EEECS, assetManager.getBitmap("Subject EEECS"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_CIVIL, assetManager.getBitmap("Subject Civil"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_MECH, assetManager.getBitmap("Subject Mech"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_ENGL, assetManager.getBitmap("Subject Engl"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_ART, assetManager.getBitmap("Subject Art"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_PHIL, assetManager.getBitmap("Subject Phil"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_MEDIC, assetManager.getBitmap("Subject Medic"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_PHY, assetManager.getBitmap("Subject Phy"));
mSubjectHelper.setSubjectGraphic(Subject.SUBJECT_MATH, assetManager.getBitmap("Subject Math"));
mScribe = new Scribe(assetManager.getBitmap("CharSheet"), 8, 16, 9, 15);
mBackground = new GameObject(LEVEL_WIDTH/2.0f, LEVEL_HEIGHT/2.0f, assetManager.getBitmap("Background"), this);
//All the set up for creating slots
assetManager.loadAndAddBitmap("TrapCardSlot", "img/TrapCardSlot.png");
assetManager.loadAndAddBitmap("BenchImage", "img/benchcardslot.png");
assetManager.loadAndAddBitmap("SupportCardSlot", "img/supportcardslot.png");
assetManager.loadAndAddBitmap("DeckImage","img/DeckIcon.png");
Bitmap TrapCardSlotImage = assetManager.getBitmap("TrapCardSlot");
Bitmap BenchImage = assetManager.getBitmap("BenchImage");
assetManager.loadAndAddBitmap("SupportCardSlot", "img/supportcardslot.png");
Bitmap SupportCardSlotImage = assetManager.getBitmap("SupportCardSlot");
Bitmap DeckImage = assetManager.getBitmap("DeckImage");
mPlayer.createSlots(TrapCardSlotImage, BenchImage, SupportCardSlotImage, DeckImage, LEVEL_WIDTH, LEVEL_HEIGHT);
//TODO: James - shouldn't this belong to player?
mDeck = new Deck(this, 10);
//TODO: this could be an addUnimon function to make things cleaner
mPlayer.getCards().add(new SupportCard("Supporty McSupportface", "Effect Description", Subject.SUBJECT_MATH, 3, 500, 400, assetManager.getBitmap("FirstImg"), this));
Move move1 = new Move("Attacky attack", "Attack confuses opponent programmer", 90, Subject.SUBJECT_MECH);
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
mPlayer.getCards().add(new Unimon("Unimon Name", 100, move1, move1, Subject.SUBJECT_EEECS, 1, 800, 400, assetManager.getBitmap("UnimonImage"), this));
}
public void update(ElapsedTime elapsedTime) {
//NOTE: elapsed time has time between frames AND time since program started
mMusicManager.play();
mMusicManager.isPlaying();
mMusicManager.setLooping(true);
mMusicManager.isLooping();
mMusicManager.setVolume(0.1f);
mPlayer.update(elapsedTime);
mPlayer.updateLayer(mLayerViewport, 0, LEVEL_WIDTH, 0, LEVEL_HEIGHT);
mPlayer.HandleTouch(mScreenViewport, mLayerViewport, worldZoom);
mPlayer.updateHandLayout(LEVEL_WIDTH, LEVEL_HEIGHT);
switch(CurrentState){
case PHASE_DRAW:
//pull a card from the deck and place it in the players hand
mPlayer.addCardToHand(mDeck.getTopCard());
CurrentState = PHASE_REINFORCEMENT;
newPhase = true;
break;
case PHASE_REINFORCEMENT:
if (mPlayer.getActiveSlot().getCardinSlot() == null) {
if (mPlayer.anyLevel1Cards()) {
mPlayer.setAllLevel1CardsSelectable();
} else {
//GAME OVER STUFF HERE
}
} else if(mGameEventHandler.GetFlag(GameEvent.EVENT_MONSTER_PLACED_ACTIVE)) {
mSoundManager.playSound(4, 0.2f);
if (mPlayer.isSelectedCardInHand(mPlayer.getActiveSlot().getCardinSlot())) {
mPlayer.removeCardFromHand(mPlayer.getActiveSlot().getCardinSlot());
mPlayer.setCardInActiveSlot(mPlayer.getActiveSlot().getCardinSlot());
CurrentState = PHASE_BATTLE;
mSoundManager.playSound(5, 0.4f);
newPhase = true;
}
} else {
CurrentState = PHASE_BATTLE;
mSoundManager.playSound(5, 0.4f);
newPhase = true;
}
break;
case PHASE_BATTLE:
//only active unimon is selectable
//state transition if a move is selected
mPlayer.getActiveSlot().getCardinSlot().setSelectable();
if (mGameEventHandler.GetFlag(GameEvent.EVENT_ATTACK)) {
CurrentState = PHASE_MAIN;
newPhase = true;
}
break;
case PHASE_MAIN:
//all player cards selectable, expandable
//and some forms of placement will advance the game states
mPlayer.setAllCardsSelectable();
if(mGameEventHandler.GetFlag(GameEvent.EVENT_MONSTER_PLACED)
|| mGameEventHandler.GetFlag(GameEvent.EVENT_SUPPORT_PLACED)
|| mGameEventHandler.GetFlag(GameEvent.EVENT_EVOLUTION)
|| mGameEventHandler.GetFlag(GameEvent.EVENT_TRAP_PLACED)) {
mSoundManager.playSound(4, 0.2f);
//this is where we would change gamephase
CurrentState = PHASE_DRAW;
newTurn = true;
newPhase = true;
}
break;
}
if (newPhase) {
mPlayer.setAllCardsNotSelectable();
mPlayer.setSelectedCard(null);
mPlayer.setExpandedCard(null);
newPhase = false;
}
if (newTurn) {
for (Card CardToUpdate : mPlayer.getCards()) {
if (CardToUpdate.getCardType() == CardType.SUPPORT) {
//decrement the moves
((SupportCard)CardToUpdate).DecrementTurnsActive();
}
}
newTurn = false;
}
mGameEventHandler.ResetFlags();
}
@Override
public boolean onBackPressed() {
mMusicManager.dispose();
return true;
}
public void draw(ElapsedTime elapsedTime, IGraphics2D graphics2D) {
//graphics2D.clear(Color.MAGENTA);
mBackground.drawZoomed(elapsedTime, worldZoom, graphics2D, mLayerViewport, mScreenViewport, null);
for (Slot SlotToDraw : mPlayer.getSlots()) {
SlotToDraw.drawZoomed(elapsedTime, worldZoom, mScribe, graphics2D, mLayerViewport, mScreenViewport);
}
for (Card cardToDraw : mPlayer.getCards()) {
cardToDraw.drawZoomed(elapsedTime, worldZoom, mScribe, graphics2D, mLayerViewport, mScreenViewport);
}
if (mPlayer.getSelectedCard() != null) {
mPlayer.drawSelectedCard(elapsedTime, worldZoom, graphics2D, mLayerViewport, mScreenViewport);
}
if (mPlayer.getExpandedCard() != null) {
mPlayer.drawExpandedCard(elapsedTime, worldZoom, mScribe, graphics2D, mLayerViewport, mScreenViewport);
}
//mScribe.drawParagraphWorldNarrow("the quick brown fox jumps over lazy dog", 100, 100, 60, worldZoom, mLayerViewport, mScreenViewport, graphics2D);
//mScribe.drawParagraphScreenNarrow("the quick brown fox jumps over lazy dog", 100, 100, 60, mScreenViewport.height, graphics2D);
switch(CurrentState){
case PHASE_DRAW:
mScribe.drawParagraphScreenNarrow("DRAW PHASE", mScreenViewport.right-100, 20, 100, graphics2D);
break;
case PHASE_REINFORCEMENT:
mScribe.drawParagraphScreenNarrow("REINFORCEMENT PHASE", mScreenViewport.right-100, 20, 100, graphics2D);
break;
case PHASE_BATTLE:
mScribe.drawParagraphScreenNarrow("BATTLE PHASE", mScreenViewport.right-100, 20, 100, graphics2D);
break;
case PHASE_MAIN:
mScribe.drawParagraphScreenNarrow("MAIN PHASE", mScreenViewport.right-100, 20, 100, graphics2D);
break;
}
}
public float getWorldZoom() { return worldZoom; }
/**
* Change WorldZoom
*
* @param newWorldZoom
* Float value. No zoom = 1.0f. To zoom in increase number
*/
public void setWorldZoom(float newWorldZoom) { worldZoom = newWorldZoom; }
public float getLEVEL_WIDTH() { return LEVEL_WIDTH; }
public float getLEVEL_HEIGHT() { return LEVEL_HEIGHT; }
public Player getPlayer() {return mPlayer; }
public AssetStore getAssetManager(){return assetManager; }
}
}
EDIT MENUSCREEN
编辑MENUSCREEN
private SoundManager mSoundManager;
private MusicManager mMusicManager;
public Boolean soundMuted = false;
private ScreenManager mScreenManager;
/**
* Create a simple menu screen
*
* @param game
* Game to which this screen belongs
*/
public MenuScreen(Game game) {
super("MenuScreen", game);
mScreenManager = new ScreenManager();
mMusicManager = new MusicManager(game, mScreenManager);
mSoundManager = new SoundManager(game);
...
@Override
public void update(ElapsedTime elapsedTime) {
// Process any touch events occurring since the update
Input input = mGame.getInput();
if(!soundMuted && !mMusicManager.isPlaying1()) {
mMusicManager.setLooping1(true);
mMusicManager.setVolume1(0.4f);
mMusicManager.play1();
mMusicManager.isPlaying1();
mMusicManager.isLooping1();
}
List<TouchEvent> touchEvents = input.getTouchEvents();
if (touchEvents.size() > 0) {
TouchEvent touchEvent = touchEvents.get(0);
if (touchEvent.type == TouchEvent.TOUCH_UP) {
if ((soundButtonBound.contains((int) touchEvent.x, (int) touchEvent.y))) {
soundMuted = !soundMuted; //invert value
}
if (mPlayButtonBound.contains((int) touchEvent.x, (int) touchEvent.y)) {
mSoundManager.playSound(2, 1);
mGame.getScreenManager().removeScreen(this.getName());
CardDemoGameScreen cardDemoGameScreen = new CardDemoGameScreen(mGame);
mGame.getScreenManager().addScreen(cardDemoGameScreen);
mMusicManager.pause1();
}
if (mInventoryButtonBound.contains((int) touchEvent.x, (int) touchEvent.y)) {
mSoundManager.playSound(2, 1);
mGame.getScreenManager().removeScreen(this.getName());
InventoryScreen inventoryScreen = new InventoryScreen(mGame);
mGame.getScreenManager().addScreen(inventoryScreen);
}
}
}
if (soundMuted) {
if (mMusicManager.isPlaying1())
mMusicManager.pause1();
}
if(mMusicManager.isPlaying()) {
mMusicManager.stop();
}
}
...
@Override
public boolean onBackPressed() {
mMusicManager.dispose();
return false;
}
}
EDIT CLASS WHERE GAMESCREEN IS DISCARDED
在GAMESCREEN被弃用的编辑类别
public class DemoGame extends Game {
/**
* Create a new demo game
*/
public DemoGame() {
super();
}
/*
* (non-Javadoc)
*
* @see uk.ac.qub.eeecs.gage.Game#onCreate(android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Go with a default 20 UPS/FPS
setTargetFramesPerSecond(20);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Call the Game's onCreateView to get the view to be returned.
View view = super.onCreateView(inflater, container, savedInstanceState);
// Create and add a stub game screen to the screen manager. We don't
// want to do this within the onCreate method as the menu screen
// will layout the buttons based on the size of the view.
MenuScreen stubMenuScreen = new MenuScreen(this);
mScreenManager.addScreen(stubMenuScreen);
return view;
}
@Override
public boolean onBackPressed() {
// If we are already at the menu screen then exit
if(mScreenManager.getCurrentScreen().getName().equals("MenuScreen"))
return false;
// Go back to the menu screen
getScreenManager().removeScreen(mScreenManager.getCurrentScreen().getName());
//MusicManager mMusicManager = new MusicManager(this, mScreenManager);
//mMusicManager.dispose();
MenuScreen menuScreen = new MenuScreen(this);
getScreenManager().addScreen(menuScreen);
return true;
}
}
}
GAMESCREEN CLASS
GAMESCREEN CLASS
public abstract class GameScreen {
// /////////////////////////////////////////////////////////////////////////
// Properties
// /////////////////////////////////////////////////////////////////////////
/**
* Name that is given to this game screen
*/
protected final String mName;
/**
* Return the name of this game screen
*
* @return Name of this game screen
*/
public String getName() {
return mName;
}
/**
* Game to which game screen belongs
*/
protected final Game mGame;
/**
* Return the game to which this game screen is attached
*
* @return Game to which screen is attached
*/
public Game getGame() {
return mGame;
}
// /////////////////////////////////////////////////////////////////////////
// Constructors
// /////////////////////////////////////////////////////////////////////////
/**
* Create a new game screen associated with the specified game instance
*
* @param game
* Game instance to which the game screen belongs
*/
public GameScreen(String name, Game game) {
mName = name;
mGame = game;
}
// /////////////////////////////////////////////////////////////////////////
// Update and Draw
// /////////////////////////////////////////////////////////////////////////
/**
* Update the game screen. Invoked automatically from the game.
*
* NOTE: If the update is multi-threaded control should not be returned from
* the update call until all update processes have completed.
*
* @param elapsedTime
* Elapsed time information for the frame
*/
public abstract void update(ElapsedTime elapsedTime);
public abstract boolean onBackPressed();
/**
* Draw the game screen. Invoked automatically from the game.
*
* @param elapsedTime
* Elapsed time information for the frame
* @param graphics2D
* Graphics instance used to draw the screen
*/
public abstract void draw(ElapsedTime elapsedTime, IGraphics2D graphics2D);
// /////////////////////////////////////////////////////////////////////////
// Android Life Cycle
// /////////////////////////////////////////////////////////////////////////
/**
* Invoked automatically by the game whenever the app is paused.
*/
public void pause() {
}
/**
* Invoked automatically by the game whenever the app is resumed.
*/
public void resume() {
}
/**
* Invoked automatically by the game whenever the app is disposed.
*/
public void dispose() {
}
}
}
MAINACTIVTY
MAINACTIVTY
public class MainActivity extends Activity {
/**
* Game fragment instance
*/
private Game mGame;
if (mGame == null) {
mGame = new DemoGame();
fm.beginTransaction().add(R.id.activity_fragment_id, mGame)
.commit();
}
}
/*
* (non-Javadoc)
* @see android.app.Activity#onBackPressed()
*/
@Override
public void onBackPressed() {
// If the fragment does not consume the back event then
// trigger the default behaviour
if(!mGame.onBackPressed())
super.onBackPressed();
}
}
}
1 个解决方案
#1
0
MenuScreen
not Menu Screen
, check your code and make sure you're calling from MenuScreen
.
菜单屏幕不是菜单屏幕,检查您的代码并确保从MenuScreen进行呼叫。
public void dispose() {
if(mScreenManager.getCurrentScreen().getName().equals("MenuScreen")) //check this line
if (mMediaPlayer.isPlaying())
mMediaPlayer.stop();
mMediaPlayer.release();
}
EDIT
编辑
This method is of DemoGame
class.
这个方法是DemoGame类。
@Override
public boolean onBackPressed() {
mScreenManager.getCurrentScreen().onBackPressed(); // Add this line here
if(mScreenManager.getCurrentScreen().getName().equals("MenuScreen"))
return false;
// Go back to the menu screen
getScreenManager().removeScreen(mScreenManager.getCurrentScreen().getName());
//MusicManager mMusicManager = new MusicManager(this, mScreenManager);
//mMusicManager.dispose();
MenuScreen menuScreen = new MenuScreen(this);
getScreenManager().addScreen(menuScreen);
return true;
}
#1
0
MenuScreen
not Menu Screen
, check your code and make sure you're calling from MenuScreen
.
菜单屏幕不是菜单屏幕,检查您的代码并确保从MenuScreen进行呼叫。
public void dispose() {
if(mScreenManager.getCurrentScreen().getName().equals("MenuScreen")) //check this line
if (mMediaPlayer.isPlaying())
mMediaPlayer.stop();
mMediaPlayer.release();
}
EDIT
编辑
This method is of DemoGame
class.
这个方法是DemoGame类。
@Override
public boolean onBackPressed() {
mScreenManager.getCurrentScreen().onBackPressed(); // Add this line here
if(mScreenManager.getCurrentScreen().getName().equals("MenuScreen"))
return false;
// Go back to the menu screen
getScreenManager().removeScreen(mScreenManager.getCurrentScreen().getName());
//MusicManager mMusicManager = new MusicManager(this, mScreenManager);
//mMusicManager.dispose();
MenuScreen menuScreen = new MenuScreen(this);
getScreenManager().addScreen(menuScreen);
return true;
}