标签: gamekit

Game Center属性中的Game Center GKTurnBasedMatch问题

我正在用GKTurnBasedMatch匹配创建一个游戏中心游戏.我遇到的问题是,a上的readonly matchData属性GKTurnBasedMatch似乎没有正确存储在Game Center服务器上.

我正在使用此StackOverflow应答来生成md5校验和matchData NSData,无论是在向Game Center服务器发送还是从Game Center服务器接收时.

NSData当我matchData使用GKTurnBasedMatch实例方法发送时,我注意到我的游戏数据对象的校验和endTurnWithNextParticipants:turnTimeout:matchData:completionHandler:.

然后对手使用GKTurnBasedMatch's class方法检索匹配loadMatchesWithCompletionHandler:,当匹配到达(没有错误)时,我再次记下校验和.

两个校验和不匹配,并且基于重建的游戏,得到的数据明显不相同.我已经检查了两个帐户,matchID我的GKTurnBasedMatch对象上的属性是相同的.

我还进行了以下测试:

NSLog(@"matchID: %@ matchData checksum: %@",
                    match.matchID, 
                    [Utilities md5StringFromData:match.matchData]);

// match is a valid `GKTurnBasedMatch` object.
[match endTurnWithNextParticipants: @[ opponent ] // My `GKTurnBasedParticipant` opponent
                       turnTimeout:600
                         matchData:data // This is a valid NSData object
                 completionHandler:^(NSError *error) {
                      if (nil != error) {

                          NSLog(@"%@", error); …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c gamekit ios game-center

11
推荐指数
1
解决办法
1420
查看次数

GKSession和sendDataToAllPeers的问题:withDataMode:错误:

好吧,这涉及到多人教程这一部分的大量网络编码.

基本上,我正在尝试按照上面链接的教程使用GameKit实现多人游戏.我放入了所有必要的网络编码,或多或少地理解它,但是我在方法调用的某个方面遇到了麻烦.基本上,我的设置是一个设备充当主机,其余设备充当客户端.我有两个独立的UIViewcontrollers分别用于建立连接的主机和客户端.

现在的问题是,连接已建立,但它只是识别连接的主机,而不是客户端.问题出在这里:

- (void)sendPacketToAllClients:(Packet *)packet
{
    [_players enumerateKeysAndObjectsUsingBlock:^(id key, Player *obj, BOOL *stop)
     {
         obj.receivedResponse = [_session.peerID isEqualToString:obj.peerID];
     }];

    GKSendDataMode dataMode = GKSendDataReliable;
    NSData *data = [packet data];
    NSError *error;
    if (![_session sendDataToAllPeers:data withDataMode:dataMode error:&error])
    {
        NSLog(@"Error sending data to clients: %@", error);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是在实施GameMultiplayer实际游戏的地方实施的.该方法应该做的是向每个客户端发送数据包,说明主机收到连接请求并能够与它们连接.在[_session sendDataToAllPeers:data withDataMode:dataMode error:&error]调用之后(if语句中的方法),应该触发此方法:

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peerID inSession:(GKSession *)session context:(void *)context
{
#ifdef DEBUG
    NSLog(@"Game: receive data from peer: %@, data: %@, …
Run Code Online (Sandbox Code Playgroud)

objective-c gamekit ios

11
推荐指数
1
解决办法
819
查看次数

使用Mac OS X的GKSession

我正在使用GKSession(Game Kit的一部分)将多个iOS设备连接在一起(通过蓝牙和/或wifi),发送数据等等都运行正常,我很满意.

我在想,拥有可以连接到iOS设备的Mac OS X应用程序,共享数据等等也会很酷.

遗憾的是,GKSession似乎不是Mac OS X Game Kit的一部分(显然是10.8+).我想知道是否有人知道如何做到这一点或有任何想法.

再次感谢.

macos networking gamekit ios core-bluetooth

10
推荐指数
1
解决办法
440
查看次数

authPlayerWithCompletionHandler已弃用,因此如何使用authenticateHandler

标题中的问题,authPlayerWithCompletionHandler是不推荐使用的,那么我如何使用authenticateHandler呢?

gamekit ios game-center ios6

10
推荐指数
2
解决办法
1万
查看次数

SKStoreProductViewController和GKHostedAuthenticateViewController没有iPhone横向模式

我正在实施StoreKit应用内应用程序购买界面,虽然看起来SKStoreProductViewControlleriPad上的手柄风景,但我的iPhone上的应用程序似乎没有这样做(它是通用的).

界面SKStoreProductViewController是如此有限,我似乎无法以VC任何方式操纵. 有没有其他人遇到这个?任何解决方法?

当我运行在iPad上运行的代码时,SKStoreProductViewController它从左侧进入,大约一英寸,并在那里挂起直到被解雇.它看起来很实用,但它会让解雇时出现的VC混乱.

这是代码:

// Set up the store vc (creating it if not already done)
if (self.storeVC == nil) self.storeVC = [[SKStoreProductViewController alloc] init];
self.storeVC.delegate = self;
NSDictionary *params = [NSDictionary dictionaryWithObject:appID forKey:SKStoreProductParameterITunesItemIdentifier]; 

// Set up a HUD in case connecting to the store takes a while
[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 

[self.storeVC loadProductWithParameters:params
                        completionBlock:^(BOOL result, NSError *error) {
       [MBProgressHUD hideHUDForView:self.view animated:YES];
       if (result) {
           [self presentViewController:self.storeVC animated:NO completion:^{
           }];
       }
  }]; …
Run Code Online (Sandbox Code Playgroud)

iphone landscape storekit gamekit ios6

10
推荐指数
1
解决办法
3026
查看次数

GKTurnBasedMatch的问题endTurnWithNextParticipants:turnTimeout:matchData:completionHandler:

我正在使用GKTurnBasedMatch进行iphone游戏.首先,我创建游戏并邀请几个玩家.

我结束了第一批玩家使用endTurnWithNextParticipants转向:turnTimeout:matchData:completionHandler:它转到第二个玩家.

当第二个玩家轮到他时,更新匹配数据并更新下一个参与者,他尝试调用相同的endTurnWithNextParticipants:turnTimeout:matchData:completionHandler:,但是我收到错误.

GKErrorDomainCode = 17"无法完成请求的操作,因为一个或多个参数无效"

nextParticipants的数组似乎很好.我所做的就是将当前玩家放在参与者阵列的末尾,turnTimeOut看起来很好,我做的和我第一次做的一样,而且matchdata也应该没问题.

有什么东西我错过了吗?我能做的唯一事情就是我没有正确地接受游戏邀请或类似的东西.但是,我不清楚文档.

我一直试图调试这几个小时.

我很感激你能给我的任何帮助!非常感谢.

objective-c gamekit ios

10
推荐指数
1
解决办法
528
查看次数

如何使用 SwiftUI 显示 Game Center 排行榜

我创建了一个测试应用程序来测试将 GameCenter 排行榜添加到我正在创建的简单 SwiftUI 游戏中。我一直无法弄清楚如何显示所有分数的游戏中心排行榜。

我创建了一个包含所有游戏中心功能的类(身份验证和向排行榜添加分数。这是从主 ContentView 视图调用的。我不知道如何让它显示排行榜(甚至游戏中心登录屏幕,如果玩家尚未登录。)

这是我的 GameCenterManager 类:

class GameCenterManager {
        var gcEnabled = Bool() // Check if the user has Game Center enabled
        var gcDefaultLeaderBoard = String() // Check the default leaderboardID
        var score = 0
        let LEADERBOARD_ID = "grp.colorMatcherLeaderBoard_1" //Leaderboard ID from Itunes Connect

       // MARK: - AUTHENTICATE LOCAL PLAYER
       func authenticateLocalPlayer() {
        let localPlayer: GKLocalPlayer = GKLocalPlayer.local

           localPlayer.authenticateHandler = {(ViewController, error) -> Void in
               if((ViewController) != nil) {
                   print("User is not logged into game …
Run Code Online (Sandbox Code Playgroud)

xcode gamekit game-center game-center-leaderboard swiftui

10
推荐指数
2
解决办法
2595
查看次数

GameKit wifi连接?

我已经读过,从iPhone OS 3.1开始,GameKit支持wifi连接.但文件说明:

"如果您的应用程序将对等选择器配置为允许Internet连接,则您的应用程序还必须关闭对等选择器并显示其自己的接口以配置Internet连接."

这仍然有效吗?如果是这样,我如何建立一个可供GK使用的wifi Bonjour会话?(我只对使用本地网络感兴趣.)

iphone objective-c gamekit iphone-sdk-3.1

9
推荐指数
1
解决办法
5266
查看次数

NSSet到NSData,然后再次退出,为GameKit?

我正在尝试在不同的iPhone上运行的两个相同的应用程序之间进行一些图像编辑同步.我想将NSSet*从一个设备发送到另一个设备(我想这涉及封装在NSData中)然后将其解密回NSSet,然后在touchesMoved类型的函数中使用它.这是可行的,还是我应该同步UIImages?我担心UIImage同步对于实时交互会有太多的延迟.

谢谢你的帮助!

iphone nsdata gamekit nsset iphone-sdk-3.0

9
推荐指数
1
解决办法
2078
查看次数

为什么我不能在iOS9中设置GKAgent2D的速度?

如果我尝试在iOS9中更改GKAgent2D(或其父类GKAgent)的speed参数值,我会收到此无法识别的选择器错误:

***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [GKAgent2D setSpeed:]:发送到实例的无法识别的选择器

但是在iOS10中,不会发生此错误,并且正确更改代理的速度.

我可以在一个非常简单的示例中重现错误(单视图iOS应用程序,将视图控制器代码更改为以下内容,请注意GKAgent2D或GKAgent发生错误):

import UIKit
import GameplayKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var agent = GKAgent()
        agent.speed = 10

        print(agent.speed)
    }

}
Run Code Online (Sandbox Code Playgroud)

上面总是在线路上发生这种无法识别的选择器错误而崩溃,该线路在运行iOS9.3的模拟器上设置代理的速度,而不是iOS10.3(所有这些都在Xcode 8.3.2下).

GKAgent的速度属性记录为在iOS9下读写并受支持 - 请参阅Apple的GKAgent文档,speed属性.

我在GKAgentDelegate遇到了类似的问题,只有使用无法识别的agentWillUpdate选择器才能在iOS9上崩溃.我通过在我的代码中放入一个虚拟方法来解决这个问题:

func agentWillUpdate(_ agent: GKAgent) {
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了类似的解决方案,以新的错误,在我的GKAgent2D子类中重写速度性能,并提供一个明确的setter和getter,甚至支持由私人浮法速度参数通过Kdawg的建议,但同样的错误仍然出现当超级速度参数设置时:

class Agent:GKAgent2D {
    override var speed:Float {
        get {return localSpeed}
        set {localSpeed = newValue}
    }
    private var localSpeed:Float {
        get {return super.speed}
        set {super.speed = newValue}
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

具体来说:iOS9中关于选择器的GKAgent是否存在任何已知问题?

或者,对替代工作的任何想法?

如果可以,我想支持iOS9.它看起来像是GameplayKit中的一个错误 - 但我希望Apple对报告的回应是它在iOS10中得到修复.

gamekit ios

9
推荐指数
1
解决办法
197
查看次数