做一个类似Cut The Rote 的游戏(二)

上一篇文章,我们添加了游戏的背景,现在我们来添加鳄鱼了。

将鳄鱼添加到场景中

有言在先,这只鳄鱼是十分活泼的,请你保持一个安全距离!:]

像风景背景一样,鳄鱼也是由一个SKSpriteNode表示。不同的是:你需要保存对鳄鱼的引用,你需要为鳄鱼建立一个physics body,用来检测和处理鳄鱼与其他物体的碰撞。

仍然在GameScene.swift中,将以下属性添加到类的顶部:

private var crocodile: SKSpriteNode!
private var prize: SKSpriteNode! `

这些属性各自保存了对鳄鱼和奖品(菠萝)的引用。它们不需要在GameScene外面被访问,所以将它们定义为private

这些属性的类型是SKSpriteNode!。这!意味着隐式解开的可选项,它告诉Swift这些属性无需立即被初始化。如果要使用!,你必须确保无论什么时候访问属性,属性都不会为nil,否则应用程序将崩溃。

找到在GameScene.swift内的方法setUpCrocodile(),并添加以下代码:

crocodile = SKSpriteNode(imageNamed: ImageName.CrocMouthClosed)
crocodile.position = CGPoint(x: size.width * 0.75, y: size.height * 0.312)
crocodile.zPosition = Layer.Crocodile
crocodile.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: ImageName.CrocMask), size: crocodile.size)
crocodile.physicsBody?.categoryBitMask = PhysicsCategory.Crocodile
crocodile.physicsBody?.collisionBitMask = 0
crocodile.physicsBody?.contactTestBitMask = PhysicsCategory.Prize
crocodile.physicsBody?.isDynamic = false
addChild(crocodile)
animateCrocodile()

以上代码创建鳄鱼节点并设置它的positionzPosition

与风景背景不同,鳄鱼有一个SKPhysicsBody,它可以与世界上其他物体进行物理交互。这对后面检测菠萝是否落在鳄鱼口中是十分有用的。你不想鳄鱼被撞倒,或者从屏幕底部掉下来,所以你需要设定isDynamic = false,防止它受到作用力的影响。

categoryBitMask--设置了鳄鱼的身体物理类别为PhysicsCategory.Crocodile。你不想让鳄鱼对其他物体进行反弹,所以设置collisionBitMask = 0。你需要检测的是“Prize”的身体与鳄鱼接触,所以你需要设置contactTestBitMask = PhysicsCategory.Prize

您可能已经注意到,鳄鱼的physics body使用SKTexture对象进行初始化。您使用CrocMouthOpen作为鳄鱼的身体纹理,该图像包括鳄鱼的全身,但是mask纹理只包括鳄鱼的头和嘴,毕竟鳄鱼不能用它的尾巴吃菠萝!(mask纹理用来判断物理碰撞检测,身体纹理只是用来展示)

现在你会添加一个鳄鱼正在“waiting”的动画。找到animateCrocodile()方法并添加以下代码:

let duration = 2.0 + drand48() * 2.0
let open = SKAction.setTexture(SKTexture(imageNamed: ImageName.CrocMouthOpen))
let wait = SKAction.wait(forDuration: duration)
let close = SKAction.setTexture(SKTexture(imageNamed: ImageName.CrocMouthClosed))
let sequence = SKAction.sequence([wait, open, wait, close])
crocodile.run(SKAction.repeatForever(sequence)) 

除了使小鳄鱼非常焦虑,上面的代码创建了一些改变鳄鱼节点纹理的动作,使它的嘴巴在闭合和开口之间交替。

SKAction.sequence()根据数组创建了动作序列。在这种情况下,纹理动作在2-4秒的随机时间里进行组合。

这一系列的序列动作放在repeatActionForever()中,所以这些动作将在持续时间内重复执行。然后由鳄鱼节点执行这些动作。

建立并运行,然后就会看到这个凶猛的爬行动物张开了它的死亡之嘴!


鳄鱼张开嘴巴

你有丛林背景,你有鳄鱼 -- 现在你需要一个菠萝。

添加奖励--菠萝

打开GameScene.swift 并找到setUpPrize()方法。添加以下内容:

prize = SKSpriteNode(imageNamed: ImageName.Prize)
prize.position = CGPoint(x: size.width * 0.5, y: size.height * 0.7)
prize.zPosition = Layer.Prize
prize.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: ImageName.Prize), size: prize.size)
prize.physicsBody?.categoryBitMask = PhysicsCategory.Prize
prize.physicsBody?.collisionBitMask = 0
prize.physicsBody?.density = 0.5
addChild(prize)

与鳄鱼类似,菠萝节点也使用physics body。不同的是,菠萝应该掉落并反弹,而鳄鱼就在那里不耐烦地等待着。所以你设置isDynamic = true。你也可以减少菠萝的密度density,减轻了重量,菠萝可以摆动得更大。

使用物理学

在开始让菠萝掉落之前,我们最好先配置物理世界。找到GameScene.swift文件内的 setUpPhysics()方法,并添加以下三行代码:

physicsWorld.contactDelegate = self
physicsWorld.gravity = CGVector(dx: 0.0, dy: -9.8)
physicsWorld.speed = 1.0

上面设置了物理世界的contactDelegategravity和。gravity为世界的重力加速度,而speed为模拟执行的速度(这两个属性都设置成默认值)。

您已指定delegate 为self,但是因为GameScene没有遵循SKPhysicsContactDelegate协议,因此编译器在第一行代码处报错。解决这个问题需要将该协议添加到类定义上,如下所示:

class GameScene: SKScene, SKPhysicsContactDelegate {

再次编译并运行程序。您应该看到菠萝越过鳄鱼,并掉入水中(它实际上落在水的后面)。

下一篇文章,我们要添加葡萄藤,并且将菠萝挂到上面去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容