【发布时间】:2017-10-17 20:37:13
【问题描述】:
为了避免成为XY问题,我先说明情况。
我正在开发一款游戏,其中多个设备可以相互连接以进行多人游戏。为此,我正在使用 Multipeer Connectivity。游戏支持2-4名玩家。
现在我需要处理一个玩家与所有其他玩家断开连接的情况。当玩家断开连接时,游戏仍应继续,除非只剩下一个玩家。但是,我希望向所有仍然连接的玩家显示“XXX 已断开连接”并“杀死”断开连接的玩家的警报,并向断开连接的玩家显示“您已断开连接”并关闭游戏视图控制器的另一个警报.
玩家可以通过以下方式断开连接:
- 按下退出按钮
- 关闭屏幕(这会使应用进入后台,显然会停止所有 Mutipeer 连接)
- 开启飞行模式
- 离其他人太远了
除了第一种方式之外的所有东西都不能以编程方式控制。我目前可以像这样实现第一个:
当用户按下退出按钮时,在调用session.disconnect() 之后,我可以显示消息“您已断开连接”。在sessionPeerDidChangeState委托方法中,我可以检测到一个玩家已经断开连接,我可以在那里显示“XXX断开连接”警报。
但是,我不知道如何处理其他情况。在我自己的测试中,我发现如果用户关闭屏幕,甚至不会调用 sessionPeerDidChangeState 委托方法。即使它被调用,我应该如何确定该设备是否是断开连接的设备?我需要知道这一点才能显示适当的消息并决定是否“杀死”断开连接的玩家。
我知道这对于由 2 个对等方组成的会话是不可能的,因为无法确定“谁与谁断开连接”。无论如何,只有 1 个玩家无法继续游戏,所以如果我看到 self.session.connectedPeers 为空,我将显示“所有其他玩家已离开”警报并关闭游戏视图控制器。我只关心有 3 名球员,其中 1 名球员离开的情况。我应该能够知道是哪个玩家断开了连接,但我不知道如何。
【问题讨论】:
-
第二个你不能用
applicationDidEnterBackground吗?要检查飞行模式,请在此处查看此线程 stackoverflow.com/questions/4804398/detect-airplane-mode-on-ios 并使用代表检查他们是否将其关闭或打开。至于离别人太远,你是指身体上的吗?还是在游戏中?如果是前者,那么除了不断听别人的位置外,我不太确定 -
@TNguyen 我知道存在但断开连接的方法列表不限于我在问题中的内容。我认为我不可能处理所有案件。我正在寻找一种方法来检测断开连接,不管是什么原因。
-
您能否告诉我们您是如何连接玩家的,例如,如果您有 3 位玩家,是否一位玩家充当
Browser (MCNearbyServiceBrowser)而其他玩家充当Advertisers (MCNearbyServiceAdvertiser)?还是你用其他方式来做 -
@Ladislav 是的,这正是我连接玩家的方式,但这有关系吗?游戏开始后,我扔掉所有的广告商和浏览器,因为你不能加入正在进行的游戏。
-
当我进行测试时,如果其中一个已连接的对等体打开飞行模式,我总是接到一个对等体已断开连接的委托呼叫,尽管这需要一些时间 - 通常在我放置后 5-8 秒在飞行模式...
标签: ios swift multipeer-connectivity