Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)

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

样例说明:

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

时间: 2024-11-08 18:16:05

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

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

1,先把背景图片bg.jpg,[email protected]直接拖进Images.xcassets中 2,设置如下代码(背景图直接铺满整个屏幕) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import SpriteKit class GameScene: SKScene {     //当切换到这个场景视图后     override func didMoveToView(view: SKView) {         //将Images.xcassets

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

一,什么是SpriteKit SpriteKit是苹果公司官方出品,用于制作2D游戏的框架.这个框架具备了图形渲染和动画的功能.可以使图像或者精灵(sprite)动 起来.SpriteKit的渲染方式是传统的环形渲染,允许在渲染前处理每一帧点的内容.例如定义场景中的元素,以及这些内容在每一帧中是如何变化的.尤 其重要的是,苹果官方出品的这个SpriteKit能够很有效地利用图形硬件来渲染. 除了图形渲染,SpriteKit还包括了声音播放和物理系统.在Xcode中,我们可以很轻易地创建复杂的特效

SpriteKit游戏开发点滴[4] 适配屏幕的技巧

适配屏幕的技巧 多屏幕分辨率可真是开发者的死对头啊!常言道:你若屏幕分辨多,我就自挂东南枝- 不过对于游戏开发而言,一旦理解了适配屏幕的原理,便可无敌于众多的屏幕分辨率了. 在开始游戏开发时,我们预设一个"原始屏幕",在原始屏幕上绘制各种游戏元素: 当实际将游戏部署到不同分辨率的设备上时,再将"原始屏幕"绘(ying)制(she)到实际屏幕上去. 在映射到实际屏幕的过程中,如果"实际屏幕"的长宽比和"原始屏幕"的不同,就要考虑

IOS 2D游戏开发框架 SpriteKit

最近发现Xcode自带的2D游戏开发框架SpriteKit可以直接引入到APP中进行混合开发,这就是说可以开发出既带业务应用又带游戏的苹果APP,咋怎么觉得这是一个自己的小发现....呵呵.....,查了下其实人家早有人这样做了........发现这功能我当然很开了,所以下了两个案例准备学学.以前业余时间也学过一下cocos2d-x这样的跨平台游戏框架,也做过小案例,所以感觉这个框架并不麻烦,而且比cocos2d-x简单.并且这框架我不应该像C2D-X那样学了就扔哪里不管了,因为IOS开发正是我

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

作者:孙志超链接:https://www.zhihu.com/question/24733255/answer/42000966来源:知乎著作权归作者所有,转载请联系作者获得授权. 当然可以,但难道有个引擎,就可以做出真正商业化的游戏么?而且国产游戏大部分是网游啊. 几年前的老文--<一个人的服务器端>(只是为了说明游戏开发难度,不是针对题主问题.) 技术准备 能够做这个MMO的触发点是通过某些途径得到了某个大公司使用的一款3D引擎,其他的都是白手起家.当时大家还不知道有"分布式服务

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

在国内,如果你没有听说过<王者荣耀>,那你一定是古董级的人物了. <王者荣耀>(以下简称“农药”),专注于移动端(Android.IOS)的MOBA游戏.笔者看到这么火爆,就萌生了了解一下这类游戏的开发历程,本专栏的目标是做一个类MOBA的Demo. 俗话说,不去瞎琢磨的程序员,不是好司机. 好的,直接进入正题. 一.农药用什么语言和软件开发 小伙伴看到农药运行在Android和IOS平台上,估计第一个想到的就是 java / kotlin 和 Object-C / swift 了

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

准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 写在前面的话 没有什么比重复造轮子更让人心碎的事情了. (如果有,那就是造了两遍) 是否有必要开发游戏引擎? 现在市面上有很多成熟的跨平台游戏引擎,对个人开发者也较为友好 若你是一名C#开发者,可以选择CocosSharp或Unity3D 尤其Unity3D,用它开发2D和3D游戏一样出色 当然,亲自编写一款简单的2D游戏引擎也是一件让人自信感满满的事情

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

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

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

原文:Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-5-6 踩踏平台是怎么炼成的 在游戏中,有很多分来飞去的平台,这个平台长短不一.如果每种长度都去创建一张图片那是比较繁琐的事情.实际上,我们只用到3张图.分别是平台的,平台的中间部分,平台的右边.关键是平台的中间部分,两张中间部分放在一起能够很好地衔接起来,这样只要增加中间部分的数量就能创建不同长度的平台.那这种图片该怎么制作呢?我们先找一张平台的完整图 然后切出中间部分. 这时候,我们能够发现,两块中间部分能够无缝的拼在一起.那么我们就