Airplay 教程: 一个 Apple TV 多人竞答游戏(4)

现在,客户端需要根据服务器发来的命令进行动作。

在方法 receiveData:fromPeer:inSession:context:末尾加入代码:


if ([commandReceived hasPrefix:kCommandQuestion] && !self.isServer)   {

NSString *answersString = [commandReceived substringFromIndex:kCommandQuestion.length];

[self.scene startQuestionWithAnswerCount:[answersString integerValue]];

}

假设永远不会出现9个以上的答案,则最后一个字符就是答案的数目。answersString保存这个字符,你可以将它转换成数字,然后向 startQuestionWithAnswerCount:方法传递这个数值,这样屏幕会显示相同数目的答案按钮。

编译运行项目,先在模拟器上运行,再在真机上运行。当“Start Game”按钮出现时,轻触该按钮。你将看到如下界面:

在真机上,显示了和模拟器一样的内容。根据试题的内容,可能显示的按钮数目也会不同。在模拟器或真机上点击某个按钮,屏幕将显示为如下界面:

除此之外,程序不会有其他反应。因为当你点击选项按钮后, ATMyScene中的逻辑只包含了删除按钮并调用ATViewController方法——但实际上这个方法还是空实现。

打开 ATViewController.m,找到sendAnswer: 方法,加入以下代码:


[self sendToAllPeers:[kCommandAnswer stringByAppendingString:     [NSString stringWithFormat:@"%ld", (long)answer]]];

代码很简单,发送 “answer”命令及用户选定的答案(索引)。

服务器通过 receiveData:fromPeer:inSession:context:来接收信息。

在这个方法末尾加入:


if ([commandReceived hasPrefix:kCommandAnswer] && self.isServer)

{

NSString *answerString = [commandReceived substringFromIndex:kCommandAnswer.length];

NSInteger answer = [answerString integerValue];

if (answer == self.currentQuestionAnswer && self.currentQuestionAnswer >= 0)     {

self.currentQuestionAnswer = -1;

NSInteger points = 1 + [self.peersToPoints[peer] integerValue];

if (points > self.maxPoints)       {

self.maxPoints = points;

}

self.peersToPoints[peer] = @(points);

[self endQuestion:peer];

}

else if (++self.currentQuestionAnswersReceived == self.peersToNames.count)     {

[self endQuestion:nil];

}

}

先判断收到的信息是否是 “answer”命令。如果是并且答案与正确答案系统,将currentQuestionAnswer重置为-1以便下次出题。然后为玩家加分,同时更新当前的最高分记录。最后,调用 endQuestion 方法。

如果答案不正确,并且已经收到的答案与玩家数目一致,则当前提问结束,以nil 为参数调用 endQuestion 方法。

接下来实现 endQuestion:方法。

在 receiveData:fromPeer:inSession:context:方法下面添加方法:


- (void)endQuestion:(NSString *)winnerPeerID {

[self sendToAllPeers:kCommandEndQuestion];

NSMutableDictionary *namesToPoints = [[NSMutableDictionary alloc] initWithCapacity:self.peersToNames.count];

for (NSString *peerID in self.peersToNames)   {

namesToPoints[self.peersToNames[peerID]] = self.peersToPoints[peerID];

}

[self.mirroredScene endQuestionWithPoints:namesToPoints                                      winner:winnerPeerID ? self.peersToNames[winnerPeerID] : nil];

[self.scene endQuestion];

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 4 * NSEC_PER_SEC);

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

[self startQuestion];

});

}

这个方法先发送消息给客户端,让其结束当前提问;这个待会再讲。然后,创建一个dictionary,用于存储每个玩家和对应的得分并发送给第二显示器,以便显示那个玩家答对题以及当前得分情况。

最后,延迟4秒钟后运行语句块,调用 startQuestion 开下次出题。

客户端需要对 end question 命令进行处理。

在 receiveData:fromPeer:inSession:context:方法末尾加入代码:


if ([commandReceived isEqualToString:kCommandEndQuestion] && !self.isServer)   {

[self.scene endQuestion];

}

