极致2d游戏开发

火男无脑开发录

前介

  • 开发引擎:SpriteKit
  • 开发语言:Swift
  • 其他:NodeJS(放弃) ,MySQL(放弃)

走着

我写了个标题叫极致,我要做个游戏,然后顺带写这个教程,但是实际上意思是反的,我以做个游戏的名义来特地写个教程。

先介绍将要开发的游戏,一款类似跑酷类型,主角为一只小兔子,游戏开始会一直往前冲,但是前面却是万丈深渊,所以需要玩家点击屏幕在下方生成一个平台,避免小兔子掉下去,玩家需要控制平台升降的高度,太高了小兔子会上不去gg,如果平台降得很低,小兔子也将掉出屏幕,同样gg。游戏的目标是,在有限的下降空间内让小兔子跑得更远,后面编写的后台程序将纪录下每次小兔子的跑酷纪录,然后写入数据库,当点开排名界面的时候,将从后台获取前10位玩家的纪录。

流程就介绍完了,开干吧……

因为打算只针对游戏开发流程,所以其他不相干的知识尽量摒弃,前提是熟悉Swift 这门语言,而SpriteKit 也仅支持Obj-CSwift

以下为将用到的美术资源


屏幕快照 2016-06-04 下午8.09.53.png

新建工程

屏幕快照 2016-06-04 下午8.11.16.png

屏幕快照 2016-06-04 下午8.11.51.png

直接选择Game ,填写项目名语言、框架、运行的平台。
屏幕快照 2016-06-04 下午8.12.16.png

next保存到目录,xcode与git是无缝衔接的,需要版本管理或远程协同就选上吧。
屏幕快照 2016-06-04 下午8.12.40.png

一个简单的工程,默认有架飞机,但是删掉,GameScene中涉及不相干逻辑的部分也删掉,并且不涉及游戏逻辑的类文件或资源文件放在新建的Group 中。

创建第一个类

configue 用来保存游戏中的全局属性。

屏幕快照 2016-06-04 下午8.14.29.png

游戏画面尺寸设置为1242*2208,因为我们的游戏场景是用的sks文件读取的方式,所以sks文件中需要手动设置一下场景尺寸跟winSize一致即可。

屏幕快照 2016-06-04 下午8.14.51.png

屏幕快照 2016-06-04 下午8.16.00.png

设计好游戏逻辑的层级关系

  • 菜单层
  • 角色层
  • 背景层
    屏幕快照 2016-06-04 下午8.55.59.png

    游戏中各类元素的前后关系写在configure中,姑且把configure看作是包含各种宏定义的类吧。
    屏幕快照 2016-06-04 下午9.01.08.png

    notificationCenter为获取的消息中心实例,backgroundMove``backgroundStop用来表示控制背景移动和停止的消息名称。

编写内容

屏幕快照 2016-06-04 下午9.05.30.png

先从地面平台开始,一步步拓展看,地面以一条三块土方组合成的平台柱子为一个单位,分为上中下,中层可以根据需要放置一个或者多个土块,上下土块固定好。

创建土块

打开GroundCobe.swift编写以下代码

屏幕快照 2016-06-04 下午9.11.45.png

以最上层的土块贴图创建SKSpriteNode对象,在此基础上添加中层土块,最后在底部添加下层土块。完成这一步,开始创建整个游戏的背景类,稍后将在背景类中添加土块。

创建背景

打开Background.swift编写以下代码

屏幕快照 2016-06-04 下午9.28.40.png

