- 注册时间
- 2013-5-7
- 最后登录
- 2017-8-30
- 阅读权限
- 200
- 积分
- 445
- 精华
- 0
- 帖子
- 124
|
应用中关于GameKit蓝牙实例讲解是本文要介绍的内容,主要是来了解并学习GameKit蓝牙实例。介绍一下这个实例实现的是两个带有蓝牙设备的touch之间的一个小游戏,在界面上有个可以响应事件的UIView(之前说过)可以点击,然后看谁新达到WINNING_TAP_COUNT (游戏中一常量可以自己设置)谁先达到谁就赢了,然后通知对方。还要引入GameKit.framework框架
头文件BlueToothViewController.h:
// // // BlueToothViewController.h // BlueTooth // // Created by mingchun liu on 09-11-24. // Copyright sdie 2009. All rights reserved. // #import <UIKit/UIKit.h> #import <GameKit/GameKit.h> #define START_GAME_KEY @"startgame" #define END_GAME_KEY @"endgame" #define TAP_COUNT_KEY @"taps" #define WINNING_TAP_COUNT 50 #define AMIPHD_P2P_SESSION_ID @"amiphdp2p2"//这个是蓝牙协议 @interface BlueToothViewController : UIViewController<GKPeerPickerControllerDelegate,GKSessionDelegate>{ BOOL actingAsHost;//是否提供服务,客户端还是服务器端 int playerTapCount;//记录玩家点击次数 int opponentTapCount;//对方点击次数 IBOutlet UILabel *playerTapCountLabel;//显示玩家点击次数 IBOutlet UILabel *opponentTapCountLabel;//显示对手点击次数 NSString *opponentID;//对方标识符 GKSession *gkSession; IBOutlet UILabel *startQuitButton;//开始退出按钮 } @property BOOL actingAsHost; @property int playerTapCount; @property int opponentTapCount; @property (nonatomic,retain) GKSession *gkSession; @property (nonatomic,retain) NSString *opponentID; @property (nonatomic,retain)UILabel *playerTapCountLabel; @property (nonatomic,retain)UILabel *opponentTapCountLabel; @property (nonatomic,retain)UILabel *startQuitButton; -(IBAction) handleStartQuitTapped;//处理开始退出操作 -(IBAction) handleTapViewTapped;//处理点击UIView的操作 -(void) updateTapCountLabels;//更新显示 -(void) initGame;//初始化游戏 -(void) hostGame; -(void) joinGame;//加入游戏 -(void) endGame;//结束游戏 -(void) showEndGameAlert;//弹出结束游戏对话框 @end #import "BlueToothViewController.h" @implementation BlueToothViewController @synthesize actingAsHost; @synthesize playerTapCount; @synthesize opponentID; @synthesize playerTapCountLabel; @synthesize opponentTapCountLabel; @synthesize startQuitButton; @synthesize gkSession; @synthesize opponentTapCount; -(IBAction) handleStartQuitTapped {//建立链接操作,弹出链接窗口显示在线 if (! opponentID) {//如果对手ID为空就建立服务端提供服务 actingAsHost = YES; GKPeerPickerController *peerPickerController =[[GKPeerPickerController alloc] init]; peerPickerController.delegate = self; peerPickerController.connectionTypesMask = GKPeerPickerConnectionTypeNearby; [peerPickerController show]; } } -(IBAction) handleTapViewTapped {//点击操作 playerTapCount++; [self updateTapCountLabels]; // did we just win? BOOL playerWins = playerTapCount >= WINNING_TAP_COUNT;//当点击达到一定次数时 // send tap count to peer NSMutableData *message = [[NSMutableData alloc] init];//传的数据类型为nsdata类型的 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:message]; [archiver encodeInt:playerTapCount forKey: TAP_COUNT_KEY]; if (playerWins) [archiver encodeBool:YES forKey:END_GAME_KEY]; [archiver finishEncoding];//打包传数据 GKSendDataMode sendMode = playerWins ? GKSendDataReliable : GKSendDataUnreliable;//判断用可靠的链接还是不可靠的链接 [gkSession sendDataToAllPeers: message withDataMode:sendMode error:NULL];//发送数据 [archiver release]; [message release]; // also end game locally if (playerWins) [self endGame]; } -(void) updateTapCountLabels { playerTapCountLabel.text = [NSString stringWithFormat"%d", playerTapCount]; opponentTapCountLabel.text = [NSString stringWithFormat"%d", opponentTapCount]; } -(void) initGame { playerTapCount = 0; opponentTapCount = 0; } -(void) hostGame { [self initGame]; NSMutableData *message = [[NSMutableData alloc] init]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:message]; [archiver encodeBool:YES forKey:START_GAME_KEY]; [archiver finishEncoding]; NSError *sendErr = nil; [gkSession sendDataToAllPeers: message withDataMode:GKSendDataReliable error:&sendErr]; if (sendErr) NSLog (@"send greeting failed: %@", sendErr); // change state of startQuitButton startQuitButton.text = @"Quit"; [message release]; [archiver release]; [self updateTapCountLabels]; } -(void) joinGame { [self initGame]; startQuitButton.text = @"Quit"; [self updateTapCountLabels]; } //一下是代理方法 -(GKSession *) peerPickerController: (GKPeerPickerController*) controller sessionForConnectionType: (GKPeerPickerConnectionType) type { if (!gkSession) {//如果没有链接时建立连接 gkSession = [[GKSession alloc] initWithSessionID:AMIPHD_P2P_SESSION_ID//根据此值判断用的是什么链接 displayName:nil//在线用户名 sessionMode:GKSessionModePeer]; gkSession.delegate = self; } return gkSession; } - (void)peerPickerControllerGKPeerPickerController *)picker didConnectPeerNSString *)peerID toSessionGKSession *)session {//当picker接收到数据后将其释放掉,否则进入不了界面 [picker dismiss]; picker.delegate = nil; [picker autorelease]; } - (void)sessionGKSession *)session didReceiveConnectionRequestFromPeerNSString *)peerID {//已接受连接请求的代理方法 actingAsHost = NO;//设为客户端 } - (void)sessionGKSession *)session peerNSString *)peerID didChangeStateGKPeerConnectionState)state {//状态改变时触发的代理方法 switch (state) { case GKPeerStateConnected: [session setDataReceiveHandler: self withContext: nil]; opponentID = peerID;//改变opponentID的值 actingAsHost ? [self hostGame] : [self joinGame];// break; } } - (void) receiveData: (NSData*) data fromPeer: (NSString*) peerID inSession: (GKSession*) session context: (void*) context {//接受数据时的代理操作 NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; if ([unarchiver containsValueForKey:TAP_COUNT_KEY]) { opponentTapCount = [unarchiver decodeIntForKey:TAP_COUNT_KEY]; [self updateTapCountLabels]; } if ([unarchiver containsValueForKey:END_GAME_KEY]) { [self endGame]; } if ([unarchiver containsValueForKey:START_GAME_KEY]) { [self joinGame]; } [unarchiver release]; } //以上是代理方法 -(void) showEndGameAlert { BOOL playerWins = playerTapCount > opponentTapCount; UIAlertView *endGameAlert = [[UIAlertView alloc] initWithTitle: playerWins ? @"Victory!" : @"Defeat!" message: playerWins ? @"Your thumbs have emerged supreme!": @"Your thumbs have been laid low" delegate:nil cancelButtonTitle"OK" otherButtonTitles:nil]; [endGameAlert show]; [endGameAlert release]; } -(void) endGame { opponentID = nil; startQuitButton.text = @"Find"; [gkSession disconnectFromAllPeers]; [self showEndGameAlert]; } /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibNameNSString *)nibNameOrNil bundleNSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ /* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; } */ /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { [opponentID release]; [playerTapCountLabel release]; [opponentTapCountLabel release]; [startQuitButton release]; [gkSession release]; [super dealloc]; - }
|
|
广州鼎瀛计算机科技有限公司为您提供UI设计,APP开发,小程序开发,微信公众号开发,网站开发等软件开发;
广州鼎瀛计算机科技有限公司|广州APP开发,APP开发公司,APP定制服务商,安卓/ios软件开发,APP软件开发,移动应用开发,手机软件开发微信二次开发外包公司,广州APP开发公司,企业APP开发,手机APP开发,APP制作,广州优质的APP开发公司;
|