Cocos2d x 如何在CoCoS2DX中制作在线2人游戏?
我制作了一个像Megaman这样的平台游戏,希望人们能够相互联系,一起玩。它必须在Android和Iphone上工作。 我使用cocos2dx,因此很难找到不使用不推荐或删除的方法/对象的好信息 什么是一个简单的方法,并获得足够的fps,使它看起来很好 编辑:人们投票否决这个问题太糟糕了,因为我真的不知道如何更好地指定它。我不知道该怎么开始。谢谢你投票否决了这些家伙SCocos2d x 如何在CoCoS2DX中制作在线2人游戏?,cocos2d-x,multiplayer,Cocos2d X,Multiplayer,我制作了一个像Megaman这样的平台游戏,希望人们能够相互联系,一起玩。它必须在Android和Iphone上工作。 我使用cocos2dx,因此很难找到不使用不推荐或删除的方法/对象的好信息 什么是一个简单的方法,并获得足够的fps,使它看起来很好 编辑:人们投票否决这个问题太糟糕了,因为我真的不知道如何更好地指定它。我不知道该怎么开始。谢谢你投票否决了这些家伙S借助苹果游戏中心,您可以尽早实现多人游戏。 with help of apple game center you can impl
借助苹果游戏中心,您可以尽早实现多人游戏。
with help of apple game center you can implement multiplayer very early.
for example
#import <Foundation/Foundation.h>
#import <GameKit/Gamekit.h>
@interface GCHelper : NSObject<GKMatchmakerViewControllerDelegate, GKMatchDelegate>
{
BOOL isUserAuthenticated;
UIViewController *presentingViewController;
GKMatch *match;
BOOL matchStarted;
GKInvite *pendingInvite;
NSArray *pendingPlayersToInvite;
NSMutableDictionary *playersDict;
NSString *MultiplayerID;
NSData *MultiData;
NSString *otherPlayerID;
char AlertMessageBoxNo;
BOOL isDataRecieved;
}
//variables
@property (assign, readonly) BOOL gameCenterAvailable;
@property (retain) UIViewController *presentingViewController;
@property (retain) GKMatch *match;
@property (retain) GKInvite *pendingInvite;
@property (retain) NSArray *pendingPlayersToInvite;
@property (retain) NSMutableDictionary *playersDict;
@property (retain) NSString *MultiplayerID;
@property (retain) NSData *MultiData;
-(NSString*)getOtherPlayerId;
-(void)setOtherPlayerId;
//Functions
+ (GCHelper *)sharedInstance;
-(BOOL)isGameCenterAvailable;
-(void)authenticationChanged;
-(void)authenticateLocalUser;
-(void)gameOver:(NSString*)message;
-(void)setDataRecieved:(BOOL)d;
-(BOOL)getDataRecieved;
- (void)findMatchWithMinPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController *)viewController;
///////////
#import "GCHelper.h"
#import "IPadSharebleClass.h"
@implementation GCHelper
@synthesize gameCenterAvailable;
@synthesize presentingViewController;
@synthesize match;
@synthesize pendingInvite;
@synthesize pendingPlayersToInvite;
@synthesize playersDict;
@synthesize MultiData;
@synthesize MultiplayerID;
static GCHelper *sharedHelper = nil;
+(GCHelper *) sharedInstance
{
if (!sharedHelper)
{
sharedHelper = [[GCHelper alloc] init];
}
return sharedHelper;
}
- (BOOL)isGameCenterAvailable
{
Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
NSString *reqSysVer = @"4.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);
return (gcClass && osVersionSupported);
}
- (id)init
{
if ((self = [super init]))
{
gameCenterAvailable = [self isGameCenterAvailable];
if (gameCenterAvailable)
{
NSNotificationCenter *nc =
[NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(authenticationChanged)
name:GKPlayerAuthenticationDidChangeNotificationName
object:nil];
}
else
{
UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"Game Center Alert" message:@"Game Center Not Available" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
}
return self;
}
-(void)authenticationChanged
{
if ([GKLocalPlayer localPlayer].isAuthenticated && !isUserAuthenticated)
{
NSLog(@"Authentication changed: player authenticated.");
isUserAuthenticated = TRUE;
[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite)
{
NSLog(@"Received invite");
self.pendingInvite = acceptedInvite;
self.pendingPlayersToInvite = playersToInvite;
IPadCallAnyWhereF.inviteReceived();
};
}
else if (![GKLocalPlayer localPlayer].isAuthenticated && isUserAuthenticated)
{
NSLog(@"Authentication changed: player not authenticated");
isUserAuthenticated = FALSE;
}
}
- (void)authenticateLocalUser
{
if (!gameCenterAvailable) return;
NSLog(@"Authenticating local user...");
if ([GKLocalPlayer localPlayer].authenticated == NO)
{
[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:nil];
}
else
{
NSLog(@"Already authenticated!");
}
}
-(void)findMatchWithMinPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController *)viewController
{
if (!gameCenterAvailable) return;
matchStarted = NO;
self.match = nil;
self.presentingViewController = viewController;
if (pendingInvite != nil)
{
[presentingViewController dismissModalViewControllerAnimated:NO];
GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:pendingInvite] autorelease];
mmvc.matchmakerDelegate = self;
[presentingViewController presentModalViewController:mmvc animated:YES];
self.pendingInvite = nil;
self.pendingPlayersToInvite = nil;
}
else
{
[presentingViewController dismissModalViewControllerAnimated:NO];
GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
request.minPlayers = minPlayers;
request.maxPlayers = maxPlayers;
request.playersToInvite = pendingPlayersToInvite;
GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
mmvc.matchmakerDelegate = self;
[presentingViewController presentModalViewController:mmvc animated:YES];
self.pendingInvite = nil;
self.pendingPlayersToInvite = nil;
}
}
#pragma mark GKMatchmakerViewControllerDelegate
- (void)matchmakerViewControllerWasCancelled:(GKMatchmakerViewController *)viewController
{
[presentingViewController dismissModalViewControllerAnimated:YES];
UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"Game Center Alert" message:@"Game Cancel By you" delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:@"Main Menu", nil];
[alert show];
[alert release];
AlertMessageBoxNo='E';
}
- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFailWithError:(NSError *)error
{
[presentingViewController dismissModalViewControllerAnimated:YES];
NSLog(@"Error finding match: %@", error.localizedDescription);
UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"Game Center Alert" message:@"Connection Time out" delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:@"Main Menu", nil];
[alert show];
[alert release];
AlertMessageBoxNo='A';
}
- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)theMatch
{
[presentingViewController dismissModalViewControllerAnimated:YES];
self.match = theMatch;
match.delegate = self;
if (!matchStarted && match.expectedPlayerCount == 0)
{
NSLog(@"***************Ready to start match!**************");
[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;
//IPadCallAnyWhereF.matchEnded();
UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"Game Center Alert" message:@"Error retrieving player info" delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:@"Main Menu", nil];
[alert show];
[alert release];
AlertMessageBoxNo='F';
}
else
{
self.playersDict = [NSMutableDictionary dictionaryWithCapacity:players.count];
for (GKPlayer *player in players)
{
NSLog(@"Found player: %@", player.alias);
[playersDict setObject:player forKey:player.playerID];
}
NSLog(@"Total Number of Players : %d",players.count);
matchStarted = YES;
IPadCallAnyWhereF.matchStarted();
}
}];
}
#pragma mark GKMatchDelegate
- (void)match:(GKMatch *)theMatch didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
{
if (match != theMatch) return;
MultiData=data;
MultiplayerID=playerID;
if(otherPlayerID==nil)
{
otherPlayerID=[playerID retain];
}
IPadCallAnyWhereF.match();
}
-(void)setDataRecieved:(BOOL)d
{
isDataRecieved=d;
}
-(BOOL)getDataRecieved
{
return isDataRecieved;
}
-(NSString*)getOtherPlayerId
{
return otherPlayerID;
}
-(void)setOtherPlayerId
{
otherPlayerID=nil;
}
- (void)match:(GKMatch *)theMatch player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state
{
if (match != theMatch) return;
switch (state)
{
case GKPlayerStateConnected:
NSLog(@"New Player connected!");
if (!matchStarted && theMatch.expectedPlayerCount == 0)
{
NSLog(@"&&&&&&&&&& Ready to start match in the match!");
[self lookupPlayers];
}
break;
case GKPlayerStateDisconnected:
NSLog(@"--------Player disconnected!--------");
matchStarted = NO;
UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"Game Center Alert" message:@"Player Disconnected" delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:@"Main Menu", nil];
[alert show];
[alert release];
AlertMessageBoxNo='B';
//IPadCallAnyWhereF.matchDisconnect();
break;
}
}
- (void)match:(GKMatch *)theMatch connectionWithPlayerFailed:(NSString *)playerID withError:(NSError *)error
{
if (match != theMatch) return;
NSLog(@"Failed to connect to player with error: %@", error.localizedDescription);
matchStarted = NO;
//IPadCallAnyWhereF.matchEnded();
UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"Game Center Alert" message:@"Failed to connect to player" delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:@"Main Menu", nil];
[alert show];
[alert release];
AlertMessageBoxNo='C';
}
- (void)match:(GKMatch *)theMatch didFailWithError:(NSError *)error
{
if (match != theMatch) return;
NSLog(@"Match failed with error: %@", error.localizedDescription);
matchStarted = NO;
//IPadCallAnyWhereF.matchEnded();
UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"Game Center Alert" message:@"Match failed" delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:@"Main Menu", nil];
[alert show];
[alert release];
AlertMessageBoxNo='D';
}
-(void)gameOver:(NSString*)message
{
UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"Game Center Alert" message:message delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:@"Main Menu", nil];
[alert show];
[alert release];
AlertMessageBoxNo='G';
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if([title isEqualToString:@"Try Again"])
{
IPadCallAnyWhereF.matchDisconnect();
}
else if([title isEqualToString:@"Main Menu"])
{
IPadCallAnyWhereF.gotoMainMenu();
}
}
例如
#进口
#进口
@接口GCHelper:NSObject
{
BOOL是用户认证的;
UIViewController*presentingViewController;
GKMatch*match;
布尔匹配开始;
GKIVITE*PendingVite;
NSArray*暂停玩家进入;
NSMutableDictionary*playersDict;
NSString*多层网格;
NSData*多数据;
NSString*其他玩家ID;
char AlertMessageBoxNo;
已收到布尔值;
}
//变数
@属性(分配,只读)BOOL gameCenterAvailable;
@属性(保留)UIViewController*presentingViewController;
@财产(保留)匹配*匹配;
@不动产(保留)不动产*PendingVite;
@不动产(保留)NSArray*PENDINGPLAYERS至INVITE;
@属性(保留)NSMutableDictionary*PlayerDict;
@属性(保留)NSString*多层网格;
@财产(保留)NSData*多数据;
-(NSString*)getOtherPlayerId;
-(无效)设置其他玩家ID;
//功能
+(GCHelper*)共享状态;
-(BOOL)iGameCenter可用;
-(作废)认证变更;
-(无效)认证本地用户;
-(void)gameOver:(NSString*)消息;
-(无效)已接收的设置数据:(BOOL)d;
-(BOOL)已收到的GetDataReceived;
-(void)FindMatch with minPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController*)viewController;
///////////
#导入“GCHelper.h”
#导入“IPadSharebleClass.h”
@实现GCHelper
@可使用的游戏中心;
@综合现有可视控制器;
@综合匹配;
@合成悬铃木;
@合成悬铃木;
@综合playersDict;
@综合多种数据;
@合成多层膜;
静态GCHelper*sharedHelper=nil;
+(GCHelper*)共享状态
{
如果(!sharedHelper)
{
sharedHelper=[[GCHelper alloc]init];
}
返回sharedHelper;
}
-(BOOL)iGameCenter可用
{
类gcClass=(NSClassFromString(@“GKLocalPlayer”);
NSString*reqSysVer=@“4.1”;
NSString*currSysVer=[[UIDevice currentDevice]systemVersion];
BOOL osVersionSupported=([currSysVer比较:reqSysVer选项:NSNumericSearch]!=传感器解除搜索);
返回(支持gcClass和OSVersions(&O));
}
-(id)init
{
if((self=[super init]))
{
gameCenterAvailable=[self-isGameCenterAvailable];
如果(游戏中心可用)
{
NSNotificationCenter*nc=
[NSNotificationCenter defaultCenter];
[nc addObserver:self]
选择器:@selector(authenticationChanged)
名称:GKPlayerAuthenticationDidChangeNotificationName
对象:无];
}
其他的
{
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@“游戏中心警报”消息:@“游戏中心不可用”代理:无取消按钮:@“确定”其他按钮:无,无];
[警报显示];
[警报发布];
}
}
回归自我;
}
-(无效)身份验证已更改
{
如果([GKLocalPlayer localPlayer].isAuthenticated&!isUserAuthenticated)
{
NSLog(@“身份验证已更改:玩家已验证”);
isUserAuthenticated=TRUE;
[GKMatchmaker sharedMatchmaker].inviteHandler=^(GKInvite*acceptedInvite,NSArray*PlayerToInvite)
{
NSLog(@“收到邀请”);
self.pendingVite=接受的Vite;
self.pendingPlayerToInvite=PlayerToInvite;
IPadCallAnyWhereF.inviteReceived();
};
}
如果(![GKLocalPlayer.isAuthenticated&&isUserAuthenticated),则为else
{
NSLog(@“身份验证已更改:播放器未经身份验证”);
isUserAuthenticated=FALSE;
}
}
-(无效)authenticateLocalUser
{
如果(!gameCenterAvailable)返回;
NSLog(@“正在验证本地用户…”);
if([GKLocalPlayer].authenticated==NO)
{
[[GKLocalPlayer]authenticateWithCompletionHandler:nil];
}
其他的
{
NSLog(@“已通过身份验证!”);
}
}
-(void)findMatchWithMinPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController*)viewController
{
如果(!gameCenterAvailable)返回;
匹配开始=否;
self.match=nil;
self.presentingViewController=视图控制器;
如果(待决许可!=无)
{
[presentingViewController解除ModalViewController激活:否];
GKMatchmakerViewController*mmvc=[[GKMatchmakerViewController alloc]initWithInvite:pendingvite]autorelease];
mmvc.matchmakerDelegate=self;
[presentingViewController presentModalViewController:mmvc动画:是];
self.pendingVite=零;
self.pendingPlayersToInvite=nil;
}
其他的
{
[presentingViewController解除ModalViewController激活:否];
GKMatchRequest*请求=[[[GKMatchRequest alloc]init]autorelease];
request.minPlayers=minPlayers;
request.maxPlayers=maxPlayers;
request.playersToInvite=挂起的playersToInvite;
GKMatchmakerViewController*mmvc=[[GKMatchmakerViewController alloc]initWithMatchRequest:request]autorelease];
mmvc.matchmakerDelegate=self;
[presentingViewController presentModalViewController:mmvc动画:是];
self.pendingVite=零;
self.pendingPlayersToInvite=nil;
}
}
#pragma标记GKmatchMakerViewController远程门
-(无效)MatchMakerViewController取消:(GKM)