iPhone开发应用中关于GameKit蓝牙实例讲解是本文要介绍的内容,主要是来了解并学习GameKit蓝牙实例。介绍一下这个实例实现的是两个带有蓝牙设备的touch之间的一个小游戏,在界面上有个可以响应事件的UIView(之前说过)可以点击,然后看谁新达到WINNING_TAP_COUNT (游戏中一常量可以自己设置)谁先达到谁就赢了,然后通知对方。还要引入GameKit.framework框架
头文件BlueToothViewController.h:
[pre]

    //

  1. //  // BlueToothViewController.h
  2. // BlueTooth  //
  3. // Created by mingchun liu on 09-11-24.  // Copyright sdie 2009. All rights reserved.
  4. //
  5. #import <UIKit/UIKit.h> #import
    <GameKit/GameKit.h>
  6. #define START_GAME_KEY @"startgame"
  7. #define END_GAME_KEY @"endgame"  #define TAP_COUNT_KEY @"taps"
  8. #define WINNING_TAP_COUNT 50
  9. #define AMIPHD_P2P_SESSION_ID @"amiphdp2p2"//这个是蓝牙协议
  10. @interface BlueToothViewController : UIViewController<GKPeerPickerControllerDelegate,GKSessionDelegate>{          BOOL actingAsHost;//是否提供服务,客户端还是服务器端
  11. int playerTapCount;//记录玩家点击次数          int opponentTapCount;//对方点击次数
  12. IBOutlet UILabel *playerTapCountLabel;//显示玩家点击次数          IBOutlet UILabel *opponentTapCountLabel;//显示对手点击次数
  13. NSString *opponentID;//对方标识符          GKSession *gkSession;
  14. IBOutlet UILabel *startQuitButton;//开始退出按钮
  15. }
  16. @property BOOL actingAsHost;  @property int playerTapCount;
  17. @property int opponentTapCount;  @property (nonatomic,retain) GKSession *gkSession;
  18. @property (nonatomic,retain) NSString *opponentID;
  19. @property (nonatomic,retain)UILabel *playerTapCountLabel;
  20. @property (nonatomic,retain)UILabel *opponentTapCountLabel;
  21. @property (nonatomic,retain)UILabel *startQuitButton;
  22. -(IBAction) handleStartQuitTapped;//处理开始退出操作  -(IBAction) handleTapViewTapped;//处理点击UIView的操作
  23. -(void) updateTapCountLabels;//更新显示  -(void) initGame;//初始化游戏
  24. -(void) hostGame;  -(void) joinGame;//加入游戏
  25. -(void) endGame;//结束游戏  -(void) showEndGameAlert;//弹出结束游戏对话框
  26. @end
  27. #import "BlueToothViewController.h"
  28. @implementation BlueToothViewController
  29. @synthesize actingAsHost;  @synthesize playerTapCount;
  30. @synthesize opponentID;  @synthesize playerTapCountLabel;
  31. @synthesize opponentTapCountLabel;
  32. @synthesize startQuitButton;  @synthesize gkSession;
  33. @synthesize opponentTapCount;
  34. -(IBAction) handleStartQuitTapped {//建立链接操作,弹出链接窗口显示在线          if (! opponentID) {//如果对手ID为空就建立服务端提供服务
  35. actingAsHost =
    YES;                  GKPeerPickerController *peerPickerController =[[GKPeerPickerController alloc] init];
  36. peerPickerController.delegate =
    self;  peerPickerController.connectionTypesMask =
  37. GKPeerPickerConnectionTypeNearby;                  [peerPickerController show];
  38. }  }
  39. -(IBAction) handleTapViewTapped {//点击操作          playerTapCount++;
  40. [self updateTapCountLabels];          // did we just win?
  41. BOOL playerWins =
    playerTapCount >= WINNING_TAP_COUNT;//当点击达到一定次数时          // send tap count to peer
  42. NSMutableData *message = [[NSMutableData alloc] init];//传的数据类型为nsdata类型的          NSKeyedArchiver *archiver =
  43. [[NSKeyedArchiver
    alloc] initForWritingWithMutableData:message];          [archiver
    encodeInt:playerTapCount forKey: TAP_COUNT_KEY];
  44. if (playerWins)                  [archiver encodeBool:YES forKey:END_GAME_KEY];
  45. [archiver finishEncoding];//打包传数据          GKSendDataMode
    sendMode =
  46. playerWins
    ? GKSendDataReliable :
    GKSendDataUnreliable;//判断用可靠的链接还是不可靠的链接          [gkSession
    sendDataToAllPeers: message withDataMode:sendMode error:NULL];//发送数据
  47. [archiver release];          [message release];
  48. // also end game locally          if (playerWins)
  49. [self endGame];  }
  50. -(void) updateTapCountLabels {
  51. playerTapCountLabel.text =          [NSString stringWithFormat:@"%d", playerTapCount];
  52. opponentTapCountLabel.text =          [NSString stringWithFormat:@"%d", opponentTapCount];
  53. }  -(void) initGame {
  54. ;  ;
  55. }  -(void) hostGame {
  56. [self initGame];          NSMutableData *message = [[NSMutableData alloc] init];
  57. NSKeyedArchiver *archiver
    = [[NSKeyedArchiver
    alloc]                                                                  
    initForWritingWithMutableData:message];
  58. [archiver encodeBool:YES forKey:START_GAME_KEY];          [archiver finishEncoding];
  59. NSError *sendErr =
    nil;          [gkSession sendDataToAllPeers: message
  60. withDataMode:GKSendDataReliable error:&sendErr];          if (sendErr)
  61. NSLog (@"send greeting failed: %@", sendErr);          // change state of startQuitButton
  62. startQuitButton.text = @"Quit";          [message release];
  63. [archiver release];          [self updateTapCountLabels];
  64. }  -(void) joinGame {
  65. [self initGame];  startQuitButton.text = @"Quit";
  66. [self updateTapCountLabels];  }
  67. //一下是代理方法
  68. -(GKSession *) peerPickerController: (GKPeerPickerController*) controller
  69. sessionForConnectionType: (GKPeerPickerConnectionType) type {          if (!gkSession) {//如果没有链接时建立连接
  70. gkSession = [[GKSession alloc]                                           initWithSessionID:AMIPHD_P2P_SESSION_ID//根据此值判断用的是什么链接
  71. displayName:nil//在线用户名                                          
    sessionMode:GKSessionModePeer];
  72. gkSession.delegate =
    self;          }
  73. return gkSession;  }
  74. - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
  75. {//当picker接收到数据后将其释放掉,否则进入不了界面          [picker dismiss];
  76. picker.delegate =
    nil;          [picker autorelease];
  77. }  - (void)session:(GKSession *)session
  78. didReceiveConnectionRequestFromPeer:(NSString *)peerID {//已接受连接请求的代理方法  actingAsHost =
    NO;//设为客户端
  79. }
  80. - (void)session:(GKSession *)session peer:(NSString *)peerID  didChangeState:(GKPeerConnectionState)state {//状态改变时触发的代理方法
  81. switch (state)          {
  82. case GKPeerStateConnected:                          [session setDataReceiveHandler: self withContext: nil];
  83. opponentID = peerID;//改变opponentID的值                          actingAsHost ? [self hostGame] : [self joinGame];//
  84. break;          }
  85. }
  86. -
    (void) receiveData: (NSData*) data fromPeer: (NSString*)
    peerID                     inSession: (GKSession*) session context:
    (void*) context {//接受数据时的代理操作
  87. NSKeyedUnarchiver *unarchiver =          [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
  88. if ([unarchiver containsValueForKey:TAP_COUNT_KEY]) {  opponentTapCount = [unarchiver decodeIntForKey:TAP_COUNT_KEY];
  89. [self updateTapCountLabels];          }
  90. if ([unarchiver containsValueForKey:END_GAME_KEY]) {                  [self endGame];
  91. }          if ([unarchiver containsValueForKey:START_GAME_KEY]) {
  92. [self joinGame];          }
  93. [unarchiver release];  }
  94. //以上是代理方法
  95. -(void) showEndGameAlert {          BOOL playerWins =
    playerTapCount> opponentTapCount;
  96. UIAlertView *endGameAlert
    = [[UIAlertView
    alloc]                                                                  
    initWithTitle: playerWins ? @"Victory!" : @"Defeat!"
  97. message: playerWins ? @"Your thumbs have emerged
    supreme!":                                                                  
    @"Your thumbs have been laid low"
  98. delegate:nil                                                                  
    cancelButtonTitle:@"OK"
  99. otherButtonTitles:nil];          [endGameAlert show];
  100. [endGameAlert release];  }
  101. -(void) endGame {  opponentID =
    nil;
  102. startQuitButton.text = @"Find";          [gkSession disconnectFromAllPeers];
  103. [self showEndGameAlert];  }
  104. /*
  105. // The designated initializer. Override to perform setup
    that is required before the view is loaded.  -
    (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle
    *)nibBundleOrNil {
  106. if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {          // Custom initialization
  107. }      return self;
  108. }  */
  109. /*
  110. // Implement loadView to create a view hierarchy programmatically, without using a nib.  - (void)loadView {
  111. }  */
  112. /*
  113. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  - (void)viewDidLoad {
  114. [super viewDidLoad];  }
  115. */
  116. /*  // Override to allow orientations other than the default portrait orientation.
  117. -

    (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {      // Return YES for supported orientations

  118. return (interfaceOrientation == UIInterfaceOrientationPortrait);  }
  119. */
  120. - (void)didReceiveMemoryWarning {          // Releases the view if it doesn't have a superview.
  121. [super didReceiveMemoryWarning];
  122. // Release any cached data, images, etc that aren't in use.  }
  123. - (void)viewDidUnload {
  124. // Release any retained subviews of the main view.          // e.g.
    self.myOutlet = nil;
  125. }
  126. - (void)dealloc {          [opponentID release];
  127. [playerTapCountLabel release];          [opponentTapCountLabel release];
  128. [startQuitButton release];          [gkSession release];
  129. [super dealloc];  }

[/pre]小结:iPhone开发GameKit蓝牙实例讲解的内容介绍完 ,希望通过本文的学习能对你有所帮助!

[ios2]蓝牙通信【转】的更多相关文章

  1. Android学习笔记之蓝牙通信...

    PS:最近同学问我蓝牙的事,因此自己也就脑补了一下蓝牙... 学习内容: 1.如何实现蓝牙通信技术...   蓝牙通信其实是手机里很常用的一种通信方式,现在的手机中是必然存在蓝牙的,蓝牙通信也是有一部 ...

  2. BLE蓝牙通信指令交互过程配对与绑定

    最简单一次蓝牙通信需要以上相关步骤,包括discovery device,connect,pairing,bond等4个主要部分.BLE中主从机建立连接,到配对和绑定的过程如下图:

  3. Android -传统蓝牙通信聊天

    概述 Android 传统蓝牙的使用,包括开关蓝牙.搜索设备.蓝牙连接.通信等. 详细 代码下载:http://www.demodashi.com/demo/10676.html 原文地址: Andr ...

  4. Android BLE设备蓝牙通信框架BluetoothKit

    BluetoothKit是一款功能强大的Android蓝牙通信框架,支持低功耗蓝牙设备的连接通信.蓝牙广播扫描及Beacon解析. 关于该项目的详细文档请关注:https://github.com/d ...

  5. Android - 传统蓝牙通信聊天

    Android -传统蓝牙通信聊天 技术:java+Android4.4+jdk1.8 运行环境:Android4.4.Android7.0 概述 Android 传统蓝牙的使用,包括开关蓝牙.搜索设 ...

  6. Android 串口蓝牙通信开发Java版本

    Android串口BLE蓝牙通信Java版 0. 导语 Qt on Android 蓝牙通信开发 我们都知道,在物联网中,BLE蓝牙是通信设备的关键设备.在传统的物联网应用中,无线WIFI.蓝牙和Zi ...

  7. PC蓝牙通信C#代码实现

    PC蓝牙通信C#代码实现 这篇文章主要为大家详细介绍了PC蓝牙通信C#代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了C#实现PC蓝牙通信代码,供大家参考,具体内容如下 ...

  8. Android蓝牙通信总结

    这篇文章要达到的目标: 1.介绍在Android系统上实现蓝牙通信的过程中涉及到的概念. 2.在android系统上实现蓝牙通信的步骤. 3.在代码实现上的考虑. 4.例子代码实现(手持设备和蓝牙串口 ...

  9. Qt on Android 蓝牙通信开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

随机推荐

  1. Android Intent 三解决

    Intent的接收处理: 1.Receiver报名 这之前已经被引入 然后看看剩下的两个接收功能上面. scheduleReceiver scheduleRegisteredReceiver: sch ...

  2. Best JavaScript Tools for Developers

    JavaScript solves multiple purposes; it helps you to create interactive websites, web applications, ...

  3. hdu 1059 Dividing 多重背包

    点击打开链接链接 Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. 必须掌握的JavaScript基本知识

    作为一个前端工作者,应该了解一些javascript的发展历史,javascript实现及版本等.基本概念包括语法.关键字.变量.数据类型.操作符.语句控制及函数等,它们和我们学习的其它语言C/C++ ...

  5. leetcode[91] Subsets II

    给定一个数组,返回所有的非重复的可能.例如给定 If S = [1,2,2], a solution is: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 其实这题类 ...

  6. 基于AngularJS的前端云组件最佳实践

    AngularJS是google设计和开发的一套前端开发框架,他能帮助开发人员更便捷地进行前端开发.AngularJS是为了克服HTML在构建应用上的不足而设计的,它非常全面且简单易学习,因此Angu ...

  7. [转]C# and the using Statement in 3 seconds and a bug in Reflector

    Using() Statement in 3 seconds and a bug in Reflector The boring, known accross the board definition ...

  8. Ubuntu开启NFS,挂载根目录

    1.安装NFS server Ubuntu初始状态是没有NFS server的,首先要安装NFS server: $ sudo apt-get install nfs-kernel-server (安 ...

  9. 松瀚SN8P2711 2722 ADC初始化程序及应用--汇编源码

    /* 松瀚 SN8P2711 2722 ADC初始化程序 及应用实例 */ INIT_ADC: MOV A, #0XB2 // 启动ADC电路 使能AIN通道 B0MOV ADM, A MOV A,# ...

  10. 代码阅读软件kscope源码安装指导

    安装 kscope-1.6.2 1. ./configure --without-arts --prefix=/soft/kscope-1.6.2  (I customize the installi ...