我是Android编程和使用Firebase创建多人游戏的初学者。我在考虑用户如何启动游戏的逻辑。
我要做的是在用户玩游戏的房间变满时向Toast展示。但是我想知道其他设备如何判断房间是否满员。我以为addListenerForSingleValueEvent
可以做到这一点,但是它没有按预期工作。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_name);
String roomName = getIntent().getExtras().getString("ROOM_NAME");
thisRoom = FirebaseDatabase.getInstance().getReference().child(roomName);
thisRoom.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//when the room gets full, start the game
int numberOfPlayers = (int) dataSnapshot.getChildrenCount();
if (numberOfPlayers >= 2) {
Toast.makeText(MultiplayerStreetViewActivity.this, "Game Starts", Toast.LENGTH_LONG).show();
//do something
}
}
我检查了两个模拟器是否可以正常工作。对于第一个较早开始活动的玩家,添加第二个值时不会显示Toast。设备如何检查何时自动添加新值? 我确定我误会了一些东西并犯了愚蠢的错误。我该怎么做我想做的事?
答案 0 :(得分:0)
我有个主意,那就是为thisRoom
添加子事件监听器,并使用本地设备上的数组列表来管理房间中的播放器。每次您添加,修改或删除房间中的播放器。侦听器将立即触发,您可以在数组列表上添加,修改或删除。因此,您可以知道房间是否已满(根据阵列列表是否已满)。
thisRoom.addChildEventListener (new ChildEventListener(){
public void onCancelled(DatabaseError error)
{
//say something to player
}
public void onChildAdded(DataSnapshot snapshot, String previousChildName)
{
Player newPlayer = snapshot.getValue(Player.class);
//then add newPlayer to local array list
}
public void onChildChanged(DataSnapshot snapshot, String previousChildName)
{
Player changedPlayer = snapshot.getValue(Player.class);
//then do something to modify info of the player in the array list
}
public void onChildMoved(DataSnapshot snapshot, String previousChildName)
{
//I have no idea for this method
}
public void onChildRemoved(DataSnapshot snapshot)
{
//remove player from your array list
}
});