在游戏中,有很多分来飞去的平台,这个平台长短不一。如果每种长度都去创建一张图片那是比较繁琐的事情。实际上,我们只用到3张图。分别是平台的,平台的中间部分,平台的右边。关键是平台的中间部分,两张中间部分放在一起能够很好地衔接起来,这样只要增加中间部分的数量就能创建不同长度的平台。那这种图片该怎么制作呢?我们先找一张平台的完整图

然后切出中间部分。

这时候,我们能够发现,两块中间部分能够无缝的拼在一起。那么我们就把它拼起来。而拼起来的这块中间部分,我们再整体复制一块,发现不用翻转就能无缝拼接了,这样就完成了平台的中间部分。而平台的右边部分只需要用图中平台的左边部分水平翻转就可以得到。

这样,我们得到了全部的平台文件。

9.6 创建平台类以及平台工厂类

从这部分开始,我们就要开始编码平台的相关类了。首先我们来创建平台类。Platform继承自SKNode。这个类不需要载入纹理只实现平台组装功能,所以继承自SKNode。那么我们就需要自己实现宽width和高height:

//宽
var width :CGFloat = 0.0
//高
var height :CGFloat = 10.0

然后我们需要写一个onCreate方法来组装平台的零件。onCreate接受一个SKSpriteNode类型的数组。并将数组内的元素按顺序水平排好,加入当前类中的实例中。

func onCreate(arrSprite:[SKSpriteNode]){
//通过接受SKSpriteNode数组来创建平台
for platform in arrSprite {
//以当前宽度为平台零件的x坐标
platform.position.x = self.width
//加载
self.addChild(platform)
//更新宽度
self.width += platform.size.width
}
}

完整代码如下:

//平台类
import SpriteKit class Platform:SKNode{
//宽
var width :CGFloat = 0.0
//高
var height :CGFloat = 10.0 func onCreate(arrSprite:[SKSpriteNode]){
//通过接受SKSpriteNode数组来创建平台
for platform in arrSprite {
//以当前宽度为平台零件的x坐标
platform.position.x = self.width
//加载
self.addChild(platform)
//更新宽度
self.width += platform.size.width
}
}
}

接下来我们要来写一个平台的工厂类,它负责产生平台零件然后传给平台类进行组装。在编码的时候,我们应该根据功能设计不同的类负责不同的功能。这样各司其职结构清晰,也方便日后的扩展修改。

工厂类名为PlatformFactory,同样继承自SKNode。在工厂类中,存有平台的纹理。

//定义平台左边纹理
let textureLeft = SKTexture(imageNamed: "platform_l")
//定义平台中间纹理
let textureMid = SKTexture(imageNamed: "platform_m")
//定义平台右边纹理
let textureRight = SKTexture(imageNamed: "platform_r")

我们还需要定义一个数组来储存生成的平台:

//定义一个数组来储存组装后的平台
var platforms = [Platform]()

现在开始写生成平台的方法,createPlatform,它接收四个参数。isRandom,用来决定是否生成随机位置的平台,暂时用不到,但是为了后面做扩展做准备。minNum就是生成几个中间部分。x与y就是位置坐标了。

createPlatform这个方法,会根据需求生成平台零件数组传入到平台中进行组装。最后放入平台数组中。

平台工厂类不仅负责生成平台,同时自身也是一个容器,这样就能统一控制所有平台。完整代码如下:

import SpriteKit

class PlatformFactory: SKNode {
//定义平台左边纹理
let textureLeft = SKTexture(imageNamed: "platform_l")
//定义平台中间纹理
let textureMid = SKTexture(imageNamed: "platform_m")
//定义平台右边纹理
let textureRight = SKTexture(imageNamed: "platform_r") //定义一个数组来储存组装后的平台
var platforms = [Platform]() func createPlatform(isRandom:Bool,midNum:UInt32,x:CGFloat,y:CGFloat)->Platform{
//声明一个平台类,用来组装平台。
var platform = Platform()
//生成平台的左边零件
let platform_left = SKSpriteNode(texture: textureLeft)
//设置中心点
platform_left.anchorPoint = CGPoint(x: 0, y: 0.9)
//生成平台的右边零件
let platform_right = SKSpriteNode(texture: textureRight)
//设置中心点
platform_right.anchorPoint = CGPoint(x: 0, y: 0.9) //声明一个数组来存放平台的零件
var arrPlatform = [SKSpriteNode]()
//将左边零件加入零件数组
arrPlatform.append(platform_left) //根据传入的参数来决定要组装几个平台的中间零件
//然后将中间的零件加入零件数组
for i in 1...midNum {
let platform_mid = SKSpriteNode(texture: textureMid)
platform_mid.anchorPoint = CGPoint(x: 0, y: 0.9)
arrPlatform.append(platform_mid)
}
//将右边零件加入零件数组
arrPlatform.append(platform_right)
//将零件数组传入
platform.onCreate(arrPlatform)
platform.name="platform"
//设置平台的位置
platform.position = CGPoint(x: x, y: y)
//放到当前实例中
self.addChild(platform)
//将平台加入平台数组
platforms.append(platform)
return platform
}
}

写完了平台工厂类和平台类,我们迫不及待的测试一下。我们可以切换到GameScene中添加代码测试一下:

先声明一个平台工厂:

lazy var platformFactory = PlatformFactory()

