Android双人问答游戏回合管理问题:次玩家连接后页面关闭
双人问答游戏Firebase协作问题求助
我是Android开发新手,正在开发一款双人问答游戏。目前遇到的问题是:当第二名玩家加入第一名玩家已等待的游戏时,第二名玩家的游戏页面会关闭,而第一名玩家的页面正常运行。我通过创建Firebase的"turn"节点引用来管理玩家回合,并在setQuiz()方法中获取当前回合玩家的用户名,恳请各位开发者提供技术帮助。
package com.example.genialone; import android.app.ProgressDialog; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import com.bumptech.glide.Glide; import com.example.genialone.data.RealtimeDatabase; import com.example.genialone.model.TurnManager; import com.example.genialone.model.Utente; import com.example.genialone.preference.PreferencesManager; import com.example.genialone.util.RandomCategory; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.MutableData; import com.google.firebase.database.Query; import com.google.firebase.database.Transaction; import com.google.firebase.database.ValueEventListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import de.hdodenhof.circleimageview.CircleImageView; public class GiocoActivity extends BaseActivity { private Button next; private PreferencesManager preferencesManager; private TextView opponent; private CircleImageView imageOpponent; private TextView player; private CircleImageView imagePlayer; private ProgressDialog progressDialog; private FirebaseDatabase database = FirebaseDatabase.getInstance(); private TextView question; private Button option1, option2, option3, option4; private String rightAnswer; private String player1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gioco); player = findViewById(R.id.player); imagePlayer = findViewById(R.id.imagePlayer); opponent = findViewById(R.id.opponent); imageOpponent = findViewById(R.id.imageOpponent); question = findViewById(R.id.question); option1 = findViewById(R.id.option1); option2 = findViewById(R.id.option2); option3 = findViewById(R.id.option3); option4 = findViewById(R.id.option4); preferencesManager = new PreferencesManager(GiocoActivity.this); player1 = preferencesManager.getUsername(); next = findViewById(R.id.continuaButton); next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // next turn } }); progressDialog = new ProgressDialog(GiocoActivity.this); progressDialog.setCancelable(false); progressDialog.setMessage("In cerca di un avversario..."); progressDialog.show(); startGame(); } public void loadProfilePhoto(String user, CircleImageView imageProfilePhoto) { DatabaseReference imageRef = database.getReference("Utenti").child(user); imageRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { String imageUrl = dataSnapshot.child("imagineProfilo").getValue(String.class); Glide.with(GiocoActivity.this).load(imageUrl) .placeholder(com.firebase.ui.database.R.drawable.common_google_signin_btn_icon_dark) .circleCrop() .error(com.firebase.ui.database.R.drawable.common_google_signin_btn_icon_dark_normal) .into(imageProfilePhoto); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // Gestione degli errori } }); } private void startGame() { player.setText(player1); loadProfilePhoto(player1, imagePlayer); DatabaseReference connectionRef = database.getReference("connections"); Query availableConnections = connectionRef.orderByChild("player2").equalTo(null); availableConnections.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if(snapshot.exists()){ for (DataSnapshot gameSnapshot : snapshot.getChildren()) { String connectionId = gameSnapshot.getKey(); connectionRef.child(connectionId).child("player2").setValue(player1); join(connectionId); break; } } else { DatabaseReference newRef = database.getReference("connections").push(); String connectionId = newRef.getKey(); assignPlayersToGame(connectionId, player1); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } private void join(String connectionId) { DatabaseReference connectionRef = database.getReference("connections").child(connectionId); connectionRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { String usernameOpponent = snapshot.child("player1").getValue(String.class); showInfoOpponent(usernameOpponent); if (progressDialog.isShowing()) { progressDialog.dismiss(); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } private String playerTurn; private String turnKey; private void assignPlayersToGame(String connectionId, String username) { DatabaseReference connectionRef = database.getReference("connections").child(connectionId); DatabaseReference turnRef = database.getReference("turn"); turnKey = turnRef.push().getKey(); Map<String, Object> playerData = new HashMap<>(); playerData.put("player1", username); connectionRef.updateChildren(playerData); turnRef.updateChildren(playerData); connectionRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { String usernameOpponent = snapshot.child("player2").getValue(String.class); if (usernameOpponent != null) { showInfoOpponent(usernameOpponent); if (progressDialog.isShowing()) { progressDialog.dismiss(); } } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } private void showInfoOpponent(String username) { DatabaseReference usersRef = database.getReference("Utenti"); usersRef.child(username).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { Utente opponentInfo = snapshot.getValue(Utente.class); opponent.setText(opponentInfo.getNomeUtente()); // username loadProfilePhoto(opponentInfo.getNomeUtente(), imageOpponent); // image profile loadPage(); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } private void setQuiz(String questionD, ArrayList<String> options, String answer) { DatabaseReference turnRef = database.getReference("turn").child(turnKey); turnRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { playerTurn = snapshot.child("player1").getValue(String.class); if (player1.equals(playerTurn)) { question.setText(questionD); rightAnswer = answer; Button[] buttons = {option1, option2, option3, option4}; for (int i = 0; i < options.size(); i++) { buttons[i].setText(options.get(i)); } next.setVisibility(View.VISIBLE); } else { progressDialog = new ProgressDialog(GiocoActivity.this); progressDialog.setCancelable(false); progressDialog.setMessage("Wait..."); progressDialog.show(); } } @Override public void onCancelled(@NonNull DatabaseError error) { // Gestione degli errori } }); } private void loadPage() { DatabaseReference quizRef = database.getReference("Quiz"); String category = RandomCategory.getCategory(); quizRef.child(category).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { int idQuestion = RandomCategory.getQuestion(); String quest = snapshot.child("Domande").child(String.valueOf(idQuestion)).getValue(String.class); ArrayList<String> options = new ArrayList<>(); for (DataSnapshot opt : snapshot.child("Opzioni").child(String.valueOf(idQuestion)).getChildren()) { String currentOpt = opt.getValue(String.class); options.add(currentOpt); } String rightA = snapshot.child("Risposta").child(String.valueOf(idQuestion)).getValue(String.class); setQuiz(quest, options, rightA); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } }
内容的提问来源于stack exchange,提问作者routerking2802
相关产品推荐
相关产品推荐

