zoukankan      html  css  js  c++  java
  • [ios2]蓝牙通信【转】

    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. playerTapCount = 0;  opponentTapCount = 0;  
    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蓝牙实例讲解的内容介绍完 ,希望通过本文的学习能对你有所帮助!

  • 相关阅读:
    poj 1860 Currency Exchange(最短路径的应用)
    poj 2965 The Pilots Brothers' refrigerator
    zoj 1827 the game of 31 (有限制的博弈论)
    poj 3295 Tautology (构造法)
    poj 1753 Flip Game(枚举)
    poj 2109 (贪心)
    poj 1328(贪心)
    Qt 对单个控件美化
    Qt 4基础
    Bash Shell
  • 原文地址:https://www.cnblogs.com/jinjiantong/p/3141389.html
Copyright © 2011-2022 走看看