接下来,我们希望在场景中添加一些怪兽,让忍者进行攻击。为了让游戏更有趣一点,希望怪兽能够移动——否则没有太大的挑战!OK,我们就在屏幕的右边,离屏的方式创建怪兽,并给怪兽设置一个动作:告诉它们往左边移动。

将下面这个方法添加到MyScene.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
- (void)addMonster {
    // Create sprite
    SKSpriteNode * monster = [SKSpriteNode spriteNodeWithImageNamed:@"monster"];

    // Determine where to spawn the monster along the Y axis
    int minY = monster.size.height / 2;
    int maxY = self.frame.size.height - monster.size.height / 2;
    int rangeY = maxY - minY;
    int actualY = (arc4random() % rangeY) + minY;

    // Create the monster slightly off-screen along the right edge,
    // and along a random position along the Y axis as calculated above
    monster.position = CGPointMake(self.frame.size.width + monster.size.width/2, actualY);
    [self addChild:monster];

    // Determine speed of the monster
    int minDuration = 2.0;
    int maxDuration = 4.0;
    int rangeDuration = maxDuration - minDuration;
    int actualDuration = (arc4random() % rangeDuration) + minDuration;

    // Create the actions
    SKAction * actionMove = [SKAction moveTo:CGPointMake(-monster.size.width/2, actualY) duration:actualDuration];
    SKAction * actionMoveDone = [SKAction removeFromParent];
    [monster runAction:[SKAction sequence:@[actionMove, actionMoveDone]]];

}

在上面,我尽量让代码看起来容易理解。首先是通过一个简单的计算,确定怪兽出现的位置,并将该位置设置给怪兽,然后将其添加到场景中。

接着是添加动作(actions)。跟Cocos2D一样,Sprite Kit同样提供了很多方便的内置动作,例如移动动作、旋转动作、淡入淡出动作、动画动作等。在这里我们只需要在怪兽上使用3中动作即可:

  • moveTo:duration:使用这个动作可以把怪兽从屏幕外边移动到左边。移动过程中,我们可以指定移动持续的时间,上面的代码中,指定为2-4秒之间的一个随机数。
  • removeFromParent:在Sprite Kit中,可以使用该方法,方便的将某个node从parent中移除,能有效的从场景中删除某个对象。此处,将不再需要显示的怪兽从场景中移除。这个功能非常的重要,否则当有源源不断的怪兽出现在场景中时,会耗尽设备的所有资源。
  • sequence:sequence动作可以一次性就把一系列动作串联起来按照一定顺序执行。通过该方法我们就能让moveTo:方法先执行,当完成之后,在执行removeFromParent:动作。

最后,我们需要做的事情就是调用上面这个方法addMonster,以实际的创建出怪兽!为了更加好玩,下面我们来让怪兽随着时间持续的出现在屏幕中。

在Sprite Kit中,并不能像Cocos2D一样,可以配置每隔X秒就回调一下update方法。同样也不支持将从上次更新到目前为止的时间差传入方法中。(非常令人吃惊!)。

不过,我们可以通过一小段代码来仿造这种行为。首先在MyScene.m的private interface中添加如下属性:

1
2
@property (nonatomic) NSTimeInterval lastSpawnTimeInterval;
@property (nonatomic) NSTimeInterval lastUpdateTimeInterval;

通过lastSpawnTimeInterval可以记录着最近出现怪兽时的时间,而lastUpdateTimeInterval可以记录着上次更新时的时间。

接着,我们写一个方法,该方法在画面每一帧更新的时候都会被调用。记住,该方法不会被自动调用——需要另外写一个方法来调用它:

1
2
3
4
5
6
7
8
- (void)updateWithTimeSinceLastUpdate:(CFTimeInterval)timeSinceLast {
    self.lastSpawnTimeInterval += timeSinceLast;
    if (self.lastSpawnTimeInterval > 1) {        self.lastSpawnTimeInterval = 0;
        [self addMonster];
    }
}

上面的代码中简单的将上次更新(update调用)的时间追加到self.lastSpawnTimeInterval中。一旦该时间大于1秒,就在场景中新增一个怪兽,并将lastSpawnTimeInterval重置。

最后,添加如下方法来调用上面的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)update:(NSTimeInterval)currentTime {    // Handle time delta.
    // If we drop below 60fps, we still want everything to move the same distance.
    CFTimeInterval timeSinceLast = currentTime - self.lastUpdateTimeInterval;
    self.lastUpdateTimeInterval = currentTime;
    if (timeSinceLast > 1) { // more than a second since last update
        timeSinceLast = 1.0 / 60.0;
        self.lastUpdateTimeInterval = currentTime;
    }

    [self updateWithTimeSinceLastUpdate:timeSinceLast];

}

