如何在 `Photon Server` 的 `onEvent()` 中获取 `EventData`

How to get `EventData` in `onEvent()` in `Photon Server`

我正在使用 Photon Server 开发 multiplayer 游戏。我正在使用 HashMaps 通过 loadBalancingPeer.opRaiseEvent 发送一些数据,但我无法在 LoadBalancingClient.

onEvent 函数中获取数据

这是我的自定义事件代码。

public void sendSomeEvent(int playerPosition) {

        HashMap<Object, Object> eventContent = new HashMap<Object, Object>();
        eventContent.put("key1", "ABC");

        this.loadBalancingPeer.opRaiseEvent((byte) 1, eventContent, false,
                (byte) 0); // this is received by OnEvent()
    }

这是 onEvent() 代码。

@Override
public void onEvent(EventData eventData) {
    super.onEvent(eventData);

    switch (eventData.Code) {
    case (byte) 1:
        String value = (String) eventData.Parameters
                .get("key1");
        ApplicationManager.onEventReceived(ab);
        break;      
    }
    // update the form / gui
    ApplicationManager.onClientUpdateCallback();
}

在这个函数中我得到了 null 值,但它以这种形式显示参数数据 {-11={key1=ABC}, -2=1}。 请帮助我哪里出错了。 提前致谢。

我没有使用过 Photon,但在查看 API 文档后,我认为你做错了。 EventData 也是一种地图。

如果引发事件,eventData.Code 的值实际上应该是 OpertationCode.RaiseEvent 并且您的事件 ( byte ) 1 将映射到映射中的键 EventCode.Code

在此 EventData 中,事件代码映射到键 EventCode.Code,您的数据映射到键 ParameterCode.Data

所以...要从 EventData 中获取已发送的 hashmap,您需要执行 eventData.get( ParameterCode.Code ).

我认为以下应该没问题。试一试,如果这不起作用,请给我详细的错误日志。

switch ( eventData.Code ) {
    // If it is a RaiseEvent
    case OperationCode.RaiseEvent:
        switch ( eventData.get( EventCode.Code ) ) {
            // If it is your event.
            case (byte) 1:
                HashMap< Object, Object > map = (HashMap<Object, Object>) eventData.get( ParameterCode.Data );

                HashMap< String, String > smap = new HashMap< String, String >();
                for( Object key : map.keySet() ) {
                    smap.put( (String) key, ( String ) map.get( key ) );
                }
                // Now smap is the HashMap<String, String> that you sent.
                // do something
                break;
        }
        break;
}

注意 :: 现在我非常有信心它应该可以工作。