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

样例说明:
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(width: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

Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)的更多相关文章

  1. Swift - 创建并设置背景(SpriteKit游戏开发)

    1,先把背景图片bg.jpg,bg@2x.jpg直接拖进Images.xcassets中 2,设置如下代码(背景图直接铺满整个屏幕) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  2. Swift - 一步步教你使用SpriteKit创建开发游戏项目

    一,什么是SpriteKit SpriteKit是苹果公司官方出品,用于制作2D游戏的框架.这个框架具备了图形渲染和动画的功能.可以使图像或者精灵(sprite)动 起来.SpriteKit的渲染方式 ...

  3. iOS开发 Swift开发数独游戏(一)

    一.前言 我姥姥是一名退休数学老师,一直很喜欢玩数独游戏.我以前答应过她要给她写一个数独游戏.本来计划是写一个Android应用的,但恰好我学了好长时间iOS开发一直没做什么"大项目&quo ...

  4. 一个人独立开发 3D 游戏引擎可能吗?

    作者:孙志超链接:https://www.zhihu.com/question/24733255/answer/42000966来源:知乎著作权归作者所有,转载请联系作者获得授权. 当然可以,但难道有 ...

  5. IOS 2D游戏开发框架 SpriteKit

    最近发现Xcode自带的2D游戏开发框架SpriteKit可以直接引入到APP中进行混合开发,这就是说可以开发出既带业务应用又带游戏的苹果APP,咋怎么觉得这是一个自己的小发现....呵呵....., ...

  6. UWP简单示例(三):快速开发2D游戏引擎

    准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...

  7. 王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍

    在国内,如果你没有听说过<王者荣耀>,那你一定是古董级的人物了. <王者荣耀>(以下简称“农药”),专注于移动端(Android.IOS)的MOBA游戏.笔者看到这么火爆,就萌 ...

  8. 用Cocos2dx开发棋牌游戏的观点解析

    众所周知,目前棋牌游戏特别的火.很多游戏公司都想在这一块赚钱,可是却不知用什么软件比较好的去开发棋牌游戏,对此,我列出了两款比较靠谱的软件去开发棋牌游戏,希望对大家有帮助! 第一款软件是cocos2d ...

  9. HTML5外包注意事项-开发HTML5游戏的九大坑与解决方法剖析

    随着移动社区兴起,势必带动HTML5的革命.未来一两年内,HTML5移动游戏必将呈现大爆发趋势. 以下是整理的HTML5游戏研发.市场趋势以及渠道布局和技术解决方案的内容.希望大家能从本文中找到对HT ...

随机推荐

  1. [Swust OJ 1084]--Mzx0821月赛系列之情书(双线程dp)

    题目链接:http://acm.swust.edu.cn/problem/1084/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  2. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...

  3. 笔记之Cyclone IV 第一卷第一章FPGA 器件系列概述

    因为本人用的黑金四代开发板,中央芯片采用ALTERA的cycloneIV E,所以就此器件阅读altera官网资料,并做相应的笔记,以便于以后查阅 Cyclone IV 器件系列具有以下特性:■ 低成 ...

  4. Week10(11月11日):一个激动的日子

    Part I:提问  =========================== 请回答视图和控制器传递数据的方法. Part II:案例学习 =========================== Mu ...

  5. UIScrollView方法 属性详解

    --前言:UIScrollView使用非常广,本文研究UIScrollView各属性和方法,明白它们的意义.作用.在后面的一篇文章有整理UIScrollView一些常见用法以及一些效果的实现思路. - ...

  6. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  7. 快的打车 技术部 在 杭州 招聘 #年前面试 年后入职#架构师 - 内推网(neitui.me)

    快的打车 技术部 在 杭州 招聘 #年前面试 年后入职#架构师 - 内推网(neitui.me) 陈丹 (cd**@kuaidadi.com) 01-18 发布了内推 #年前面试 年后入职#架构师 • ...

  8. java--内部类访问final成员

    局部类只能访问外包方法中的final成员.位于方法内部的局部类,可以访问局部类之外,外包方法之内的所以变量和方法,但是生命周期不同,延长生命周期的办法就是将变量设置为final类型. 1)从程序设计语 ...

  9. jQuery格式化时间插件formatDate

    一.不传时间 $.formatDate("yyyy-MM-dd HH:mm:ss");   二.传时间 $.formatDate("yyyy-MM-dd HH:mm:ss ...

  10. docker学习笔记6:利用dockerfile创建镜像介绍(生成简单web服务器镜像)

    本文介绍如何利用dockerfile来创建镜像.下面介绍具体的操作过程: 一.创建构建环境 操作示例如下: xxx@ubuntu:~$ pwd /home/xxx xxx@ubuntu:~$ mkdi ...