iPhone多人游戏代码有效,但iPad不支持。代表问题?
问题描述:
我已经为我的iPhone应用程序封装了多人游戏代码,并开始致力于更新iPad版本的图形。在更新我的所有小精灵之后,我的惊喜让我惊讶不已,我的iPad版本与iPhone完全不同。我使用由自由开发人员和Ray Wenderlich的GCHelper编写的一些自定义代码的组合。到目前为止,一切都很好。对于iphone应用程序,我的游戏玩家发送和接收所有玩家移动。在iPad应用程序中,出于某种原因,场景正在接收数据。iPhone多人游戏代码有效,但iPad不支持。代表问题?
MainMenu.h
@protocol GCHelperDelegate
- (void)matchStarted;
- (void)matchEnded;
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID;
- (void)inviteReceived;
@end
@interface MainMenu: CCLayer <GCHelperDelegate>
{//some code
}
MainMenu.m
- (void) StartMultiplayerGame //button calls up gamecenter matchmaking
{
NSLog(@"***In StartMultiplayerGame***");
delegate1 = (AppDelegate *) [UIApplication sharedApplication].delegate;
[[GCHelper sharedInstance] findMatchWithMinPlayers:2 maxPlayers:4 viewController:delegate1.viewController delegate:self];
boo_multiplayer=true;
boo_startgame=true;
colorLayer = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 255)];
[colorLayer setOpacity:175];
[self addChild:colorLayer z:2];
return;
}
GCHelper.h
#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>
#import "cocos2d.h"
#import "AppDelegate.h"
@protocol GCHelperDelegate
- (void)matchStarted;
- (void)matchEnded;
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID;
- (void)inviteReceived;
@end
@interface GCHelper : NSObject <GKMatchmakerViewControllerDelegate, GKMatchDelegate> {
BOOL gameCenterAvailable;
BOOL userAuthenticated;
bool boo_invite;
UIViewController *presentingViewController;
GKMatch *match;
BOOL matchStarted;
__strong id <GCHelperDelegate> delegate;
NSMutableDictionary *playersDict;
GKInvite *pendingInvite;
NSArray *pendingPlayersToInvite;
NSMutableArray *playernames;
NSMutableArray *playeridentification;
NSError *lastError;
GKMatchRequest *request;
// // AppDelegate *delegate1;
}
@property (assign, readonly) BOOL gameCenterAvailable;
@property (strong) UIViewController *presentingViewController;
@property (strong) GKMatch *match;
@property (strong) id <GCHelperDelegate> delegate;
@property (strong) NSMutableDictionary *playersDict;
@property (strong) GKInvite *pendingInvite;
@property (strong) NSArray *pendingPlayersToInvite;
+ (GCHelper *)sharedInstance;
- (void)authenticateLocalUser;
- (void)findMatchWithMinPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController *)viewController delegate:(id<GCHelperDelegate>)theDelegate;
@end
GCHelper.m
- (void)findMatchWithMinPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController *)viewController delegate:(id<GCHelperDelegate>)theDelegate
{
if (!gameCenterAvailable) return;
matchStarted = NO;
self.match = nil;
self.presentingViewController = viewController;
delegate = theDelegate;
if (pendingInvite != nil) {
[presentingViewController dismissModalViewControllerAnimated:NO];
GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithInvite:pendingInvite];
mmvc.matchmakerDelegate = self;
[presentingViewController presentModalViewController:mmvc animated:YES];
self.pendingInvite = nil;
self.pendingPlayersToInvite = nil;
}
else {
[presentingViewController dismissModalViewControllerAnimated:NO];
request=[[GKMatchRequest alloc] init];
request.minPlayers = minPlayers;
request.maxPlayers = maxPlayers;
request.playersToInvite = pendingPlayersToInvite;
GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithMatchRequest:request];
mmvc.matchmakerDelegate = self;
[presentingViewController presentModalViewController:mmvc animated:YES];
self.pendingInvite = nil;
self.pendingPlayersToInvite = nil;
}
}
// A peer-to-peer match has been found, the game should start
- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)theMatch {
[presentingViewController dismissModalViewControllerAnimated:YES];
self.match = theMatch;
self.match.delegate = self;
currentMatch=match;
if (!matchStarted && match.expectedPlayerCount == 0)
{
NSLog(@"Ready to start match!");
TXGameCenterManager * gameCenterManager = [TXGameCenterManager sharedTXGameCenterManager];
gameCenterManager.multiplayerMatch = match;
// The delegate of the match is HelloWorldLayer
gameCenterManager.multiplayerMatch.delegate = self;
AppDelegate * delegate1 = (AppDelegate *) [UIApplication sharedApplication].delegate;
[delegate1.viewController dismissModalViewControllerAnimated:NO];
[self lookupPlayers];
}
}
- (void)lookupPlayers
{
NSLog(@"Looking up %d players...", match.playerIDs.count);
[GKPlayer loadPlayersForIdentifiers:match.playerIDs withCompletionHandler:^(NSArray *players, NSError *error) {
if (error != nil) {
NSLog(@"Error retrieving player info: %@", error.localizedDescription);
matchStarted = NO;
//[delegate matchEnded];
}
else
{
// some code.
[[CCDirector sharedDirector] replaceScene:[HelloWorldLayer node]];
}
我真不明白的是,在iPad模拟器的工作就好了。我的应用程序在这里发生了什么,以及如何强制didReceiveData方法在游戏图层中运行,而不是在我的菜单场景中运行?
答
这样的白痴。 iPad iOS需要升级到6.0。