Swift游戏实战-跑酷熊猫 12 与平台的碰撞

本文详细介绍了使用Swift实现熊猫在平台上奔跑的游戏逻辑,包括平台的物理属性设置、熊猫类的改造以及碰撞检测机制。通过代码示例,展示了如何在游戏开发中运用物理引擎实现角色与环境的互动。
原文: Swift游戏实战-跑酷熊猫 12 与平台的碰撞

 

这节主要实现熊猫和平台的碰撞,实现熊猫在平台上奔跑

 

要点

对平台进行物理属性设置

//设置物理体以及中心点
self.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.width, self.height), center: CGPointMake(self.width/2, 0))
//设置碰撞标示符
self.physicsBody.categoryBitMask = BitMaskType.platform
//不受碰撞影响
self.physicsBody.dynamic = false
//不允许角度变化
self.physicsBody.allowsRotation = false
//摩擦力
self.physicsBody.restitution = 0

改造熊猫类

//用或“|”分割需要进行检测的标示符
self.physicsBody.contactTestBitMask = BitMaskType.scene | BitMaskType.platform
//用physicsBody.collisionBitMask来设置产生碰撞效果的物体
self.physicsBody.collisionBitMask = BitMaskType.platform

平台类的代码

import SpriteKit
 

class Platform:SKNode{
    var width = 0.0
    var height = 10.0

    func onCreate(arrSprite:[SKSpriteNode]){
        for platform in arrSprite{
            platform.position.x=self.width
            self.addChild(platform)
            self.width += platform.size.width
        }
       
        self.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.width, self.height), center: CGPointMake(self.width/2, 0))
        self.physicsBody.categoryBitMask = BitMaskType.platform
        self.physicsBody.dynamic = false
        self.physicsBody.allowsRotation = false
        //摩擦力
        self.physicsBody.restitution = 0
    }
   
}

熊猫类的代码

import SpriteKit
 

enum Status:Int{
    case run=1,jump,jump2,roll;
}
 
class Panda : SKSpriteNode {
    let runAtlas = SKTextureAtlas(named: "run.atlas")
    let runFrames = [SKTexture]()
   

    let jumpAtlas = SKTextureAtlas(named: "jump.atlas")
    let jumpFrames = [SKTexture]();
   
    let rollAtlas = SKTextureAtlas(named: "roll.atlas")
    let rollFrames = [SKTexture]();
   
    var status = Status.run
 
    init(){
        let texture = runAtlas.textureNamed("panda_run_01")
        let size = texture.size()
        super.init(texture:texture,color:SKColor.whiteColor(),size:size)
       
        var i:Int
        for i=1 ; i<=runAtlas.textureNames.count ; i++ {
            let tempName = String(format: "panda_run_%.2d", i)
            let runTexture = runAtlas.textureNamed(tempName)
            if runTexture {
                runFrames.append(runTexture)
            }
        }
        for i=1 ; i<=jumpAtlas.textureNames.count ; i++ {
            let tempName = String(format: "panda_jump_%.2d", i)
            let jumpTexture = jumpAtlas.textureNamed(tempName)
            if jumpTexture {
                jumpFrames.append(jumpTexture)
            }
        }

        for i=1 ; i<=rollAtlas.textureNames.count ; i++ {
            let tempName = String(format: "panda_roll_%.2d", i)
            let rollTexture = rollAtlas.textureNamed(tempName)
            if rollTexture {
                rollFrames.append(rollTexture)
            }

        }
       
        self.physicsBody = SKPhysicsBody(rectangleOfSize: texture.size())
        self.physicsBody.dynamic = true
        self.physicsBody.allowsRotation = false
        //摩擦力
        self.physicsBody.restitution = 0
        self.physicsBody.categoryBitMask = BitMaskType.panda
        self.physicsBody.contactTestBitMask = BitMaskType.scene | BitMaskType.platform
        self.physicsBody.collisionBitMask = BitMaskType.platform
        run()
    }

    func run(){
        self.removeAllActions()
        self.status = .run
        self.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(runFrames, timePerFrame: 0.05)))
    }
   
    func jump (){
        self.removeAllActions()
        status = .jump
        self.runAction(SKAction.animateWithTextures(jumpFrames, timePerFrame: 0.05))
    }
   
    func roll(){
        self.removeAllActions()
        status = .roll
        self.runAction(SKAction.animateWithTextures(rollFrames, timePerFrame: 0.05),completion:{() in self.run()})
    }
   
}

 

项目文件地址

http://yun.baidu.com/share/link?shareid=3824235955&uk=541995622

 

Swift游戏实战-跑酷熊猫系列

00 游戏预览

01 创建工程导入素材

02 创建熊猫类

03 熊猫跑动动画

04 熊猫的跳和滚的动作

05 踩踏平台是怎么炼成的

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

07 平台的移动

08 产生源源不断的移动平台

09 移除场景之外的平台

10 视差滚动背景

11 欢迎进入物理世界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值