0

我有一个多人项目并使用 SmartFoxServer。我正在编写服务器扩展,但不确定最佳实践是什么。我看到一些奇怪的行为,我不确定这是否是由于我的课程设置方式造成的。在我的扩展中,我有一个这样的主类:

public class MyExtension extends SFSExtension
{
 private int numberOfPlayersReady  = 0;

    @Override
    public void init()
    {            
            addRequestHandler("dealingHand",MoveHandler.class ); 

    }
     //...some code
   public int getNumberOfPlayersReady(){
        return numberOfPlayersReady;
    }
    void setNumberOfPlayersReady(){
        numberOfPlayersReady++;
    }

}

移动处理器.java:

@Instantiation(InstantiationMode.SINGLE_INSTANCE)
public class MoveHandler extends BaseClientRequestHandler{    

    @Override
    public void handleClientRequest(User user, ISFSObject params)
    {

            MyExtension gameExt = (MyExtension) getParentExtension();   
            int currentNumber  = gameExt.getNumberOfPlayersReady();                
            trace("another player is ready " + currentNumber);

            if(currentNumber  == 3){
               //do something 
            }else{
                int newCurrentNumber = (int)currentNumber + 1;
                gameExt.setNumberOfPlayersReady();
            }
     }

  }

然后在我的 Unity C# 代码中调用我的服务器扩展代码,如下所示:

SFSObject obj = new SFSObject();
obj.PutInt("playerCheckingInID", sfs.MySelf.Id);
sfs.Send(new ExtensionRequest("dealingHand", obj, sfs.LastJoinedRoom));

但是,当我查看 SmartFoxServer 独立命令行以查看跟踪时,我看到:

"another player is ready 0"
"another player is ready 0"
"another player is ready 0"
"another player is ready 3"

我想我会看到:

"another player is ready 0"
"another player is ready 1"
"another player is ready 2"
"another player is ready 3"

谁能让我知道这里发生了什么?这是否与使用 Single_Instance 类有关?

编辑:或者,这与同步线程有关吗?如果是这样,管理它的最佳方法是什么?这是一款多人回合制游戏。总会有四个玩家。发送到服务器扩展的请求应按照接收顺序进行管理。

4

1 回答 1

0

如果您要制作多人游戏,请将连接到sfs的每个玩家加入一个房间,然后检查加入房间的玩家总数,当人数达到4时,将他们从该房间离开,并创建另一个房间并创建另一个房间。把它们放在那个房间里。克里特一个静态房间进行匹配,然后为每个匹配创建动态房间。例如,创建一个房间名称 MatchFindingRoom ,然后加入每个连接的玩家。

        Room matchFindRoom= getParentExtension().getParentZone()
                .getRoomByName("MatchFindingRoom");
        getApi().joinRoom(user, getParentExtension().getParentZone().getRoomByName("MatchFindingRoom"));
        List<User> waiterUsers = matchFindRoom.getUserList();
        if(waiterUsers.size() >= 4)
        {
            CreateRoomSettings crs = new CreateRoomSettings();
            crs.setName("testRoom");
            crs.setMaxUsers(4);
            crs.setMaxVariablesAllowed(50);
            crs.setAutoRemoveMode(SFSRoomRemoveMode.WHEN_EMPTY);
            getApi().createRoom(getParentExtension().getParentZone(), crs,
                    null, false, null, false, false);
            Room matchRoom = getParentExtension().getParentZone().getRoomByName("testRoom");
            getApi().joinRoom(waiterUsers.get(0), matchRoom);
            getApi().joinRoom(waiterUsers.get(1), matchRoom);
            getApi().joinRoom(waiterUsers.get(2), matchRoom);
            getApi().joinRoom(waiterUsers.get(3), matchRoom);
            // do other stuff
        }

当您为用户使用空间时,您不需要跟踪他们的踏板,只需获得空间并将播放器放入其中,然后做任何您想做的事情。强烈建议不要在服务器上使用踏板,因为如果每个用户都创建一个,您的服务器 cpu 将无法正常访问它们。

于 2017-02-20T18:00:07.063 回答