SpriteKit工程简读

SpriteKit工程简读,第1张

概述1,默认创建的工程目录结构如下: AppDelegate.swift:应用入口文件; GameScene.sks : 游戏情景可视化文件; GameScene.swift : 游戏场景控制类; GameViewController.swift : 游戏视图控制类; Main.storyboard : 应用程序故事板; Assets.xcassets : 游戏资源目录 LaunchScreen.st

@H_419_2@1,默认创建的工程目录结构如下:


AppDelegate.swift:应用入口文件;

GameScene.sks : 游戏情景可视化文件;

GameScene.swift : 游戏场景控制类;

GameVIEwController.swift : 游戏视图控制类;

Main.storyboard : 应用程序故事板;

Assets.xcassets : 游戏资源目录

LaunchScreen.storyboard : 闪屏页;

info.pList : 应用信息文件;

@H_419_2@2,代码简读

打开GameVIEwController.swift文件,在vIEwDIDLoad函数中:

        if let scene = GameScene(filenamed:"GameScene") {             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)        }
此处是使用的GameScene.sks创建的游戏场景,在此,暂且不用这种方法。

将上述代码去掉,添加如下代码:

        let skVIEw = self.vIEw as! SKVIEw        skVIEw.showsNodeCount = true        skVIEw.showsFPS = true        let scene = GameScene(size:skVIEw.bounds.size)        skVIEw.presentScene(scene)
在运行程序,经过闪屏后进入我们的游戏场景:GameScene,打开文件GameScene.swift,查看下为什么点击一下屏幕就会出现一个飞机对象呢?

OK,有没有看到处理触摸的函数:touchesBegan:

overrIDe func touchesBegan(touches: Set<UItouch>,withEvent event: UIEvent?) {       /* Called when a touch begins */                for touch in touches {            let location = touch.locationInNode(self)                        let sprite = SKSpriteNode(imagenamed:"Spaceship")            sprite.xScale = 0.5            sprite.yScale = 0.5            sprite.position = location                        let action = SKAction.rotateByAngle(CGfloat(M_PI),duration:1)                        sprite.runAction(SKAction.repeatActionForever(action))                        allPlane.append(sprite)                        self.addChild(sprite)        }    }

这个函数的处理逻辑很简单:遍历每一个触摸开始事件,获取其点击位置,创建一个飞机精灵,放置到触摸点。

点、点、点...... 一屏幕的飞机了,怎么删除掉呢??

嗯,我们设计为手指在屏幕上移动上时把飞机删除掉,那么,怎么处理手指移动的事件呢??

touchesBegan函数声明在UIResponder类中,查看此类代码,支持的触摸 *** 作:

    public func touchesBegan(touches: Set<UItouch>,withEvent event: UIEvent?)    public func touchesMoved(touches: Set<UItouch>,withEvent event: UIEvent?)    public func touchesEnded(touches: Set<UItouch>,withEvent event: UIEvent?)    public func touchesCancelled(touches: Set<UItouch>?,withEvent event: UIEvent?)

那么,在GameScene.swift中重写touchesMoved函数,在响应此函数中做一个移除相关精灵的 *** 作:
overrIDe func touchesMoved(touches: Set<UItouch>,withEvent event: UIEvent?) {        self.removeAllChildren()    }

Ok,这样在屏幕上移动时就会删除屏幕上所有的精灵,包括我们经典的"Hello world"。


@H_419_2@3,扩展

那怎么才能做到只删除我们触摸移动到的精灵上呢?

我们要把添加到屏幕上的飞机精灵存储在一个集合中,再在处理触摸拖动时获取拖动到的位置,遍历飞机精灵集合监测此位置是否有飞机精灵,有则删之。

1)声明一个存储飞机集合的变量,用一个数组,在dIDMovetovIEw函数前添加:

     var allPlane:[SKSpriteNode] = []

2)在touchesBegan函数中,self.addChild(sprite)语句后添加一句:

     allPlane.append(sprite)

3)重写touchesMoved函数
overrIDe func touchesMoved(touches: Set<UItouch>,withEvent event: UIEvent?) {        for touch in touches {            let location = touch.locationInNode(self)            //寻找在location的飞机精灵            var index = 0            for plane in allPlane {                if (plane.containsPoint(location)){                    print("Find sprite in location")                    allPlane.removeAtIndex(index)                    plane.removeFromParent()                    index--                }                index++            }        }    }

@H_419_2@4,小结

此段代码中,主要涉及类SKSpriteNode、SKScene类,简单看下这两个类的继承关系,如下:

总结

以上是内存溢出为你收集整理的SpriteKit工程简读全部内容,希望文章能够帮你解决SpriteKit工程简读所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1081102.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存