spritekit吧 关注:96贴子:391
  • 20回复贴,共1

(原创)swift+spritekit中文教程第一篇

只看楼主收藏回复

前言:学了三个月的时候,就打算写一个教程的,但是后来一直忙于开发。直到11.30号提交了上一个游戏,这才腾出一小段时间,打算整理一下过去所学的,结合自己的经历,出一个简单的教程抛砖引玉,希望能帮助到那些苦于找不到简单易学的中文教程的童鞋们。好了废话不多说,准备好开发你自己的小游戏了吗?
呃呃,再说几句废话:本教程适用于入门独立开发者,我将会告诉你如何最快开发出游戏,但所使用的未必是最佳方案。本教程将使用纯swift+storyboard进行开发,所以你最好有一点点这两种技术的基础。
第一篇新建项目:
1.左侧选iOS,右侧选Game
2.名字随便写,语言Swift,技术Spritekit,设备随意。我选的是iPhone
3.位置随意放在电脑里
好了,你的第一个游戏这样就算奠基了~你可以跑一下command+R到虚拟器里~(我们将要做个什么游戏呢?之后就知道了~)
清理干净
好,下一步对你来说也许并不容易。但是请容许我有一点点代码洁癖,下面我们彻底删除GameScene.sks文件。由于Xcode对于sks文件的支持还并不完善,所以我们几乎用不到这个,任何操作都可以用代码完成,而且并不难。
删除文件之后打开GameViewController.swift,(注意:我的项目里没有使用任何前缀,如果你习惯加前缀,请自己对应)删除extension SKNode整个扩展,大概十几行,这个是用来加载sks文件的。
然后进入viewDidLoad方法,将if let scene = ...改为let scene = GameScene(size:CGSizeMake(1024,768))或者其他你想要的尺寸。移除if语句的其他部分。我们不使用sks文件来加载场景,而是直接用GameScene类初始化了一个场景实例。
ps:此时你可以运行一下,结果并没有任何变化~
创建精灵
进入GameScene.swift文件,我们要正式开工了~按照惯例,干掉didMoveToView和touchesBegan里的所有代码。注释写的比较清楚了,前者是一个view首次加载好并放到屏幕上的瞬间,会调用到的一个函数,在这里,你可以放所有你准备展示在玩家面前的内容(加载游戏内容)。后者是玩家点击屏幕的时候,会调用的一个函数(处理玩家操作)。以下简称load和touch
首先,在load中加入如下代码:
var plane = SKSpriteNode(imageNamed: "Spaceship")//可以在Images.xcassets中找到默认飞船图片plane.position = CGPointMake(self.size.width * 0.5, self.size.height * 0.5)//self是指当前场景,左下角为坐标原点self.addChild(plane) //添加精灵到场景中
可以运行一下,我们会发现屏幕中央多了一个飞机。
使用纹理
游戏中会用到很多素材,如果总是用上面的方式加载,图样图森破,too low to slow。如果有多个相同的怪物,他们可以共用一套纹理,这样可以提高游戏运行效率。
在load中,初始化plane之前,添加如下代码:
var planeTexture = SKTexture(imageNamed: "Spaceship")
将var plane = SKSpriteNode(imageNamed: "Spaceship")修改为var plane = SKSpriteNode(texture: planeTexture)
很简单吧,这样我们就使用了纹理技术来创建一个精灵。


IP属地:辽宁1楼2014-12-02 00:47回复
    原链接:http://segmentfault.com/blog/flappyheart/1190000002400319


    IP属地:辽宁2楼2014-12-02 00:48
    收起回复
      吧主好棒好腻害
      带我一起飞~~


      IP属地:上海4楼2014-12-08 15:50
      收起回复
        lz加油继续写啊


        IP属地:江苏来自iPhone客户端5楼2014-12-22 07:37
        收起回复
          出错的把gameViewController代码贴一下


          IP属地:辽宁6楼2015-01-30 13:52
          回复
            override func viewDidLoad() {
            super.viewDidLoad()
            // if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
            if let scene = GameScene(size:CGSizeMake(1024,768)){
            // Configure the view.
            let skView = self.view as SKView
            skView.showsFPS = true
            skView.showsNodeCount = true
            /* Sprite Kit applies additional optimizations to improve rendering performance */
            skView.ignoresSiblingOrder = true
            /* Set the scale mode to scale to fit the window */
            scene.scaleMode = .AspectFill
            skView.presentScene(scene)
            }
            }
            试过无效
            在if let scene = ...那一行出现错误,Bond value in a conditional binding must be of Optional type
            在GameScene后加?,会提示多余的size参数
            如果把整个if删掉留下let scene = GameScene(size:CGSizeMake(1024,768))则编译器不报错,但是运行后界面什么都没有
            刚刚花一个星期啃完swift基础语法今天刚接触spritekit的纯小白路过求教


            IP属地:上海7楼2015-01-31 18:08
            收起回复
              最后有一点不太明白,为什么用texture加载会比直接加在效率高呢?


              IP属地:广东8楼2015-03-27 21:41
              收起回复