检测用户何时点击 SKSpriteNode
Posted
技术标签:
【中文标题】检测用户何时点击 SKSpriteNode【英文标题】:Detecting when a user taps a SKSpriteNode 【发布时间】:2015-02-15 12:05:39 【问题描述】:我是 Swift 编程的新手,我决定从 SpriteKit 开始制作一个简单的游戏。我有一个 SpriteNode,它应该选择 6 个位置中的 1 个并在被点击时移动到那里,但是从我所看到的方法中我无法弄清楚如何实现它(我还是新手)这里是我来自 GameScene.swift 文件的代码:
import SpriteKit
class GameScene: SKScene
override func didMoveToView(view: SKView)
let screenSize: CGRect = UIScreen.mainScreen().bounds
let greenTileWidth = screenSize.width * 0.5
let greenTileHeight = screenSize.height * 0.33
let greenTilePositionY = [greenTileHeight / 2, greenTileHeight / 2 + greenTileHeight, greenTileHeight / 2 + greenTileHeight * 2 ]
let greenTilePositionX = [greenTileWidth / 2, greenTileWidth / 2 + greenTileWidth]
let backgroundTile = SKSpriteNode(imageNamed: "whiteTile")
backgroundTile.size.width = screenSize.width * 100
backgroundTile.size.height = screenSize.height * 100
addChild(backgroundTile)
let greenTile = SKSpriteNode(imageNamed: "greenTile")
greenTile.size.width = greenTileWidth
greenTile.size.height = greenTileHeight
greenTile.position.y = greenTilePositionY[0]
greenTile.position.x = greenTilePositionX[0]
greenTile.userInteractionEnabled = true
addChild(greenTile)
var randomX:Int = 0
var randomY:Int = 0
func getRandomY() -> Int
randomY = Int(arc4random_uniform(26))%3
return randomY
func getRandomX() -> Int
randomX = Int(arc4random_uniform(26))%2
return randomX
func moveGreenTile()
greenTile.position.x = greenTilePositionX[randomX]
greenTile.position.y = greenTilePositionY[randomY]
getRandomX()
getRandomY()
moveGreenTile()
当 SpriteNode greenTile 被点击时,getRandomY() getRandomX() 和 moveGreenTile() 应该被调用。
【问题讨论】:
【参考方案1】:首先您必须设置SKSpriteNodes
的name
属性:
greenTile.name = "greenTile"
首先我看到您的代码中有一些错误。 getRandomX
和 getRandomY
的返回值永远不会被真正使用。因为您设置了randomX
和randomY
变量而没有实际调用getRandom
。因此,您应该将其更新为:
func moveGreenTile()
greenTile.position.x = greenTilePositionX[getRandomX()]
greenTile.position.y = greenTilePositionY[getRandomY()]
这样你只需要调用moveGreenTile
,它就会自己调用getRandom
方法。
然后你必须使用touchesBegan
方法来检查用户是否触摸了屏幕。因此,使用名称,您可以通过检查您之前设置的名称来检查用户是否触摸了greenTile
:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
for touch in touches
let location = touch.locationInNode(self)
let node:SKNode = self.nodeAtPoint(location)
if(node.name == "greenTile")
moveGreenTile()
【讨论】:
我添加了您的代码,但它给出了错误“只能在类成员上指定覆盖”,并且 if 语句中的moveGreenTile()
给出了错误“无法引用具有来自另一个本地捕获的本地函数函数”
这个答案似乎检测到 SKSpriteNode 是否被触摸,而不是按照请求的问题被点击?【参考方案2】:
此代码检测 SKSpriteNode 上的点击事件,而不仅仅是触摸。
您可以通过修改TapMaxDelta
来更改轻击手势的敏感程度。
class TapNode : SKSpriteNode
// Tap Vars
var firstPoint : CGPoint?
var TapMaxDelta = CGFloat(10)
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
init()
let texture = SKTexture(imageNamed: "Test.png")
super.init(texture: texture, color: UIColor.clear, size: texture.size())
isUserInteractionEnabled = true
// ================================================================================================
// Touch Functions
// ================================================================================================
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
if let firstTouch = touches.first
firstPoint = firstTouch.location(in: self)
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
if let firstTouch = touches.first, let firstPoint = firstPoint
let curPoint = firstTouch.location(in: self)
if abs(curPoint.x - firstPoint.x) <= TapMaxDelta && abs(curPoint.y - firstPoint.y) <= TapMaxDelta
print("tap yo")
【讨论】:
以上是关于检测用户何时点击 SKSpriteNode的主要内容,如果未能解决你的问题,请参考以下文章
无法点击 SKSpriteNode - 未检测到触摸 ios
检测用户何时点击加载在 UIWebView 或 WKWebView 中的 web 表单