#java #android-studio #android-mediaplayer #tic-tac-toe
Вопрос:
Я попытался написать код для игры в Тиктакто (тема мстителей)…когда игра будет закончена, будет воспроизведен соответствующий звук (3 разных звука в .mp3
формате и размере файлов < 100 Кб вместе взятых, а продолжительность составляет..Я пытался сделать это с помощью медиаплеера, и он работает только до 2 ходов, когда мы играем в игру непрерывно…и после этого он не воспроизводит соответствующий звук после окончания игры, и даже после того, как я продолжу играть после нескольких ходов, он воспроизводит все три звука одновременно, и приложение вылетает.
ПРИМЕЧАНИЕ: игра работает совершенно нормально, проблема только в звуке.
Инициализация: private MediaPlayer ironman, captain, draw;
Вызов mp3-файлов в public void click(View view)
качестве ironman = MediaPlayer.create(this, R.raw.i_am); captain = MediaPlayer.create(this, R.raw.do_this); draw = MediaPlayer.create(this, R.raw.giveup);
Я использовал .start()
в условиях выигрыша для воспроизведения звука и .pause()
остановки звука в public void playAgain (View view)
MainActivity.java полный код:
public class MainActivity<string> extends AppCompatActivity {
//to track the boxes (if value is 2 it is taken as empty box)
int[] position = {2, 2, 2, 2, 2, 2, 2, 2, 2};
//used to decide who's turn to play
int active;
//helps to stop the after a player is the winner
boolean activeGame = true;
//to display the winner text
String winner = "";
private MediaPlayer ironman, captain, draw;
public void click(View view) {
ironman = MediaPlayer.create(this, R.raw.i_am);
captain = MediaPlayer.create(this, R.raw.do_this);
draw = MediaPlayer.create(this, R.raw.giveup);
ImageView iv = (ImageView) view;
TextView turn = (TextView) findViewById(R.id.turn);
int tagPosition = Integer.parseInt(iv.getTag().toString());
//checks valid move or not and whether game is active or not
if(position[tagPosition] == 2 amp;amp; activeGame) {
//animation
iv.animate().alpha(1).setDuration(300);
// 0 : captain america, 1 : ironman , 2 : empty
//also flips the active value (change the current player)
if (active == 0) {
iv.setImageResource(R.drawable.captainamerica);
position[tagPosition] = active;
active =1;
turn.setText("Ironman's turn.");
}else {
iv.setImageResource(R.drawable.ironman);
position[tagPosition] = active;
active =0;
turn.setText("Captain america's turn.");
}
//checking whether game is over or not
//win condition for Captain america
if((position[0]==0 amp;amp; position[1]==0 amp;amp; position[2]==0) || (position[3]==0 amp;amp; position[4]==0 amp;amp; position[5]==0) || (position[6]==0 amp;amp; position[7]==0 amp;amp; position[8]==0) ||
(position[0]==0 amp;amp; position[3]==0 amp;amp; position[6]==0) || (position[1]==0 amp;amp; position[4]==0 amp;amp; position[7]==0) || (position[2]==0 amp;amp; position[5]==0 amp;amp; position[8]==0) ||
(position[0]==0 amp;amp; position[4]==0 amp;amp; position[8]==0) || (position[2]==0 amp;amp; position[4]==0 amp;amp; position[6]==0)){
captain.start();
turn.setVisibility(View.INVISIBLE);
activeGame = false;
winner = "Captain america won the game!!";
gameFinish(winner);
}
//win condition for Ironman
else if((position[0]==1 amp;amp; position[1]==1 amp;amp; position[2]==1) || (position[3]==1 amp;amp; position[4]==1 amp;amp; position[5]==1) || (position[6]==1 amp;amp; position[7]==1 amp;amp; position[8]==1) ||
(position[0]==1 amp;amp; position[3]==1 amp;amp; position[6]==1) || (position[1]==1 amp;amp; position[4]==1 amp;amp; position[7]==1) || (position[2]==1 amp;amp; position[5]==1 amp;amp; position[8]==1) ||
(position[0]==1 amp;amp; position[4]==1 amp;amp; position[8]==1) || (position[2]==1 amp;amp; position[4]==1 amp;amp; position[6]==1)){
ironman.start();
turn.setVisibility(View.INVISIBLE);
activeGame = false;
winner = "Ironman won the game!!";
gameFinish(winner);
}
//condition for draw match
else if(isTied() ){
draw.start();
turn.setVisibility(View.INVISIBLE);
winner = "Game is Draw, try again!!";
gameFinish(winner);
}
}
}
//logic for playAgain button
public void playAgain (View view) {
TextView tvResult = (TextView) findViewById(R.id.tvResult);
Button btnPlayAgain = (Button) findViewById(R.id.btnPlayAgain);
TextView name = (TextView) findViewById(R.id.name);
TextView turn = (TextView) findViewById(R.id.turn);
tvResult.setVisibility(View.INVISIBLE);
btnPlayAgain.setVisibility(View.INVISIBLE);
name.setVisibility(View.INVISIBLE);
turn.setVisibility(View.VISIBLE);
turn.setText("Select a grid to start the game.nIt's Captain america's turn.");
GridLayout gridLayout = (GridLayout) findViewById(R.id.gridLayout);
draw.pause();ironman.pause();captain.pause();
for (int i = 0; i < gridLayout.getChildCount(); i ) {
ImageView imageView = (ImageView) gridLayout.getChildAt(i);
imageView.animate().alpha(0).setDuration(300);
imageView.setImageDrawable(null);
}
for (int i = 0; i < position.length; i ) {
position[i] = 2;
}
active = 0;
activeGame = true;
}
//to print the winner and for displaying the text and playAgain btn
public void gameFinish(String winner){
TextView tvResult = (TextView) findViewById(R.id.tvResult);
Button btnPlayAgain = (Button) findViewById(R.id.btnPlayAgain);
TextView name = (TextView) findViewById(R.id.name);
tvResult.setVisibility(View.VISIBLE);
btnPlayAgain.setVisibility(View.VISIBLE);
name.setVisibility(View.VISIBLE);
tvResult.setText(winner);
}
//checks every value in position if there is 2 it indicates there are empty boxes
public boolean isTied(){
for(int i=0; i<position.length; i ){
if(position[i]==2){
return false;
}
}
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Ответ №1:
Вот моя функция воспроизведения звука.
//Your code..
private MediaPlayer soundPlayer;
private static final String TAG = "MUSIC ERROR";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
soundPlayer = MediaPlayer.create(this.context, R.raw.giveup);
}
//Your code
private void playSound(String soundID) {
try {
if (soundPlayer != null amp;amp; soundPlayer.isPlaying()) {
soundPlayer.pause();
}
soundPlayer = MediaPlayer.create(this,
getResources().getIdentifier(soundID, "raw", this.getPackageName())
);
soundPlayer.setVolume(100, 100);
soundPlayer.setLooping(false);
soundPlayer.start();
soundPlayer.setOnCompletionListener(mp -> {
mp.release();
soundPlayer = null;
});
}catch (Exception e) {
Log.d(TAG, "playSound: SOMETHING WENT WRONG");
soundPlayer.release();
soundPlayer = null;
}
}
Вызовите эту функцию с именем аудиофайла, в котором вы хотите воспроизвести аудиофайл. Нравится:
playSound("do_this");