2019独角兽企业重金招聘Python工程师标准>>>

注:本文译自Sprite Kit Tutorial: Animations and Texture Atlases

目录

  • 创建一个工程
  • 纹理图集和熊
  • 一个简单的动画
  • 改变动画运动的方向
  • 在屏幕上让熊移动
  • 何去何从?

改变动画运动的方向

看起来不错哦!下面我们就来看看如何通过触摸屏幕上的点来控制熊的运动方向。在MyScene.m文件中做如下改动:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// Add these new methods -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {   CGPoint location = [[touches anyObject] locationInNode:self];  CGFloat multiplierForDirection;   if (location.x <= CGRectGetMidX(self.frame)) {  //walk left  multiplierForDirection = 1;  } else {  //walk right  multiplierForDirection = -1;  }   _bear.xScale = fabs(_bear.xScale) * multiplierForDirection;  [self walkingBear]; }  -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { } 

上面的代码会根据tap的位置,让touchesEnded方法判断tap处于屏幕正中间的左边还是右边。通过该方法,决定熊的朝向。熊的方向是通过Sprite Kit来改变的(通过负值乘以xScale就可以让熊朝向左边。)

编译并运行程序,一切正常的话,当你在屏幕上点击时,会发现熊的朝向发生了改变。

在屏幕上让熊移动

下面我们让熊可以移动到屏幕的各个位置。

在MyScene.m文件中做如下改动:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// Comment out the call to start the bear walking //[self walkingBear];  -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  //Stuff from below! }  -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { }  //add this method -(void)bearMoveEnded {  [_bear removeAllActions]; } 

如上所示,移除了touchesEnded方法中的所有代码。下面我们一步一步的往里面添加代码。

当想要停止动画的时可以调用方法bearMoveEnded。

下面就从touchesEnded方法开始吧:

1) 确定触摸的位置并定义一个变量代表熊的朝向

1 2
CGPoint location = [[touches anyObject] locationInNode:self]; CGFloat multiplierForDirection; 

如上代码,利用常见的一个方法将触摸的位置转换为node坐标系中的位置。

2) 设置速度

1 2
CGSize screenSize = self.frame.size; float bearVelocity = screenSize.width / 3.0; 

如上,定义了熊移动的速度。可知熊从移动长度为屏幕宽度这么长时,需要3秒钟。由于不同设备的屏幕宽度可能会不同,所以在这里使用了self.frame.size,所以熊的速度应该是屏幕宽度/3秒。

3) 计算出熊在X和Y轴中移动的量

1
CGPoint moveDifference = CGPointMake(location.x - _bear.position.x, location.y - _bear.position.y);

通过简单的利用触摸位置减去熊的位置,计算出熊在X和Y轴上应该移动的距离。

4) 计算出实际的移动距离

1
float distanceToMove = sqrtf(moveDifference.x * moveDifference.x + moveDifference.y * moveDifference.y);

上面的代码是计算出熊实际移动的直线距离(一个直角三角形的斜边:熊当前的位置和触摸位置)。关于游戏中涉及到的数学知识可以看看这本书:Trigonometry for Game Programming。

5) 计算出移动实际距离所需要花费的时间

1
float moveDuration = distanceToMove / bearVelocity;

通过移动的实际距离除以移动速度计算出需要花费的时间。

6) 需要的话对动画做翻转(Flip)处理

1 2 3 4 5 6
if (moveDifference.x < 0) {  multiplierForDirection = 1; } else {  multiplierForDirection = -1; } _bear.xScale = fabs(_bear.xScale) * multiplierForDirection; 

上面的代码:确定熊往左还是往右移动。如果小于0,则往左移动,否则往右移动。

在这里,你的第一直觉可能是利用图片编辑器创建并使用对应另一个方向的图片。不过,之前我们学习过了如果通过乘法来改变sprite的xScale,进而改变sprite的方向。

