Cocos2d x 如何在CoCoS2DX中制作在线2人游戏?

Cocos2d x 如何在CoCoS2DX中制作在线2人游戏?,cocos2d-x,multiplayer,Cocos2d X,Multiplayer,我制作了一个像Megaman这样的平台游戏,希望人们能够相互联系,一起玩。它必须在Android和Iphone上工作。 我使用cocos2dx,因此很难找到不使用不推荐或删除的方法/对象的好信息 什么是一个简单的方法,并获得足够的fps,使它看起来很好 编辑:人们投票否决这个问题太糟糕了,因为我真的不知道如何更好地指定它。我不知道该怎么开始。谢谢你投票否决了这些家伙S借助苹果游戏中心,您可以尽早实现多人游戏。 with help of apple game center you can impl

我制作了一个像Megaman这样的平台游戏,希望人们能够相互联系,一起玩。它必须在Android和Iphone上工作。 我使用cocos2dx,因此很难找到不使用不推荐或删除的方法/对象的好信息

什么是一个简单的方法,并获得足够的fps,使它看起来很好

编辑:人们投票否决这个问题太糟糕了,因为我真的不知道如何更好地指定它。我不知道该怎么开始。谢谢你投票否决了这些家伙S

借助苹果游戏中心,您可以尽早实现多人游戏。
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)