检测Sprite纹理内的触摸而不是整个框架iOS Swift SpriteKit?

检测Sprite纹理内的触摸而不是整个框架iOS Swift SpriteKit?,第1张

概述我现在正在使用SpriteKit,我遇到了一个看起来很简单但我在互联网上找不到的问题.我有三个按钮形状像平行四边形堆叠在一起,它看起来像这样: Screenshot of buttons let button = SKSpriteNode(imageNamed: "playbutton")let leaderButton = SKSpriteNode(imageNamed: "leaderbut 我现在正在使用SpriteKit,我遇到了一个看起来很简单但我在互联网上找不到的问题.我有三个按钮形状像平行四边形堆叠在一起,它看起来像这样:
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?所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1077475.html

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

发表评论

登录后才能评论

评论列表(0条)

保存