我正在为游戏添加Game Center支持.因为我的游戏可以在iOS版本上运行回3.0,所以我想让它在没有Game Center的情况下在本地保存成就和排行榜.
现在,我有这个:
+ (BOOL) isGameCenterAvailable {
Class playerClass = NSClassFromString( @"GKLocalPlayer" );
if( playerClass != nil && [playerClass localPlayer] != nil ) {
DebugLog( @"Game Center is available" );
return YES;
}
DebugLog( @"Game Center is NOT available" );
return NO;
}
Run Code Online (Sandbox Code Playgroud)
但是,这似乎根本不起作用.首先,尽管GKLocalPlayer参考声明此类在iOS 4.1及更高版本中可用,但上述测试在iOS 4.0中通过(我没有尝试早期版本).另外,测试还传递了具有iOS 4.1但不支持Game Center的设备(例如,iPhone 3G).
我已经在线浏览了各种GameKit和游戏中心文档,并且没有任何运气可以解决这个问题.我当然可以检测到操作系统版本,但这似乎很蹩脚.对于不支持的硬件(如3G)的情况,这也无济于事.我想也可以检测到这一点,但是再次看起来有点蹩脚.
以编程方式检测Game Center支持的"正确方法"是什么?
我有一个设置的应用程序,这样如果用户选择设备作为服务器,它会在服务器模式下创建一个GKSession,如果它选择了cient,它会在客户端模式下创建一个GKSession.
目前发生的事情是服务器正在发送数据,这只是一个包含服务器时间的字符串.
然而,问题开始,当我有一个客户端已经连接到服务器然后我连接另一个客户端..问题是:第二个连接的客户端由于某种原因也连接到第一个客户端.
我希望能够不连接到其他客户端,只需连接到服务器.任何帮助都会很棒
我想制作类似于会说话的汤姆猫,触摸宠物猫/,虚拟猴子和自来水动物园的应用程序.
我对Iphone基本动画有所了解.
我想知道我可以在没有OpenGL,cocos和其他游戏环境的情况下制作这些应用程序...我可以通过仅使用基本框架来制作它...
我正在使用GameKit和GKTurnBasedMatch实现基于回合制的多人游戏.当游戏结束时,玩家会收到"游戏结束"通知; 当玩家轮到他们时,他们会收到"轮到你"的通知.这些通知使用GKTurnBasedMatch自动发生.
是否可以更改这些通知显示的文本或图标?
我有一个有5种不同游戏模式的应用程序,其中3个有整数分数,其中2个有基于时间的分数(他们完成游戏的速度有多快).
如何设置我的reportScore:方法,以便我在iTunes Connect中设置的排行榜(以最低到最高时间格式显示高分数到百分之一秒)将以时间格式收到用户的分数?
我想把它作为一个发送NSTimeInterval.
Apple Docs指定的方法仅接受整数作为分数:
- (void) reportScore: (int64_t) score forCategory: (NSString*) category
{
GKScore *scoreReporter = [[GKScore alloc] initWithCategory:category];
scoreReporter.value = score;
[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
if (error != nil)
{
//handle the score to submit again later
}
}];
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
我已经做了这方面的一些研究,我知道,你只能发送分数游戏中心排行榜作为int64_t.那么,如何格式化这个整数,使我的排行榜将其格式化为一个时间到百分之一秒?
谢谢你的帮助!
我希望在我的回合制游戏中有一个"快速匹配"模式,玩家可以自动匹配第一个可用的玩家.我正在使用自己的自定义UI.到目前为止,我的代码如下所示:
- (void)quickMatch {
GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 2;
request.maxPlayers = 2;
request.playersToInvite = nil;
[GKTurnBasedMatch findMatchForRequest:request withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error) {
NSLog(@"MATCH: %@ %@ %@ %d",error,match,match.matchID,(int)match.status);
}];
Run Code Online (Sandbox Code Playgroud)
这成功创建了一个匹配项,但匹配中的第二个参与者具有nullID(playerID:(null) status:Matching).
我想如果我在另一个实例上运行相同的代码,使用不同的Game Center ID,那么这两个用户将相互匹配......但这似乎不正确.每当我调用该GKTurnBasedMatch loadMatchesWithCompletionHandler函数时,我会继续检索相同的匹配,每个匹配只有1个有效参与者(本地播放器).
此问题似乎与iOS开发类似:如何在Game Center中自动匹配玩家?这表明设置request.playersToInvite = nil;应该完成自动匹配,但这似乎并不适合我.
如何让Game Center自动匹配这些玩家?
在iOS上,您可以从设置应用程序中导出GameKit日志文件.但是它无法告诉您在哪里可以找到这些日志文件.您也无法从Xcode->设备查看它们.
我正在尝试使用GameKit框架通过蓝牙发送文件.我遇到的问题是我一次只能发送一个NSData对象,但我需要在另一端保存它.如果不知道文件名,这显然是不可能的,但我不知道如何传输它.我试图将它转换为字符串, NSData*data = [NSData dataWithContentsOfFile:urlAddress];但我只能发送一个NSData对象,而不是两个.
有人遇到过这个问题吗?
我正在使用iOS7的新功能MultipeerConnectivity.它配备了一个功能didChangeState:
在ViewController.h中,
#import <GameKit/GameKit.h>
#import <MultipeerConnectivity/MultipeerConnectivity.h>
@interface ViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDelegate, MCBrowserViewControllerDelegate, MCSessionDelegate>
Run Code Online (Sandbox Code Playgroud)
在ViewController.m中,需要以下两种方法来实现:
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{ ...... }
Run Code Online (Sandbox Code Playgroud)
//名称与iOS6 Gamekit功能重复:
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { ...... }
Run Code Online (Sandbox Code Playgroud)
由于iOS不支持函数重载,我应该如何在同一个程序中包含这两个函数?它编译失败.错误:方法'session的重复声明:peer:didChangeState:'我正在使用最新的XCode 5.0.1.
现在我正试图让我创建的排行榜显示出来.玩家的身份验证很好,但是当游戏中心窗口打开时,这很奇怪.这是一张图片:

这是我用来显示此图像的代码:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.showLeaderboard()
}
func showLeaderboard() {
var leaderView = UIViewController()
var leaderViewController = GKGameCenterViewController(rootViewController: leaderView)
leaderViewController.viewState = GKGameCenterViewControllerState.Leaderboards
leaderViewController.leaderboardIdentifier = "High_Score_Board"
self.showViewController(leaderViewController, sender: self)
//self.presentViewController(leaderViewController, animated: true, completion: nil)
}
func leaderboardViewControllerDidFinish(controller: GKGameCenterViewController){
controller.dismissViewControllerAnimated(true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
所有这些都在我的GameViewController中.此外,即使这样可行,我如何在SKScenes中访问此方法?谢谢您的帮助!
gamekit ×10
ios ×6
iphone ×5
objective-c ×5
game-center ×4
bluetooth ×1
cocoa ×1
ios4 ×1
logging ×1
multiplayer ×1
overloading ×1
sprite-kit ×1
swift ×1