zoukankan      html  css  js  c++  java
  • Swift

    下面通过一个样例演示如何实现飞行道具的生成,以及道具碰撞拾取。


    样例说明:
    1,屏幕从右到左不断地生成苹果飞过来(苹果高度随机)
    2,点击屏幕可以让熊猫跳跃
    3,熊猫碰到苹果,苹果消失

    运行效果:


    样例代码:
    苹果工厂类 AppleFactory.swift
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    import SpriteKit
     
    class AppleFactory:SKNode{
        //定义苹果纹理
        let appleTexture = SKTexture(imageNamed: "apple")
        //游戏场景的狂赌
        var sceneWidth :CGFloat = 0.0
        //定义苹果数组
        var arrApple = [SKSpriteNode]()
        //定时器
        var timer = NSTimer()
         
        func onInit(CGFloat) {
            self.sceneWidth = width
            //启动的定时器
            timer = NSTimer.scheduledTimerWithTimeInterval( 0.2, target: self,
                selector: "createApple", userInfo: nil, repeats: true)
        }
         
        //创建苹果类
        func createApple(){
            //通过随机数来随机生成苹果
            //算法是,随机生成0-9的数,当随机数大于8的时候声称苹果
            //也就是说,有1/10的几率生成苹果
            //这样游戏场景中的苹果就不会整整齐齐以相同间隔出现了
            let random = arc4random() % 10
            if random > 8 {
                //生成苹果
                let apple = SKSpriteNode(texture: appleTexture)
                //设置物理体
                apple.physicsBody = SKPhysicsBody(rectangleOfSize: apple.size)
                //弹性设为0
                apple.physicsBody?.restitution = 0
                //物理体标识
                apple.physicsBody?.categoryBitMask = BitMaskType.apple
                //不受物理效果影响
                apple.physicsBody?.dynamic = false
                //设置中心点
                apple.anchorPoint = CGPointMake(0, 0)
                //z轴深度
                apple.zPosition = 40
                //设定位置
                let theY = CGFloat(arc4random()%200 + 200)
                apple.position  = CGPointMake(sceneWidth+apple.frame.width , theY)
                //加入数组
                arrApple.append(apple)
                //加入场景
                self.addChild(apple)
            }
        }
         
        //苹果移动方法
        func move(speed:CGFloat){
            for apple in arrApple {
                apple.position.x -= speed
            }
            //移出屏幕外时移除苹果
            if arrApple.count > 0 && arrApple[0].position.x < -20{
                arrApple[0].removeFromParent()
                arrApple.removeAtIndex(0)
            }
        }
         
        //重置方法
        func reSet(){
            //移除所有子对象
            self.removeAllChildren()
            //清空苹果数组
            arrApple.removeAll(keepCapacity: false)
        }
    }
    熊猫类 Panda.swift
    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
    29
    30
    31
    32
    33
    import SpriteKit
     
    class Panda: SKSpriteNode {
        //定义纹理
        let pandaTexture = SKTexture(imageNamed: "panda")
         
        init() {
            //执行父类的构造方法
            super.init(texture:pandaTexture,color:SKColor.whiteColor(),size:pandaTexture.size())
            //设置中心点
            self.anchorPoint = CGPointMake(0, 0)
             
            self.physicsBody = SKPhysicsBody(rectangleOfSize:pandaTexture.size())
            self.physicsBody?.dynamic = true
            self.physicsBody?.allowsRotation = false
             
            //弹性
            self.physicsBody?.restitution = 0
            self.physicsBody?.categoryBitMask = BitMaskType.panda
            self.physicsBody?.contactTestBitMask = BitMaskType.scene|BitMaskType.apple
            self.physicsBody?.collisionBitMask = BitMaskType.scene
        }
         
        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
         
        //跳
        func jump (){
            //施加一个向上的力,让小人跳起来
            self.physicsBody?.velocity = CGVectorMake(0, 700)
        }
    }
    碰撞标识类 - BitMaskType.swift
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class BitMaskType {
        class var panda:UInt32{
            return 1<<0
        }
        class var apple:UInt32{
            return 1<<1
        }
        class var scene:UInt32{
            return 1<<2
        }
    }
    主场景 - GameScene.swift
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import SpriteKit
     
    class GameScene: SKScene,SKPhysicsContactDelegate {
        lazy var appleFactory = AppleFactory()
        lazy var panda = Panda()
         
        //移动速度
        var moveSpeed:CGFloat = 15
        //吃到的苹果数
        var appleNum = 0
         
        override func didMoveToView(view: SKView) {
            //物理世界代理
            self.physicsWorld.contactDelegate = self
            //重力设置
            self.physicsWorld.gravity = CGVectorMake(0, -5)
            //设置物理体
            self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
            //设置种类标示
            self.physicsBody?.categoryBitMask = BitMaskType.scene
            //是否响应物理效果
            self.physicsBody?.dynamic = false
             
            //场景的背景颜色
            let skyColor = SKColor(red:113/255,green:197/255,blue:207/255,alpha:1)
            self.backgroundColor = skyColor
             
            //给小人定一个初始位置
            panda.position = CGPointMake(200, 400)
            //将小人显示在场景中
            self.addChild(panda)
             
            //苹果工厂
            appleFactory.onInit(self.frame.width)
            self.addChild( appleFactory )
        }
         
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            panda.jump()
        }
        
        override func update(currentTime: CFTimeInterval) {
            appleFactory.move(moveSpeed)
        }
         
        //碰撞检测方法
        func didBeginContact(contact: SKPhysicsContact) {
            //熊猫和苹果碰撞
            if (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask)
                == (BitMaskType.apple | BitMaskType.panda){
                    //苹果计数加1
                    self.appleNum++
                    //如果碰撞体A是苹果,隐藏碰撞体A,反之隐藏碰撞体B
                    //(因为苹果出了屏幕都会被移除,所以这里隐藏就可以了)
                    if contact.bodyA.categoryBitMask == BitMaskType.apple {
                        contact.bodyA.node?.hidden = true
                    }else{
                        contact.bodyB.node?.hidden = true
                    }
            }
        }
    }


    源码下载:EatApple.zip

  • 相关阅读:
    第十三周总结
    第一阶段意见评论
    第十二周总结
    关于transform的3D变形函数
    12.9学习内容
    12.8学习的内容
    这是自己的第一篇博客
    食物链
    poj1988Cute Stacking
    银河英雄传说
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4841108.html
Copyright © 2011-2022 走看看