Sprite Kit在显示每帧时都会调用上面的update:方法。

上面的代码其实是来自苹果提供的Adventure示例中。该方法会传入当前的时间,在其中,会做一些计算,以确定出上一帧更新的时间。注意,在代码中做了一些合理性的检查,以避免从上一帧更新到现在已经过去了大量时间,并且将间隔重置为1/60秒,避免出现奇怪的行为。

现在编译并运行程序,可以看到许多怪兽从左边移动到屏幕右边并消失。

Sprite Kit 移动精灵相关推荐

  1. 游戏中的三角学——Sprite Kit 和 Swift 教程(1)

    原文链接 : Trigonometry for Games – Sprite Kit and Swift Tutorial: Part 1/2 原文作者 : Nick Lockwood 译文出自 : ...

  2. 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比(一家之言)

    初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 发布于:2013-07-18 11:00阅读数:1984 ...

  3. 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比

    前言 iOS7 beta发布后,大部分开发者和用户的注意力都集中在了iOS 7的全新UI交互设计界面上.一直负责硬件工业设计的Jony Ive首次全面负责苹果的软件和硬件设计工作,自然要把他自己的设计 ...

  4. Sprite Kit 精灵系统

    精灵是用于创建大部分场景内容的基本构建块,所以在转到其他Sprite Kit节点类之前先了解精灵是有用的.精灵用SKSpriteNode对象表现.一个SKSpriteNode对象,要么绘制成一个由纹理 ...

  5. iOS Sprite Kit教程之真机测试以及场景的添加与展示

    iOS Sprite Kit教程之真机测试以及场景的添加与展示 IOS实现真机测试 在进行真机测试之前,首先需要确保设备已经连在了Mac(或者Mac虚拟机)上,在第1.9.1小节开始,设备就一直连接在 ...

  6. Swift版iOS游戏框架Sprite Kit基础教程下册

    Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C  介绍:本教程是国内唯一的Swift版的Spritekit教程 ...

  7. iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序

    iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序 程序是为了实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.本章将以编写第一个Sprite Kit程序为 ...

  8. iOS游戏框架Sprite Kit基础教程——Swift版上册

    iOS游戏框架Sprite Kit基础教程--Swift版上册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C  介绍:本教程是国内唯一的Swift版的Spritekit ...

  9. ios游戏开发 Sprite Kit教程:初学者 2

    2019独角兽企业重金招聘Python工程师标准>>> 注:本文译自Sprite Kit Tutorial for Beginners 目录 Sprite Kit的优点和缺点 Spr ...

最新文章

  1. 安防行业标准规范大全
  2. so文件反编译_安卓攻防so模块自动化修复实战
  3. 2020年联通软件研究院校招笔试第一题
  4. 【读书】《非暴力沟通》
  5. 远程服务器存储之JDK方式
  6. springboot-自动配置流程
  7. Istio Pilot 源码分析(二)
  8. .Net中的AOP系列之《AOP实现类型》
  9. 使用拦截器分析Java EE应用程序的性能下降/提高
  10. Leetcode每日一题:290.word-pattern(单词规律)
  11. jar包里java.lang.NoSuchMethodError异常,
  12. linux远程备份视频教程,linux实现自动远程备份(scp+ssh)
  13. sicily 1022. Train Problem
  14. java类后面的尖括号_泛型 - Java中的T(尖括号)是什么意思?
  15. R数据分析:用lme4包拟合线性和非线性混合效应模型
  16. 网络交换机怎么连接硬盘录像机、网络交换机怎么连接摄像头
  17. 7大Python IDE工具推荐
  18. 用js获取ios时间戳,结果为NaN或不显示
  19. 网站权重怎么批量查?怎么批量查询网站的360权重
  20. 英语八年级上册计算机的事实,人教版英语|八年级上册各单元必考知识点汇总,收藏!...

热门文章

  1. 基于JAVA校园共享单车系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  2. mysql取分组最新的一条_mysql group by之后取每个分组最新的一条
  3. easypoi一对多导入_easypoi导入Excel最佳实践
  4. Linux服务之DHCP服务篇(scp)
  5. 基于C++的简易RLC电路仿真器与滤波器仿真测试
  6. 互联网发展史【计网】
  7. Ubuntu,CentOS安装TIM(QQ),liunx通用
  8. 微信早安,利用uniCloud阿里云的云函数实现定时推送
  9. DB2数据库开发工具:DBVisualizer
  10. 博凌科技携手中企动力用互联网思维卖乐器