notificationCenter.addObserver(self, selector: #selector(Background.move), name: kBackgroundMove, object: nil)
notificationCenter.addObserver(self, selector: #selector(Background.stop), name: kBackgroundStop, object: nil)
添加两个消息监听用来控制背景的移动和停止,当小兔子掉落的时候,背景保持禁止,当小兔子跑动的时候,背景往后移动。

GameScene.swift中的didFinishUpdate中添加背景的更新函数调用

override func didFinishUpdate() {
        background.didFinishUpdate()
    }

创建小兔子

屏幕快照 2016-06-04 下午9.35.42.png

小兔子的素材分三组动画序列帧,跑动,禁止,下落

打开Player.swift编写以下代码

屏幕快照 2016-06-04 下午9.54.43.png

state用来表示小兔子当前的状态,并定义分别包含三种状态序列帧的贴图数组runTextures fallTextures stayTextures

添加以下方法,用来切换小兔子状态,并通知背景层做相应停止或移动处理,这样只需要控制小兔子的状态,便能让背景的状态与只同步。

//Mark:角色动作状态切换
func setState(newState: PlayerState){
    
    state = newState
    
    removeAllActions()
    
    switch state! {
        case .Run:
            let action = SKAction.animateWithTextures(runTextures, timePerFrame: 0.1)
            runAction(SKAction.repeatActionForever(action))
            //通知背景开始平移
            ����notificationCenter.postNotificationName(kBackgroundMove, object: nil)
        case .Fall:
            ��let action = SKAct����ion.animateWithTextures(fallTextures, timePerFrame: 0.2)
            runAction(action)
            //通知背景停止平移
            notificationCenter.postNotificationName(kBackgroundStop, object: nil)
        case .Stay:
            let action = SKAction.animateWithTextures(stayTextures, timePerFrame: 0.1)
            runAction(SKAction.repeatActionForever(action))
            //通知背景停止平移
            notificationCenter.postNotificationName(kBackgroundStop, object: nil)
    }

需要模拟兔子的坠落效果,那么给兔子添加物理体

private func setPhysics(){
        physicsBody = SKPhysicsBody(circleOfRadius: size.width * 0.4)
        physicsBody?.allowsRotation = false
        physicsBody?.categoryBitMask = Bitmask.player
        physicsBody?.collisionBitMask = Bitmask.cobe    //设置能与之产生物理碰撞的物体
        physicsBody?.contactTestBitMask = Bitmask.cobe | Bitmask.enemy  //设置能与之检测碰撞的物体
        physicsBody?.restitution = 0                    //设置反弹力度
    }

configure.swift中定义的各个物体物理体是UInt32类型,意味着一个游戏可以创建32种不同类型的物理体,应该足够了

//物理体
struct Bitmask{
    static let cobe:UInt32 = 0x1 << 1   //地面
    static let player:UInt32 = 0x1 << 2 //角色
    static let enemy:UInt32 = 0x1 << 3  //障碍物
}

在GameScene中合并它们

准确的说法是编写控制土块移动的交互代码和小兔子状态被动切换的代码

物理体协议

这个。。。有个小意外,本来是通过物理体碰撞来控制小兔子的状态切换,后来发现这种方式很不靠谱,所以不用了。而且后来我做的项目基本上是避免让他附带物理效果,或者能自己写编自己写,实际上原生得并不好控制细节(除非只需要真实的物理模拟)

让兔子活动起来

GameScene.swift下的Update函数中写一些简单代码

override func update(currentTime: CFTimeInterval) {
        
        //当小兔子位置超出屏幕便结束游戏
        if player.position.y < 0 || player.position.x > winSize.width || player.position.x < 0 {
            isGameover = true
        }
        
        //既然结束游戏了,下面就不执行了guard的具体含义百度百度
        guard !isGameover else{
            return
        }
        
        //通过获取小兔子当前的运动矢量来判断小兔子当前的状态
        //dy<0 意味着它正在下落,那么切换兔子状态吧
        //否则dx<0意味着它被卡住了,游戏结束,并切换状态为停止
        //否则意味着它在平地上了,那么让它跑起来吧
        let playerVelocity = player.physicsBody!.velocity
        if playerVelocity.dy < 0 {
            player.setState(.Fall)
        }else{
            if playerVelocity.dx < -0.05 {
                isGameover = true
                player.setState(.Stay)
            }else{
                
                player.setState(.Run)
            }
        }
    }
    

完事

大概就是这么个过程,原来还有不少东西要写,我简化了些,但是。。。这玩意能跑
呵呵
美术图地址:百度网盘

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 由于很多小伙伴要demo我就不一一发了,直接丢在github上自己下载吧:https://github.com/s...
    FKSky阅读 23,357评论 27 99
  • 总是在看纪录片的时候,在看到先人对于国家的信念,感到热泪盈眶,继而又会产生深深的无奈。这是个,没有太多信念的时代。
    科尔摩斯阅读 157评论 0 0
  • “人是欲望的傀儡!” “我是一名召唤师,问我召唤什么?那么 我告诉你,是欲望!” 当我说出这句话以后,整个召唤师聚...
    今何在jhz阅读 266评论 0 0
  • 那些年 鲜血染红了长髯 那些年 笛声美哭了云天 那些年 寒气拥抱着长剑 那些年 晚霞喧嚣过海湾 有故事的人 永远不...
    卍天下卐阅读 157评论 0 0
  • 6月份,杭州进入梅雨季节,24号早上,整个杭城都是倾盆大雨。中午吃过午饭,雨好像小了一点,因一天宅在宿舍,午觉从下...
    fly1a阅读 114评论 0 0