客户端一旦收到该命令,就会调用 endQuestion 方法,该方法结束本轮提问并隐藏答案按钮。

编译运行程序,先模拟器,后真机。开始游戏,随便回答一些问题。如果答案不正确,你需要等真机和模拟器都答题之后才能开始下一题。

现在看可以看到类似如下的屏幕:

如果模拟器长时间运行,你可能会遇到程序崩溃的情况。这是因为代码并没有处理试题已经问完(即游戏结束)的情况。这是最后一块工作了!

在 startQuestion 方法头部加入以下代码:


if (self.questions.count == 0)   {

NSMutableString *winner = [[NSMutableString alloc] init];

for (NSString *peerID in self.peersToPoints)     {

NSInteger points = [self.peersToPoints[peerID] integerValue];

if (points == self.maxPoints)       {

if (winner.length) {

[winner appendFormat:@", %@", self.peersToNames[peerID]];

} else {

[winner appendString:self.peersToNames[peerID]];

}

}

}

[self.mirroredScene setGameOver:winner];

return;

}

如果你答案是有题目,该方法会生成赢家的名字(一个或多个赢家)——然后显示在第二显示器上。

编译运行程序,当你玩完整个游戏,你会看到如下界面:

怎么样,你的 CS 测试是否及格?

接下来做什么?

恭喜你——你刚才用 Game Kit 编写了一个使用了外接显示器的多玩家的客户端/服务端游戏!最终完成的项目在此处下载

现在,你已经具备了使用 GameKit 编写客户/服务器游戏的基础,也知道如何使用扩展屏幕,对于某些游戏来说,这样的好处是不言而喻的。你可以用第二屏幕作为游戏视图,而将设备作为控制终端,或者在设备上显示一些附加信息,就好比HUD(平视显示器)一样。

GameKit 的 P2P 通信为多玩家游戏或 app 打开了一扇大门,你可以看到,通过利用苹果提供的APIs 实现多人控制是如何的用容易。但在 iOS7 中,GKSession 已被 Multipeer Connectivity 框架替代。这两个框架很像,你的GKSession 知识将很平滑地过度到新的 MCSession 及其相关的类上。

希望你喜欢本教程。用 AirPlay 和 GameKit p2p 开发出你想要的东西吧!

如果你有任何问题和建议,请在下面给我留言。

Airplay 教程: 一个 Apple TV 多人竞答游戏(4)

时间: 2024-10-12 16:44:47

Airplay 教程: 一个 Apple TV 多人竞答游戏(4)的相关文章

Airplay 教程: 一个 Apple TV 多人竞答游戏(1)

原文http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2F1iRy7Gq&via=rwenderlich&text=AirplayTutorial%3A An Apple TV Multiplayer QuizGame&related=gpambrozio&lang=en&count=horizontal&counturl=http%3A%2F%2Fwww.raywenderlich.com%2F57161%2

Airplay 教程: 一个 Apple TV 多人竞答游戏(3)

一旦设备接受了连接请求,对端立即会收到一个状态为GKPeerStateConnected 的Session 状态改变通知,然后这个设备会加到玩家列表中. 要测试这个 app,你需要运行两个 app 的拷贝:一个是服务器,一个是客户端.最简单的办法是用模拟器作为服务器,而用一台物理设备作为客户端. 如果你没有开发者账号,你将无法在真机上进行调试,这样你可能想在同一个机器上运行两个模拟器.这不是不可以,但就不是那么简单了.如果你想这样做,请参考 stack overflow 上的这个方法. 在模拟器

Airplay 教程: 一个 Apple TV 多人竞答游戏(2)

这个方法并未完成,仍然还要加入代码. 将下列代码加到上述代码之后: // Setup window in external screen self.mirroredWindow = [[UIWindow alloc] initWithFrame:self.mirroredScreen.bounds]; self.mirroredWindow.hidden = NO; self.mirroredWindow.layer.contentsGravity = kCAGravityResizeAspec

IC知识竞答,对10题赢10万奖金,谁是半导体界的最强大脑?

