- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
下面是我的“Floor.swift”类,下面基本上是一堆墙。我有来自屏幕顶部的对象,一旦 Floor 和 SKSpriteNodes 发生碰撞,我希望 SKSpriteNode 被移除。下面是我的 Floor 类。
import Foundation
import SpriteKit
class Floor: SKNode {
override init() {
super.init()
let leftWall = SKSpriteNode(color: UIColor.clear, size: CGSize(width: 5, height: 50))
leftWall.position = CGPoint(x: 0, y: 50)
leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size)
leftWall.physicsBody!.isDynamic = false
self.addChild(leftWall)
let rightWall = SKSpriteNode(color: UIColor.clear, size: CGSize(width: 5, height: 50))
rightWall.position = CGPoint(x: 375, y: 50)
rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size)
rightWall.physicsBody!.isDynamic = false
self.addChild(rightWall)
let bottomWall = SKSpriteNode(color: UIColor.clear, size: CGSize(width: 500, height: 10))
bottomWall.position = CGPoint(x: 150, y: -5)
bottomWall.physicsBody = SKPhysicsBody(rectangleOf: bottomWall.size)
bottomWall.physicsBody!.isDynamic = false
self.addChild(bottomWall)
self.physicsBody = SKPhysicsBody(bodies: [leftWall.physicsBody!, rightWall.physicsBody!, bottomWall.physicsBody!])
self.physicsBody?.categoryBitMask = floorCategory
self.physicsBody?.contactTestBitMask = nailDropCategory | pointCategory | lifeCategory
self.physicsBody?.collisionBitMask = balloonCategory
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemted")
}
}
我在“func didBegin(_ contact: SKPhysicsContact)”下的 GameScene 类中写道:
func didBegin(_ contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == nailDropCategory | pointCategory | lifeCategory) && (contact.bodyB.categoryBitMask == floorCategory) {
// contact.bodyB.node!.removeFromParent()
print("COLLISION")
}
}
如您所见,在我的 Floor 类中,我将对象设置为“self.physicsBody = SKPhysicsBody(bodies:)”以及我所有的 SKSpriteNode。但出于某种原因,我没有得到任何检测。我让我的“Floor”类成为我的 objectCategory、pointCategory、lifeCategory 的每个类上的“contactTestBitMask”。这个问题我已经坚持了一分钟了,有什么想法吗?
更新:
所以我现在正在使用下面的这段代码,它可以正常工作!唯一的问题是,默认情况下也删除了我的“balloonCategory”,我不希望它这样做。我怎样才能让它只忽略那个类别,同时充当气球的墙?
func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case balloonCategory | nailDropCategory:
print("nailDrop and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false))
lifeLost -= 1
case balloonCategory | pointCategory:
print("point and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
totalPoints += 2
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
case balloonCategory | lifeCategory:
print("life and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
lifeLost += 1
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
default:
contact.bodyB.node!.removeFromParent()
print("Removed \(String(describing: contact.bodyB.node!.name))")
}
}
最佳答案
听起来您会受益于为所有对象类型分配名称,如下所示:
class Balloon: SKSpriteNode {
init() {
super.init(texture: nil, color: .blue, size: CGSize(width: 50, height: 50))
self.name = "balloon"
}
}
现在,当您在开关中进行检查时,您可以在决定删除对象之前验证对象的身份。在下面的 switch 语句中查看我对 default case 所做的更改。这样,如果节点是气球,则不会被删除。物理碰撞将继续起作用。
func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case balloonCategory | nailDropCategory:
print("nailDrop and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false))
lifeLost -= 1
case balloonCategory | pointCategory:
print("point and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
totalPoints += 2
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
case balloonCategory | lifeCategory:
print("life and balloon have contacted.")
contact.bodyB.node!.removeFromParent()
lifeLost += 1
self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false))
default:
if contact.bodyB.node!.name == "balloon" {
print("Balloon collided but we will not remove it.")
return
} else {
contact.bodyB.node!.removeFromParent()
print("Removed \(String(describing: contact.bodyB.node!.name))")
}
}
关于swift - SKPhysicsBody 碰撞不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47984735/
我正在 Swift 中使用 SpriteKit 制作一款平台游戏,其中涉及一个跳跃的主角。然而,一旦关卡加载,玩家就会立即掉到地上。 You can see it in action here. 我使
我有一个简单的游戏玩法,功能如下: 我的目标是检测球何时击中白色部分(游戏结束场景将加载)或球何时击中灰色部分(游戏继续) 因为形状缩小并且有很多东西在进行,我认为在需要时创建 SKPhysicsBo
我正在构建一个 SpriteKit“链式 react ”游戏,其中的圆圈在“爆炸”时会变大。我正在使用 SKPhysicsBody(circleOfRadius:) 初始值设定项来为圆圈创建物理体。
我正在按照《Swift 3 游戏开发》一书的说明创建一个简单的点击拍打游戏。我有两个 SKSpriteNode,一个是玩家,另一个是静态对象,如果接触就会伤害玩家。 对玩家的伤害将通过category
我必须遵循为我的敌人制作自定义physicalBody的代码。请参阅下面的代码: let offsetX = CGFloat(Enemy.frame.size.width * Enemy.anchor
我有一个随机迷宫生成器,它开始 build 小迷宫,然后进入大型关卡。 “C”是收藏品,“T”是瓷砖。 “P”是玩家的起始位置。我在下面包含了一个示例瓦片 map 。 当我有像这里这样的 6x12 小
是否可以检测节点是否仅在一侧与另一侧发生碰撞? 例如,一只动物与另一只动物发生冲突。在这种情况下,碰撞检测方法被调用。但是当动物跳过动物并在其上“行走”时,碰撞检测不会被激活。 我将不胜感激每一个答案
我有一个播放器。他必须跳过一些街区。 但是,似乎 SKPhysicsBody(rectangleOfSize: ... ) 没有正确对齐。当角色撞到方 block 的上半部分时,它只是穿过而他不能从下
我在屏幕上有一个图像,它是一个 SKSpriteNode,上面附有一个 SKPhysicsBody。我试图通过倾斜设备在屏幕上四处移动它。我让它沿 x 轴移动,但我似乎无法让它沿 y 轴移动。 我使用
有什么简单的方法可以测试 SKPhysicsBody 是否完全包含另一个? 像 bodyA 这样的东西包含了 bodyB 的每个点,左右。 只是想在实现一些 2D 数学助手之前问你如何使用附加的“元”
我正在创建一个简单的 Sprite Kit 游戏,但是当我将 PhysicsBody 添加到我的一个 Sprite 时,它似乎处于错误的位置。我知道它在我设置的错误位置skView.showsPhys
我将使用哪种 SKPhysicsBody 主体类型来创建椭圆物理主体? 我知道我可以用直线做一条曲线,只是让它不是一个真正的椭圆,但似乎必须有某种方法来挤压一个圆或创建一个圆? 最佳答案 Create
我的目标是旋转一个圆形节点,就像一个由电机驱动的轮子,例如顺时针旋转时,由于地板的摩擦力,轮子会向右移动。 根据其他线程,旋转 SKPhysicsBody 的方法是旋转它所连接的主体。 此代码旋转 S
出于某种原因,当我在这个场景中为这个 SKSpriteNodes 创建一个 SKPhysicsBody 时,物理体看起来比它们应该的小得多。例如(请忽略蓝链): 如您所见,形状在其下方复制,但主体要高
我想知道如何创建一个像这样更复杂的 SKPhysicsyBody?我想对黑色部分进行hittest。 我用 PaintCode 将这个形状导出到 CG 矩形。 var barrierpath2Path
我在父节点 B 中有一个节点 A。 我在节点 B 上使用 setScale 来产生缩放的错觉,但是当我这样做时,节点 A 及其所有 sibling 都没有预期的物理体。 尽管 A 看起来越来越小,但它
所以我正在尝试使用两个 SKPhysicsBody 对象。我在看一些教程来帮助处理碰撞机制并处理它。 我从其中一个教程中提取了这段代码: func didBeginContact(contac
我目前正在开发一款游戏,其中我有一张圆柱形物体的图片,我用以下内容制作了一个 SKPhysicsBody: self.oval.node.physicsBody = SKPhysicsBody(tex
下面是我的“Floor.swift”类,下面基本上是一堆墙。我有来自屏幕顶部的对象,一旦 Floor 和 SKSpriteNodes 发生碰撞,我希望 SKSpriteNode 被移除。下面是我的 F
我想知道是否有一个工具可以用来在 SpriteKit 中轻松生成复杂的物理体。我想要一个具有多边形形状的基于体积的物理体。 SpriteKit 允许使用该方法创建这样的主体: + (SKPhysics
我是一名优秀的程序员,十分优秀!