注:本文译自Sprite Kit Tutorial for Beginners
目录
- Sprite Kit的优点和缺点
- Sprite Kit vs Cocos2D-iPhone vs Cocos2D-X vs Unity
- Hello, Sprite Kit!
- 横屏显示
- 移动怪兽
- 发射炮弹
- 碰撞检测和物理特性: 概述
- 碰撞检测和物理特性: 实现
- 收尾
- 何去何从?
碰撞检测和物理特性: 概述
至此我们已经可以让炮弹任意的发射了——现在我们要让忍者利用炮弹来消灭这些怪物。下面就添加一些代码来给炮弹与怪物相交做检测。
Sprite Kit内置了一个物理引擎,这非常的棒!该物理引擎不仅可以模拟现实运动,还能进行碰撞检测。
下面我们就在游戏中使用Sprite Kit的物理引擎来检测炮弹与怪物的碰撞。首先,我们来看看需要做些神马事情:
-
物理世界的配置
。物理世界是一个模拟的空间,用来进行物理计算。默认情况下,在场景(scene)中已经创建好了一个,我们可以对其做一些属性配置,例如重力感应。 -
为精灵(sprite)创建对应的物体(physics bodies)
。在Sprite Kit中,为了碰撞检测,我们可以为每个精灵创建一个相应的形状,并设置一些属性,这就称为物体(physics body)
。注意:图文的形状不一定跟精灵的外形一模一样。一般情况,这个形状都是简单的、大概的(而不用精确到像素级别)——毕竟这已经足以够大多数游戏使用了。 -
将精灵分类
。在物体(physics body)上可以设置的一个属性是category
,该属性是一个位掩码(bitmask)。通过该属性可以将精灵分类。在本文的游戏中,有两个类别——一类是炮弹,另一类则是怪物。设置之后,当两种物体相互碰撞时,就可以很容易的通过类别对精灵做出相应的处理。 -
设置一个contact(触点) delegate
。还记得上面提到的物理世界吗?我们可以在物理世界上设置一个contact delegate
,通过该delegate,当两个物体碰撞时,可以收到通知。收到通知后,我们可以通过代码检查物体的类别,如果是怪物和炮弹,那么就做出相应的动作!
上面大致介绍了一下游戏策略,下面就来看看如何实现!
碰撞检测和物理特性: 实现
首先在MyScene.m
文件顶部添加如下两个常量:
1 2 |
|
上面设置了两个类别,记住需要用位(bit)的方式表达——一个用于炮弹,另一个则是怪物。
注意:
看到上面的语法你可能感到奇怪。在Sprite Kit中category是一个32位整数,当做一个位掩码(bitmask)。这种表达方法比较奇特:在一个32位整数中的每一位表示一种类别(因此最多也就只能有32类)。在这里,第一位表示炮弹,下一位表示怪兽。
接着,在initWithSize
中,将下面的代码添加到位置:添加player到场景涉及代码的后面。
1 2 |
|
上面的代码将物理世界的重力感应设置为0,并将场景设置位物理世界的代理(当有两个物体碰撞时,会受到通知)。
在addMonster
方法中,将如下代码添加创建怪兽相关代码后面:
1 2 3 4 5 |
|
来看看上面代码意思:
- 为怪兽创建一个对应的物体。此处,物体被定义为一个与怪兽相同尺寸的矩形(这样与怪兽形状比较接近)。
- 将怪兽设置位
dynamic
。这意味着物理引擎将不再控制这个怪兽的运动——我们自己已经写好相关运动的代码了。 - 将categoryBitMask设置为之前定义好的
monsterCategory
。 -
contactTestBitMask
表示与什么类型对象碰撞时,应该通知contact代理。在这里选择炮弹类型。 -
collisionBitMask
表示物理引擎需要处理的碰撞事件。在此处我们不希望炮弹和怪物被相互弹开——所以再次将其设置为0。
接着在touchesEnded:withEvent:
方法中设置炮弹位置的代码后面添加如下代码。
1 2 3 4 5 6 |
|
在上面的代码中跟之前的类似,只不过有些不同,我们来看看: 1. 为了更好的效果,炮弹的形状是圆形的。 2. usesPreciseCollisionDetection
属性设置为YES。这对于快速移动的物体非常重要(例如炮弹),如果不这样设置的话,有可能快速移动的两个物体会直接相互穿过去,而不会检测到碰撞的发生。
接着,添加如下方法,当炮弹与怪物发生碰撞时,会被调用。注意这个方法是不会被自动调用,稍后会看到我们如何调用它。
1 2 3 4 5 |
|
当怪物和炮弹发生碰撞,上面的代码会将他们从场景中移除。很简单吧!
下面该实现contact delegate方法了。将如下方法添加到文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
还记得之前给物理世界设置的contactDelegate
吗?当两个物体发生碰撞之后,就会调用上面的方法。
在上面的方法中,可以分为两部分来理解:
- 该方法会传递给你发生碰撞的两个物体,但是并不一定符合特定的顺序(如炮弹在前,或者炮弹在后)。所以这里的代码是通过物体的category bit mask来对其进行排序,以便后续做出正确的判断。注意,这里的代码来自苹果提供的Adventure示例。
- 最后,检测一下这两个碰撞的物体是否就是炮弹和怪物,如果是的话就调用之前的方法。
最后一步,为了编译器没有警告,确保private interface 中添加一下SKPhysicsContactDelegate
:
1
|
|
现在编译并运行程序,可以发现,当炮弹与怪物接触时,他们就会消失!
收尾
现在,本文的游戏快完成了。接下来我们就来为游戏添加音效和音乐,以及一些简单的游戏逻辑吧。
苹果提供的Sprite Kit里面并没有音频引擎(Cocos2D中是有的),不过我们可以通过action来播放音效,并且可以使用AVFoundation播放后台音乐。
在工程中我已经准备好了一些音效和很酷的后台音乐,在本文开头已经将resources添加到工程中了,现在只需要播放它们即可!
首先在ViewController.m
文件顶部添加如下import:
1
|
|
上面的语法是iOS 7中新的modules功能 —— 只需要使用新的关键字@import,就可以框架的头文件和库文件添加到工程中,这功能非常方便。要了解更多相关内容,请看到iOS 7 by Tutorials中的第十章内容中的:What’s New with Objective-C and Foundation。
接着添加一个新的属性和private interface:
1 2 3 |
|
接着将下面的代码添加到viewWillLayoutSubviews
方法中(在[super viewWillLayoutSubviews]
后面):
1 2 3 4 5 6 |
|
上面的代码会开始无限循环的播放后台音乐。
下面我们来看看如何处理音效。切换到MyScene.m
文件中,并将下面这行代码添加到touchesEnded:withEvent:
方法的顶部:
1
|
|
如上,一行代码就可以播放音效了,很简单吧!
下面,我们创建一个新的创建和layer,用来显示你赢了(You Win)
或你输了(You Lose)
。用模板iOS\Cocoa Touch\Objective-C class
创建一个新的文件,将其命名为GameOverScene
,并让其继承自SKScene
,然后点击Next
和Create
。
接着用如下代码替换GameOverScene.h
中的内容:
1 2 3 4 5 6 7 |
|
在上面的代码中导入了Sprite Kit头文件,并声明了一个特定的初始化方法,该方法的第一个参数用来定位显示的位置,第二个参数won用来判断用户是否赢了。
接着用下面的代码替换GameOverLayer.m
中的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
上面的代码可以分为4部分内容,我们来分别看看:
- 将背景色设置为白色(与主场景一样颜色)。
- 根据
won
参数,将信息设置为”You Won”或”You Lose”。 - 这里的代码是利用Sprite Kit将一个文本标签显示到屏幕中。如代码所示,只需要选择一个字体,并设置少量的参数即可,也非常简单。
- 设置并运行有个有两个action的sequence。为了看起来方便,此处我将它们放到一块(而不是为每个action创建单独的一个变量)。首先是等待3秒,然后是利用
runBlock
action来运行一些代码。 - 演示了在Sprite Kit中如何过渡到新的场景。首先可以选择任意的一种不同的动画过渡效果,用于场景的显示,在这里选择了翻转效果(持续0.5秒)。然后是创建一个想要显示的场景,接着使用self.view的方法
presentScene:transition:
来显示出场景。
OK,万事俱备,只欠东风了!现在只需要在主场景中,适当的情况下加载game over scene就可以了。
首先,在MyScene.m
中导入新的场景:
1
|
|
然后,在addMonster
中,用下面的代码替换最后一行在怪物上运行action的代码:
1 2 3 4 5 6 |
|
上面创建了一个”lose action”,当怪物离开屏幕时,显示game over场景。
在这里为什么loseAction
要在actionMoveDone
之前运行呢? 原因在于如果将一个精灵从场景中移除了,那么它就不在处于场景的层次结构中了,也就不会有action了。所以需要过渡到lose场景之后,才能将精灵移除。不过,实际上actionMoveDone永远都不会被调用——因为此时已经过渡到新的场景中了,留在这里就是为了达到教学的目的。
现在,需要处理一下赢了的情况。在private interface中添加一个新的属性:
1
|
|
然后将如下代码添加到projectile:didCollideWithMonster:
的底部:
1 2 3 4 5 6 |
|
编译并运行程序,尝试一下赢了和输了会看到的画面!
何去何从?
至此Sprite Kit教程:初学者
结束!这里可以下到完整的代码。
希望本文能帮助你学习Sprite Kit,并写出你自己的游戏!
如果你希望学习更多相关Sprite Kit内容,可以看看这本书:iOS Games by Tutorials。本书会告诉你需要知道的内容——从物理,到tile map,以及特定的系统,甚至是制作自己的关卡编辑器。
……Sprite Kit教程:初学者 3 结束……
相关推荐
iOS游戏框架Sprite Kit基础教程 Swift版上册
ios7 最新游戏框架spritekit框架制作的demo
简单的SpriteKit打飞机 利用SpriteKit写的一个简单的打飞机场景,可以发射子弹、移动飞机以及碰撞检测。 利用SpriteKit写的一个简单的打飞机场景,可以发射子弹、移动飞机以及碰撞检测。
IOS 2D游戏开发框架
spine-spritekit, 针对 iOS 7 SpriteKit的非官方书脊 2D 运行时 脊椎 spritekitUnofficial ( http://esotericsoftware.com )的非官方 iOS 7运行时运行时官方运行时在这里:http://esotericsoftware.com/spine-runti
iOS游戏开发之使用 Spritekit 框架和 Swift 的 iOS 2D 太空射击游戏源码
SpriteKit游戏开发教程,2D方向,示例易懂,适合所有选手
SpriteKit游戏开发教程,2D方向,示例易懂,适合所有选手
IOS SpriteKit学习之微信打飞机
iOS 7 Game Development(ios7 英文版 SpriteKit 介绍)1标签: ios7 Game Spritekit .本书英文版,就是有关spritekit的, 当前有关这个的书非常少,只能看看英文版的了。
手把手指导初学者如何使用sprite Kit开发一个"割绳子"iOS游戏
SKTetrisGame 使用Apple的SpriteKit为iOS创建的俄罗斯方块游戏
Orbit7, 在SpriteKit中,开源iOS游戏创建Swift Orbit7使用 Swift 在SpriteKit中创建的开源iOS游戏https://www.mav3r1ck.iohttps://itunes.apple.com/us/app/orbit-7/id959313456
使用SpriteKit实现iOS版本的2048游戏
Pragmatic - Build iOS Games with Sprite Kit, Unleash Your Imagination in Two Dimensions.2015
Power up your inner game developer and start building incredible games with Sprite Kit. This book will teach you everything you need to know about Apple's 2D game engine. If you have some programming ...
_ Objective-C_代码_下载 开始使用 SpriteKit 的演示。将著名的 Cocos2DSimpleGame 移植到 ...See my blog for more: SpriteKit快速入门和新时代iOS游戏开发指南 更多详情、使用方法,请下载后阅读README.md文件
FlappyBird iOS SpriteKit框架 2D游戏开发(仅供学习参考)
一个简单的iOS 7 Sprite Kit学习demo
mac os 和ios 游戏开发工具.在iOS 7中内置了一个新的Sprite Kit框架,该框架主要用来开发2D游戏。目前已经支持的内容包括:精灵、很酷的特效(例如视频、滤镜和遮罩),并且还集成了物理库等许多东西。