欢迎来到『摩尔英雄』大会,知识来挑战,智慧值千金,对,我们就是来撒钱的! 1『摩尔英雄』是什么?摩尔英雄是摩尔精英旗下摩尔直播APP中全新推出的针对半导体人的知识类公平竞答游戏节目,你只需动动手指,选选答案,通过参与答题,就可以赢走现金大奖. 2 参与方式用户下载『摩尔直播』APP,登录即可参与答题.每天中午12:30,『摩尔英雄』大会开始,答对10道题,即可平分奖金,奖金可以直接提现到你的微信账户. 3 关于竞答题目『摩尔英雄』大会的所有竞答题目都只与半导体相关,涉及有关半导体的历史.技术.新

苹果将通过新Apple TV打造电视游戏平台 欲发力家庭游戏(转)

据<纽约时报>报道,9月10日凌晨1时举行的苹果发布会上将会公布新版Apple TV设备,还会推出TV版App Store.新设备以游戏作为主要卖点,图形性能将大幅提升. 苹果2015年秋季发布会即将在北京时间9月10日凌晨1时举行,除了一年一更新的iPhone之外,今年还传出了苹果将会更新Apple TV产品线的消息:得到久违升级的Apple TV将不再只是一个观看视频的机顶盒,还将在电视游戏上发力. 据<纽约时报>报道,接近新Apple TV项目的线人纷纷表示,用iPhone和

其实苹果已配备手柄 若Apple TV成为主机

自苹果宣布iOS 7撑持手柄认证之后,外设厂商纷繁出动推出自个的试水产品.到现在为止咱们看到了MOGA.罗技.雷蛇以及赛睿等iOS 7手柄.信任绝大多数玩家都以为这些手柄只是为iPhone.iPad又或者是iPod touch打造的外设,实际上很多人都疏忽了:Apple TV也有能够从中受惠. 咱们此前现已听过这样的风闻:下一代Apple TV将会搭载一个全新的操作系统与世人见面.不仅如此,新一代Apple TV将会具有自个的App Store--正如当前的iPhone和iPad相同.除此之外,

[转]从 Apple TV 看电视的进化

电视被许多人吐槽为 “几十年没变过的东西”,因此苹果也被寄予厚望能改变这件事物.可惜的是,这种期望在空中飘了这么久,苹果也没玩出多少花样,直到这次发布会 Apple TV 才有了一些值得期待的改进. 传统电视 在 PC 和智能手机成为主流设备前,电视大概是我们能拥有的唯一一款大规模流行的科技消费产品.电视的消费群体以 “家庭” 为单位,几乎没什么计算和联网的能力,更多的是一款输出的媒介. 尽管以今天的目光审视起来,传统电视的科技含量少得可怜,但这款设备曾经带给人们的贡献是不可抹杀的.在很多年轻人

你是一个“会说话”的人吗?

人心忧虑,屈而不伸,一句良言,使心欢乐.--箴言12:25 愤 怒的那一个瞬间,智商是零,过一分钟后恢复正常.人的优雅关键在于控制自己情绪,用嘴伤害人,是最愚蠢的一种行为.我们的不自由,通常是因为来自内心的不 良情绪左右了我们.一个能控制住不良情绪的人,比一个能拿下一座城池的人更强大.水深则流缓,语迟则人贵.我们花了两年时间学说话,却要花数十年时间学会 闭嘴.可见:说,是一种能力:不说,是一种智慧. 说话的艺术: 1.急事,慢慢地说. 『你们各人要快快地听,慢慢地说,慢慢地动怒:』(雅各书一19

Apple TV是HomeKit的中枢?

CES2015展会上开发商展示了多款HomeKit设备,包括车库门开启器,智能灯泡插座,智能门锁等等.这些Wi-Fi设备有一个共同的特点:用户外出之时,要想使用iPhone通过Siri控制家中这些HomeKit设备,前提是必须有一台Apple TV. 比如用户在机场候机厅,通过Siri语音命令要求关掉家中浴 室仍然开着的灯泡,那么必须通过家中仍在运行的Apple TV来完成,显然,苹果试图将Apple TV作为HomeKit的中枢产品.不过CES2015展会上两三家开发商私下透露,用户外出仍然可