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

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

在游戏中,有很多分来飞去的平台,这个平台长短不一。如果每种长度都去创建一张图片那是比较繁琐的事情。实际上,我们只用到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

时间: 2024-08-02 13:29:35

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

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

原文:swift语言实战晋级-第9章 游戏实战-跑酷熊猫-9-10 移除平台与视差滚动 9.9 移除场景之外的平台 用为平台是源源不断的产生的,如果不注意销毁,平台就将越积越多,虽然在游戏场景中看不到.几十个还看不出问题,那几万个呢?几百万个呢? 所以我们来看看怎么移除平台,那什么样的平台需要移除呢?又如何移除呢?之前我们也说过,当平台完全移除游戏场景的时候就可以进行移除操作了.需要做两个操作,1从平台工厂类中移除,2从平台数组中移除. 而且,因为平台是一个接一个出现的,所以我们不需要每次都遍历

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

原文:Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的 这节内容我们一起学习下随机长度的踩踏平台的原理是怎么样的. 要点: 平台的组成 我们的平台由3部分组成 左: 中: 右: 其中中间部分是可以无缝衔接的,下面就是两个中间部分衔接在一起 要任何长度的平台,就只需要增加中间模块. 前后能衔接的中间模块的制作: 其实这种左右能够衔接的模块制作过程也很简单 我们只要拿出平台的一半 切出中间部分 然后水平翻转再拼在一起 就完成了中间部分的制作,然后我们把剩余的左边部分再水平翻转,就完成了右边部

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

学习目标 一.进一步学习Swift的游戏制作 二.掌握SKNode,SKSpriteNode的运用 三.了解SpriteKit的物理系统 四.掌握动作(SKAction)的运用 在这一章,我们要通过制作跑酷熊猫这个游戏来进一步学习Swift的游戏开发.首先我们要知道自己将要编写的是一个什么样的游戏.先来看一下游戏截图. 跑酷熊猫是一个跑酷类的游戏.我们将操控熊猫这个胖纸施展轻功,在或长或短的平台上飞奔,同时还要收集小苹果.跑的越远,收集的苹果越多,成就越高.不小心掉落平台,游戏就失败.那么做这样

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

在上个小节,我们完成了平台的产生.那么我们来实现一下让平台移动.平台的移动,我们只需要在平台工厂类中写好移动的方法,然后在GameScene类中统一控制就行了. 在GameScene类中,有个update方法会每隔一定的时间调用,用来控制平台的移动再适合不过了. 首先,我们在GameScene类中定义一个移动速度: //移动速度 var moveSpeed:CGFloat = 15 然后在update方法方法中调用平台工厂类的移动方法: override func update(currentT

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

当我们创建好项目文件后我们就可以开始一步一步的按照我们之前列入的清单来编写我们的游戏.现在就让我们来创建一个熊猫这个类Panda.swift.我们将采取分解的方式,一步一步的完成Panda.swift的编写 首先,我们要导入SpriteKit框架 import SpriteKit 接着我们创建一个枚举值,用来记录熊猫的不同状态,分别是跑,跳,二段跳,打滚. enum Status:Int{ case run=1,jump,jump2,roll; } 注意: 在Swift中,当给枚举的首个名称设置

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

一个静态的熊猫明显不能满足我们的欲望,接下来我们就让熊猫跑起来.序列帧动画的原理就是不停的切换不同的图片.当我们将一张一张的切换Panda类的跑动文理后,熊猫就跑起来了.那么首先我们需要一个数组常量来储存跑动动画文理,还有一个变量来记录熊猫当前的动作状态. let runFrames = [SKTexture]() //动作状态,默认值为枚举中的跑 var status = Status.run 然后我们通过for循环获取跑动动画的所有文理存入runFrames中.由于我们使用了SKTextur

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

之前我们学会了跑的动作,现在我们可以利用同样的方法来实现了跳和打滚的动画. …… class Panda : SKSpriteNode { …… //跳的纹理集合 let jumpAtlas = SKTextureAtlas(named: "jump.atlas") //存储跳的文理的数组 let jumpFrames = [SKTexture](); //打滚的文理集合 let rollAtlas = SKTextureAtlas(named: "roll.atlas&qu

Swift游戏实战-跑酷熊猫 07 平台的移动

这节内容我们来实现平台是怎么产生移动动画的. 要点 1 利用数组存放平台 var platforms=[Platform]() 2 有新的平台产生存放进数组 platforms.append(platform) 3 利用主场景的update方法不断地调用平台工厂类的move方法 override func update(currentTime: CFTimeInterval) { platformFactory.move(self.moveSpeed) } 4 move方法接收一个参数,是平台移

Swift游戏实战-跑酷熊猫 11 欢迎进入物理世界

物理模拟是一个奇妙的事情,以此著名的游戏有愤怒的小鸟.我们在这节将会一起来了解如何设置重力,设置物理包围体,碰撞的检测. 要点: 设置物理检测的代理: 让主场景遵循SKPhysicsContactDelegate协议.通过didBeginContact方法来响应物体之间是否碰撞.自然,我们要把物理系统的代理设为主场景. self.physicsWorld.contactDelegate = self 设置重力: self.physicsWorld.gravity = CGVectorMake(0