1,默认创建的工程目录结构如下:
AppDelegate.swift:应用入口文件;
GameScene.sks : 游戏情景可视化文件;
GameScene.swift : 游戏场景控制类;
GameViewController.swift : 游戏视图控制类;
Main.storyboard : 应用程序故事板;
Assets.xcassets : 游戏资源目录
LaunchScreen.storyboard : 闪屏页;
info.plist : 应用信息文件;
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"。
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++ } } }
4,小结
此段代码中,主要涉及类SKSpriteNode、SKScene类,简单看下这两个类的继承关系,如下:
原文链接:https://www.f2er.com/swift/324972.html