SpriteKit工程简读
来源:互联网 发布:淘宝上买避孕套干净吗 编辑:程序博客网 时间:2024/04/28 18:47
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类,简单看下这两个类的继承关系,如下:
- SpriteKit工程简读
- 创建SpriteKit工程
- SpriteKit
- SpriteKit 初探
- SpriteKit 横屏显示
- SpriteKit碰撞检测
- SpriteKit-粒子效果-SKEmitterNode
- SpriteKit 个人学习总结
- SpriteKit 学习笔记(一)
- flappybird + swift + spriteKit
- SpriteKit(基础用法)
- SpriteKit碰撞检测
- 初探 Swift SPriteKit
- SpriteKit 笔记整理(不全)
- Spritekit中播放背景音乐
- iOS_SpriteKit_01_初识SpriteKit
- SpriteKit 1-SKScene
- SpriteKit中应用TexturePacker
- 字符串的基本操作,c语言实现
- 【C语言提高42】结构体的高级话题:偏移量
- LINUX、C#下使用DES算法CBC模式进行对称加密、解密
- ###xcode开发iOS的app可能用到的几个文件夹路径
- php array
- SpriteKit工程简读
- 第一次看到html的动画效果,好神奇
- 一点js
- 关于自己对2016年的一些想法
- Swift 写个简单的UITableView
- UPnP协议编程实践(一)
- Java工作流引擎学习----JBPM(一)
- LeetCode N-Queens
- 插入排序