然后在didMoveToView方法中将平台工厂加入当前视图中。

self.addChild(platformFactory)

之后是一行临时的测试代码:

let platform = platformFactory.createPlatform(false, midNum: 1, x: 100, y: 300)

运行代码测试一下,效果如下:

Good,搞定。

我的微信公众号

我写的破书:《Swift语言实战晋级》http://item.jd.com/11641501.html

Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-5-6 踩踏平台是怎么炼成的的更多相关文章

  1. Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的

    这节内容我们一起学习下随机长度的踩踏平台的原理是怎么样的. 要点: 平台的组成 我们的平台由3部分组成 左: 中: 右: 其中中间部分是可以无缝衔接的,下面就是两个中间部分衔接在一起 要任何长度的平台 ...

  2. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-9-10 移除平台与视差滚动

    9.9 移除场景之外的平台 用为平台是源源不断的产生的,如果不注意销毁,平台就将越积越多,虽然在游戏场景中看不到.几十个还看不出问题,那几万个呢?几百万个呢? 所以我们来看看怎么移除平台,那什么样的平 ...

  3. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-1

    学习目标 一.进一步学习Swift的游戏制作 二.掌握SKNode,SKSpriteNode的运用 三.了解SpriteKit的物理系统 四.掌握动作(SKAction)的运用 在这一章,我们要通过制 ...

  4. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法

    在上个小节,我们完成了平台的产生.那么我们来实现一下让平台移动.平台的移动,我们只需要在平台工厂类中写好移动的方法,然后在GameScene类中统一控制就行了. 在GameScene类中,有个upda ...

  5. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-2 创建熊猫类

    当我们创建好项目文件后我们就可以开始一步一步的按照我们之前列入的清单来编写我们的游戏.现在就让我们来创建一个熊猫这个类Panda.swift.我们将采取分解的方式,一步一步的完成Panda.swift ...

  6. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-4 熊猫的跳和打滚

    之前我们学会了跑的动作,现在我们可以利用同样的方法来实现了跳和打滚的动画. …… class Panda : SKSpriteNode { …… //跳的纹理集合 let jumpAtlas = SK ...

  7. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-3 显示一个动态的熊猫

    一个静态的熊猫明显不能满足我们的欲望,接下来我们就让熊猫跑起来.序列帧动画的原理就是不停的切换不同的图片.当我们将一张一张的切换Panda类的跑动文理后,熊猫就跑起来了.那么首先我们需要一个数组常量来 ...

  8. 第七模块:项目实战一 第1章 项目实战:CRM客户关系管理系统开发

    01-crm介绍 02-权限系统介绍 03-第一版表结构设计 04-第二版表结构设计 05-orm中创建表结构 06-销售管理系统业务 07-销售管理系统权限信息录入 08-快速实现简单的权限控制的设 ...

  9. Swift语言实战晋级

    Swift语言实战晋级基本信息作者: 老镇 丛书名: 爱上Swift出版社:人民邮电出版社ISBN:9787115378804上架时间:2014-12-26出版日期:2015 年1月开本:16开页码: ...

随机推荐

  1. 基于LR的HTTP协议接口性能测试脚本实例

    背景介绍 XXX项目性能测试中新增业务场景:XX设备的在线激活,因为存在多用户同时在线激活,故需进行性能测试以确认后台服务器系统在多用并发时功能是否正常,性能指标是否满足规格要求.用户使用场景为用户通 ...

  2. CLI下另一种多进程实现方式----PCNTL

    有些时候,你需要对一些脚本进行优化,以期跑的更快,在更短的时间内完成任务.PCNTL是一个不错的选择,它可以fork多个进程,来协同完成一个任务,理论上完成的时间将会和进程数成反比. 不过,PCNTL ...

  3. MongoVUE的使用

    配置连接:   Ok,连接成功齐活儿~   下面来试一下,插入一个新的名为Message的Collection :     然后插入个Document  

  4. 高德地图API应用

    高德地图官网:http://api.amap.com/javascript/ 输入关键字,搜索地址功能的网页: 1.引用远程Map Api(js)网址形式(注册后获取) 2.定义个<div> ...

  5. eclipse Maven -->web project

    http://blog.chinaunix.net/uid-26959955-id-3248053.html http://blog.csdn.net/wilsonke/article/details ...

  6. 【Android测试】【随笔】获得App的包名和启动页Activity

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5157308.html 前言 经常看到一些刚刚接触Andro ...

  7. DOCTYPE、指定语言、字符集

    <!DOCTYPE html> 在HTML的最开始部分声明DOCTYPE文档类型,可以让浏览器或其他用户代理知道你要使用的Html语言类型:无论你打算使用何种类型的HTML语言,DOCTY ...

  8. js中将字符串转换成json的三种方式

    1,eval方式解析,恐怕这是最早的解析方式了.如下: function strToJson(str){ var json = eval('(' + str + ')'); return json; ...

  9. 玩儿了一下django User authentication

    五一在家,VPN不能链接了,而项目在本地run的过程中,又需要链接公司的SSO server才能login.下雨,不想去公司,又不得不在家做task,只能想办法避开SSO login,以前知道djan ...

  10. ArcGIS Engine开发之旅10--空间参考及坐标转换

    原文:ArcGIS Engine开发之旅10--空间参考及坐标转换 空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确 ...