7) 运行一些action

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
if ([_bear actionForKey:@"bearMoving"]) {  //stop just the moving to a new location, but leave the walking legs movement running  [_bear removeActionForKey:@"bearMoving"]; } //1  if (![_bear actionForKey:@"walkingInPlaceBear"]) {  //if legs are not moving go ahead and start them  [self walkingBear]; //start the bear walking } //2  SKAction *moveAction = [SKAction moveTo:location duration:moveDuration]; //3 SKAction *doneAction = [SKAction runBlock:(dispatch_block_t)^() {  NSLog(@"Animation Completed");  [self bearMoveEnded]; }]; //4  SKAction *moveActionWithDone = [SKAction sequence:@[moveAction,doneAction]]; //5  [_bear runAction:moveActionWithDone withKey:@"bearMoving"]; //6 
  1. 停止已有的移动action(因为要准备告诉熊移动到别的地方)。这里使用的key可以开始和停止以此命名的动画的运行。
  2. 如果熊还没有准备移动腿,那么就让熊的腿开始移动,否则它该如何走到新的位置呢。这里使用了我们之前使用过的方法,这个方法可以确保不启动一个已经运行着的动画(以key命名)。
  3. 创建一个移动action,并制定移动到何处,以及需要花费的时间。
  4. 创建一个done action,当熊到达目的地后,该action利用一个block调用一个方法来停止动画。
  5. 将上面的两个action设置为一个顺序action链,就是说让这两个action按照先后顺序运行(第一个运行完之后,再运行第二个)。
  6. 让熊开始运行action,并制定一个key为:”bearMoving”。记住,这里的key用来判断熊是否需要移动到新的位置。

注意:Sprite Kit支持两种action:sequential和grouped。sequential action表示action按照顺序执行。如果想要action同时运行,那么就使用grouped。

当然,也可以在sequential action中包含grouped action,反之亦然。更多相关内容请看Sprite Kit Programming Guide中的Adding Actions to Nodes章节。

当动画执行完毕之后,bearMoveEnded会被调用,所有的动画都将被停止,并等待下一个移动方位。

搞定了!

现在编译并运行程序,一切正常的话,那么当点击屏幕时,熊会跟着移动。

何去何从?

这里是本文涉及到的工程示例。

下面这些想法可以让动画更加有趣:

  • 尝试在方法walkingBear中增加或者减慢运动的速度,看看效果
  • 试着在屏幕上同时显示多个熊。提示:创建多个sprite node,并赋予action。

至此,你应该已经知道如何使用动画了。

如果你希望学习更多相关Sprite Kit内容,可以看看这本书:iOS Games by Tutorials。本书会告诉你需要知道的内容——从物理特性,到磁贴地图,以及粒子系统,甚至是制作自己的关卡编辑器。

……Sprite Kit教程:动画和纹理图集 2 结束……

转载于:https://my.oschina.net/sunqichao/blog/179708

Sprite Kit教程:动画和纹理图集 2相关推荐

  1. Sprite Kit教程

    在iOS 7中内置了一个新的Sprite Kit框架,该框架主要用来开发2D游戏.目前已经支持的内容包括:精灵.很酷的特效(例如视频.滤镜和遮罩),并且还集成了物理库等许多东西.iOS 7中附带了一个 ...

  2. iOS Sprite Kit教程之场景的切换

    iOS Sprite Kit教程之场景的切换 Sprite Kit中切换场景 每一个场景都不是单独存在的.玩家可以从一个场景中切换到另外一个场景中.本小节,我们来讲解场景切换.在每一个游戏中都会使用到 ...

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

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

  4. iOS Sprite Kit教程之滚动场景

    iOS Sprite Kit教程之滚动场景 滚动场景 在很多的游戏中,场景都不是静止的,而是滚动的,如在植物大战僵尸的游戏中,它的场景如图2.26所示. 图2.26  植物大战僵尸 在图2.26中,用 ...

  5. iOS Sprite Kit教程之场景的设置

    iOS Sprite Kit教程之场景的设置 Sprite Kit中设置场景 在图2.8所示的效果中,可以看到新增的场景是没有任何内容的,本节将讲解对场景的三个设置,即颜色的设置.显示模式的设置以及测 ...

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

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

  7. iOS Sprite Kit教程之申请和下载证书

    iOS Sprite Kit教程之申请和下载证书 模拟器虽然可以实现真机上的一些功能,但是它是有局限的.例如,在模拟器上没有重力感应.相机机等.如果想要进行此方面的游戏的开发,进行程序测试时,模拟器显 ...

  8. iOS Sprite Kit教程之使用帮助文档以及调试程序

    iOS Sprite Kit教程之使用帮助文档以及调试程序 IOS中使用帮助文档 在编写代码的时候,可能会遇到很多的方法.如果开发者对这些方法的功能,以及参数不是很了解,就可以使用帮助文档.那么帮助文 ...

  9. iOS Sprite Kit教程之编写程序以及Xcode的介绍

    iOS Sprite Kit教程之编写程序以及Xcode的介绍 Xcode界面介绍 一个Xcode项目由很多的文件组成,例如代码文件.资源文件等.Xcode会帮助开发者对这些文件进行管理.所以,Xco ...

最新文章

  1. [Gitlab]使用Webhook实现前端项目自动发布
  2. python requests 使用代理
  3. PS滤镜制作下雨照片特效
  4. in作为介词的用法_英文论文写作:极易混淆的短语用法汇总如下
  5. 《Web前端开发最佳实践》——1.2 Web前端开发现状
  6. 软件工程形式化技术简介
  7. ifram嵌入网址 有跨域问题
  8. 语言叮叮消息接口_五分钟学后端技术:如何学习Java工程师必知必会的消息队列...
  9. Fortran笔记,全局变量
  10. 电脑用上这些壁纸站与软件,惊艳你的眼球!
  11. c语言tc2.0编译器下载,c语言tc2.0下载
  12. 发展战略-以技术为导向还是以产品为导向的方向选择?
  13. 【例题】【高斯消元】USACO3.2.4 Feed Ratios
  14. 转:移动互联:没有新故事没有新大佬
  15. ​2019胡润百富榜公布:中国互联网上演: 龙虎斗 , 阿里暂时领跑 , 企鹅紧随其后 , 李彦宏,雷军掉队...
  16. Peppa's menu
  17. win10浏览器服务器代理设置
  18. 网卡设置监听模式,抓取数据包
  19. 小学计算机趣味知识,小学生电脑课上都学哪些知识和操作?
  20. spring boot 超市进销存系统源码

热门文章

  1. 文件被剪切走了怎么恢复
  2. 天气预报(三)分析http://www.weather.com.cn/weather/xxxxxxxx.shtml,是否可以直接利用该网页的js.xhr返回我想要的
  3. 线性规划的典型例题:生产决策问题(思考+程序代码)
  4. 论「版本号」的正确使用方式
  5. Leetcode:832. Flipping an Image
  6. 预处理 #pragma 命令详解
  7. C++中不允许定义引用数组
  8. python嵌入式脚本_基于Python的嵌入式脚本研究
  9. C3P Software 发布 Cast-Designer Weld
  10. OpenJudge 1.6.3