Screenshot of buttons
let button = SKSpriteNode(imagenamed: "playbutton")let leaderbutton = SKSpriteNode(imagenamed: "leaderbutton")let homebutton = SKSpriteNode(imagenamed: "homebutton") button.position = CGPoint(x: size.wIDth/2,y: size.height/2) addChild(button) leaderbutton.position = CGPoint(x: size.wIDth/2,y: size.height/2 - button.size.height/2) addChild(leaderbutton) homebutton.position = CGPoint(x: size.wIDth/2,y: size.height/2 - button.size.height) addChild(homebutton)overrIDe func touchesBegan(touches: Set<UItouch>,withEvent event: UIEvent?) { for touch: AnyObject in touches { let location = touch.locationInNode(self) if button.containsPoint(location) { button.runAction(SKAction.scaleto(0.8,duration: 0.1)) } else if leaderbutton.containsPoint(location) { leaderbutton.runAction(SKAction.scaleto(0.8,duration: 0.1)) } else if homebutton.containsPoint(location) { homebutton.runAction(SKAction.scaleto(0.8,duration: 0.1)) } }}
这就是我检测触摸的方式.问题是它们重叠,因为精灵实际上是一个矩形,所以当我尝试点击第二个按钮的左上角时,顶部按钮会检测到它.我想知道有一种方法可以检测纹理中的触摸,就像你可以将物理体设置为纹理一样.
感谢你给与我的帮助!
链接现在工作.
所以我尝试了这个:
button.position = CGPoint(x: size.wIDth/2,y: size.height/2) button.physicsBody = SKPhysicsBody(texture: SKTexture(imagenamed: "playbutton"),size: button.size) button.physicsBody?.dynamic = false addChild(button) leaderbutton.position = CGPoint(x: size.wIDth/2,y: size.height/2 - button.size.height/2) leaderbutton.physicsBody = SKPhysicsBody(texture: SKTexture(imagenamed: "leaderbutton"),size: leaderbutton.size) leaderbutton.physicsBody?.dynamic = false addChild(leaderbutton) homebutton.position = CGPoint(x: size.wIDth/2,y: size.height/2 - button.size.height) homebutton.physicsBody = SKPhysicsBody(texture: SKTexture(imagenamed: "homebutton"),size: homebutton.size) homebutton.physicsBody?.dynamic = false addChild(homebutton)overrIDe func touchesBegan(touches: Set<UItouch>,withEvent event: UIEvent?) { for touch: AnyObject in touches { let location = touch.locationInNode(self) if physicsWorld.bodyAtPoint(location)?.node == button { button.runAction(SKAction.scaleto(0.8,duration: 0.1)) print("play") } if physicsWorld.bodyAtPoint(location)?.node == leaderbutton { leaderbutton.runAction(SKAction.scaleto(0.8,duration: 0.1)) print("leader") } if physicsWorld.bodyAtPoint(location)?.node == homebutton { homebutton.runAction(SKAction.scaleto(0.8,duration: 0.1)) } }}
它仍然记录整个帧而不仅仅是物理体.请参阅链接以查看按钮以及它们的坐标如何相交.
解决方法 如果将物理主体附加到每个按钮,则可以检测触摸所在的物理主体.您可以使用SKPhysicsBody(纹理:大小:)或SKPhysicsBody(纹理:AlphaThreshold:size :)从按钮的纹理(假设按钮是SKSpriteNode)生成物理主体,或者您可以创建描述按钮形状的CGPath并使用SKPhysicsBody (polygonFromPath :).将主体分配给按钮的physicsBody属性.假设您实际上不希望物理模拟器移动按钮,请将每个主体的动态属性设置为false.
然后你可以使用physicsWorld.bodyAtPoint(_ :)来获得一个触摸的物体(其中physicsWorld是你的SKScene的属性).使用body的node属性返回按钮节点.如果实体重叠,bodyAtPoint将返回任意实体.
如果你需要你触摸的所有物体,你可以使用physicsWorld.enumerateBodIEsAtPoint(_:usingBlock :).
一个完全不同的方法,如果你可以创建一个描述按钮形状的CGPath,就是使用SKScene.convertPointFromVIEw(_ :)然后使用SKNode.convertPoint(_:fromNode:_)将点转换为按钮的坐标系,然后使用CGPathContainsPoint(一个全局函数)来检测该点是否在描述按钮形状的路径中.
总结以上是内存溢出为你收集整理的检测Sprite纹理内的触摸而不是整个框架iOS Swift SpriteKit?全部内容,希望文章能够帮你解决检测Sprite纹理内的触摸而不是整个框架iOS Swift SpriteKit?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)