zoukankan      html  css  js  c++  java
  • 学习GameKit

    http://www.cocoachina.com/bbs/read.php?tid=97953

    如何使用GameKit

    第一部分
    Peer-to-Peer的连接

    Session:会话iPhone通过Session互相发送数据读取数据
    Peer:每一部网络中的设备算一个节点

    第一节 发现其他的节点:
    会话要么把自己当成 服务器/客户端 中的一种,要么做一个节点即当服务器又当客户端

    1. 实现一个Server
    initWithSessionID:displayName:sessionMode:GKSessionModeServer|GKSessionModePeer
    服务器收到客户请求后,回调 session:didReceiveConnectionRequestFromPeer:
    委托类 接受请求
       acceptConnectionFromPeer:error:
    委托类 拒绝请求
       denyConnectionFromPeer:
    成功建立连接后:回调委托类函数:session:peer:didChangeState
    2. 连接到一个服务
    initWithSessionID:displayName:sessionMode: GKSessionModeClient|GKSessionModePeer
    发现可用的服务后,回调委托类函数:session:peer:didChangeState: 提供自己的PeerID
    发送请求:connectToPeer:withTimeout
    成功建立连接:回调:session:peer:didChangeState

    第二节 交换数据
    1. 发送:
    sendDataToAllPeers:withDataMode:error:
    sendData:toPeer:withDataMode:error
    2. 接受:
    receiveData:fromPeer:inSession:context:
    setDataReceivehandler:withContext:

    第三节
    断开节点:
    disconnectPeerFromAllPeers:
    回调:session:peer:didChangeState:
    第四节 清理:
    移除数据处理器并释放会话


    第二部分
    添加一个节点选择器

    1. 创建并初始化一个GKPeerPicerController
    picker = [[GKPeerPickerController alloc] init];
    2. 附加委托
    picker.delegate = self;
    3. 配置可选网络 ( 默认蓝牙 )
    picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby |
    GKPeerPickerConnectionTypeOnline;
    4. 若选择因特网连接,实现:
    - (void)peerPickerController:(GKPeerPickerController *)picker
       didSelectConnectionType:(GKPeerPickerConnectionType)type{
        if (type == GKPeerPickerConnectionTypeOnline) {
         picker.delegate = nil;
         [picker dismiss];
         [picker autorelease];
         //implement your own internet user inter face here
        }
    }
    5. 实现委托的节点选择器
    peerPickerController:(GKPeerPickerControlller *)picker
    sessionForConnectionType:(GKPeerPickerConnectionType)type
    {
    GKSession* session = [[GKSession alloc]] initWithSessionID:myExampleSessionID displayName:myName sessionMode:GKSessionModePeer] ;

    [session autorelease];
    }
    //在覆盖节点选择器的原有方法时实现此方法。
    6. 实现委托的peerPickerController:didConnectPeer:toSession:方法获得对配置好的session的所有权。
    - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:( NSString *)peerID toSession: (GKSession *)season{
    // 使用Retain过的属性拥有这个session
    self.gameSession = self;
    // 假设我们的对象同样是委托类
    session.delegate = self;
    [session setDataReceiveHandler: self withContext:nil];
    //除掉picker
    picker.delegate = nil;
    [picker dismiss];
    [picker autorelease];
    //开始你的游戏
    }
    7.实现取消连接的代理方法

    - (void) peerPickerControllerDidCancel:(GKPeerPickerController *)picker
    {
    picker.delegate = nil;
    //控制器自动取消对话界面
    [picker autorelease];
    }
    8. 显示对话
    [picker show];


    第三部分
    使用Sessions

    1. 实现 会话代理的方法:session:didChangeState:
    - (void) session:(GKSession *)session peer:(NSString *)peerID
    didChangeState:(GKPeerConnectionState)state
    {
       switch ( state)
       {
        case GKPeerStateConnecte:
       // 相关代码
        break;
        case GKPeerStateDisconnected:
       //相关代码
        break;
       }
    }
    2. 发送数据到其他Peer

    - (void) mySendDataToPeers: (NSData *)data
    {
       [session sendDataToAllPeers: data withDataMode: GKSendDataReliable error: nil];
    }
    3. 从其他节点接收数据
    - (void) receiveData:(NSData *)data fromPeer: (NSString *)peer inSession:
    (GKSession *)session context:(void *)context
    {
       //读取数据
    }
    4. 清除会话
    [session disconnectFromAllPeers];
    session.availabel = NO;
    [session setDataReceiveHandler: nil withContext: nil];
    session.delegate = nil;
    [session release];


    摘自:http://hi.baidu.com/b_a_d_b_u_k/blog/item/f326051152c85f75cb80c4d8.html


    iphone蓝牙通信GameKit框架

    GameKit框架中蓝牙传输主要用到的2个类
    GKPeerPickerController
    GKSession
    通过GKPeerPickerController 提供了UI界面picker,我们也可以自定义界面。
    如同其它的框架一般,APPLE提供了功能强大的代理。
    蓝牙传输需要使用的2个代理是:
    GKPeerPickerControllerDelegate
    GKSessionDelegate
    iPhone OS 3.0的最佳功能是GameKit框架,这个框架包括了允许基于蓝牙网络进行通信的API,你可以更轻松地创建点到点的游戏和应用程序。与其它移动平台不一样,在iPhone中使用蓝牙作为一个通信信道比预期的要容易得多,因此,本文将向你展示如何构建一个简单的应用程序,实现iPhone和iPod之间的相互通信。
      注意:如果要测试本文所介绍的内容,需要两部iPhone(3G或3GS),或使用iPhone OS 3.0或更高版本的iPod设备(二代或更新版本)。
      创建一个项目
       使用Xcode,创建一个新的基于视图的应用程序项目,取名为Bluetooth。访问蓝牙的各种API位于GameKit框架中,因此,你需要将这个 框架添加到刚刚创建的项目中,在Xcode的框架组上点右键,选择“添加”*“现有框架”,选择GameKit框架,
      在BluetoothViewController.h文件中,声明下面的对象,outlet和行为:


    #import
    #import
    @interface BluetoothViewController : UIViewController

    {
    GKSession *currentSession;
    IBOutlet UITextField *txtMessage;
    IBOutlet UIButton *connect;
    IBOutlet UIButton *disconnect;
    }
    @property(nonatomic, retain) GKSession *currentSession;
    @property(nonatomic, retain) UITextField *txtMessage;
    @property(nonatomic, retain) UIButton *connect;
    @property(nonatomic, retain) UIButton *disconnect;
    -(IBAction) btnSend:(id) sender;
    -(IBAction) btnConnect:(id) sender;
    -(IBAction) btnDisconnect:(id) sender;
    @end


      GKSession对象用于表现两个蓝牙设备之间连接的一个会话,你也可以使用它在两个设备之间发送和接收数据。
      在BluetoothViewController.m文件中,添加下面的代码:

    #import "BluetoothViewController.h"2 3 #import
    @implementation BluetoothViewController
    @synthesize currentSession;
    @synthesize txtMessage;
    @synthesize connect;
    @synthesize disconnect;
     


      双击BluetoothViewController.xib在Interface Builder中编辑它,在视图窗口中添加以下视图,如图2所示。
      文本区域(Text Field)
      圆形按钮(Round Rect Button)


      图 2在视图窗口中填充文本区域和圆形按钮视图
      连接outlets 和 actions


      图 3 验证所有连接是否正常
      返回Xcode,在BluetoothViewController.m文件中,添加以下代码:


    -(void)viewDidLoad

    {
    [connect setHidden:NO];
    [disconnect setHidden:YES];
    [super viewDidLoad];
    }
    -(void)dealloc {
    [txtMessage release];
    [currentSession release];
    [super dealloc];
    }
     


      搜索对等设备
      现在所有准备工作已经就绪,接下来介绍一下访问其它蓝牙设备的API。
      在BluetoothViewController.h文件中,声明一个GKPeerPickerController对象:

    #import "BluetoothViewController.h"2 3 #import
    @implementation BluetoothViewController
    @synthesize currentSession;
    @synthesize txtMessage;
    @synthesize connect;
    @synthesize disconnect;
    GKPeerPickerController *picker;
     


    GKPeerPickerController类提供了一个标准的UI让你的应用程序发现并连接到其它蓝牙设备,连接方法并不难,首先实现一个btnConnect:类:


    -(IBAction) btnConnect:(id) sender 

    {
    picker =[[GKPeerPickerController alloc] init];
    picker.delegate =self;
    picker.connectionTypesMask =GKPeerPickerConnectionTypeNearby;
    [connect setHidden:YES];
    [disconnect setHidden:NO];
    [picker show];
    }
     


       connectionTypesMask属性指出用户可以选择的连接类型,包括两种类 型:GKPeerPickerConnectionTypeNearby和GKPeerPickerConnectionTypeOnline。对于蓝牙 通信,使用GKPeerPickerConnectionTypeNearby常量,GKPeerPickerConnectionTypeOnline 常量表示基

    检测到远程蓝牙设备,用户选择并连接到其中一个蓝牙设备时,调用peerPickerController:didConnectPeer:toSession:方法,这个方法的下:


    -(void)peerPickerController:(GKPeerPickerController *)picker
    didConnectPeer:(NSString *)peerID
    toSession:(GKSession *) session {
    self.currentSession =session;
    session.delegate =self;
    [session setDataReceiveHandler:self withContext:nil];
    picker.delegate =nil;
    [picker dismiss];
    [picker autorelease];
    }
     


      当用户已经连接到对等蓝牙设备后,可以将GKSession对象保存到currentSession属性中,这样你可以使用GKSession对象与远程设备通信。
      如果用户取消了蓝牙选择器,调用peerPickerControllerDidCancel:方法,其定义如下:


    -(void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
    {
    picker.delegate =nil;
    [picker autorelease];
    [connect setHidden:NO];
    [disconnect setHidden:YES];
    }
     


      如果要从一个设备断开连接,使用来自GKSession对象的disconnectFromAllPeers方法,btnDisconnect:方法的实现如下:

    -(IBAction) btnDisconnect:(id) sender
    {
    [self.currentSession disconnectFromAllPeers];
    [self.currentSession release];
    currentSession =nil;
    [connect setHidden:NO];
    [disconnect setHidden:YES];
    }
     


     
     连接设备或断开连接时,调用session:peer:didChangeState:方法,其实现如下:
    -(void)session:(GKSession *)session
    peer:(NSString *)peerID
    didChangeState:(GKPeerConnectionState)state

    {
    switch (state)
     {
    caseGKPeerStateConnected:
    NSLog(@"connected");
    break;
    caseGKPeerStateDisconnected:
    NSLog(@"disconnected");
    [self.currentSession release];
    currentSession =nil;
    [connect setHidden:NO];
    [disconnect setHidden:YES];
    break;
    }
    }
     


      处理这个事件你将知道连接是什么时候建立的,或断开是什么时候发生的。例如,当建立一个连接时,你可能想要立即向对方发送数据。
      发送数据
       为了向连接的蓝牙设备发送数据,需要使用到GKSession对象的sendDataToAllPeers:方法,你发送的数据是通过NSData对象 传输的,因此你可以自定义你的应用程序协议和发送的数据类型(如二进制数据),mySendDataToPeers:方法的定义如下:
    -(void) mySendDataToPeers:(NSData *) data
    {
    if(currentSession)
    [self.currentSession sendDataToAllPeers:data
    withDataMode:GKSendDataReliable
    error:nil];
    }
    再定义btnSend:方法,以便用户输入的数据能够发送到远程设备:
    -(IBAction) btnSend:(id) sender
    {
    //---convert an NSString objecttoNSData---22 23 NSData*data;
    NSString *str =[NSString stringWithString:txtMessage.text];
    data =[str dataUsingEncoding: NSASCIIStringEncoding];
    [self mySendDataToPeers:data];
    }
     


      接收数据
      当设备接收到数据时,调用receiveData:fromPeer:inSession:context:方法,其实现如下:
    -(void) receiveData:(NSData *)data
    fromPeer:(NSString *)peer
    inSession:(GKSession *)session
    context:(void *)context {
    //---convert the NSData toNSString---10 11 NSString*str;
    str =[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    UIAlertView *alert =[[UIAlertView alloc] initWithTitle:@"Data received"16 17 message:str
    delegate:self
    cancelButtonTitle:@"OK"22 23 otherButtonTitles:nil];
    [alert show];
    [alert release];
    }
     


      这里接收到的数据是NSData格式,为了使用UIAlertView类显示它,你需要将其转换为NSString对象。

    测试应用程序
      就是这么简单!现在可以开始测试了,在Xcode中按下Command-R,将程序部署到iPhone/iPod上,本文假设你有两部iPhone或两部iPod,为了运行刚刚创建的程序,这两台设备上都需要运行iPhone OS 3.0。
      部署好程序后,在两台设备上启动好程序,在任一设备上点击连接按钮,GKPeerPickerController将会显示标准的UI发现其它设备,如图4所示。

    图 4 GKPeerPickerController查找其它设备
    等待一会儿后,两边的程序应该都能够发现对方,如图5所示,当你在发现的设备名称上轻轻点击,程序就会开始连接。

      图 5 显示发现的设备名称
      注意:如果你在iPhone模拟器上测试这个程序,应该会检测到两个设备,但却无法连接到任何设备。
      当其它设备试图连接到你的设备时,你将会看到如图6所示的弹出提示,点击“接受”允许其连接,点击“拒绝”拒绝其连接。

      图 6 其它设备试图连接到你时的提示
      如果成功与你建立了连接,你就可以输入一些文本信息发给对方了,从其它设备接收到数据将会以一个警告视图显示,如图7所示。

    图 7 接收到其它设备发来的数据


    摘自http://blog.163.com/kongshuai1234@126/blog/static/110366995201062683438307/

    ANE与GameKit:http://www.adobe.com/cn/devnet/games/articles/ane_and_gamekit1_cn.html


    学习GameKit,小收集下学习资料……,谢谢原作者们~~

    [ 此帖被love在2012-03-28 00:59重新编辑 ]
  • 相关阅读:
    选择排序
    unity面试准备
    标识位
    table.insert(tableName, v)
    使用bmfont制作字体
    长按tools Icon 弹出Tips音效
    钓鱼功能
    jQuery鼠标移到小图显示大图效果
    ThinkPHP3.2.3中如何显示二级栏目
    ThinkPHP3.2.2自定义success及error跳转页面
  • 原文地址:https://www.cnblogs.com/ligun123/p/2426860.html
Copyright © 2011-2022 走看看