当前位置: 首页 > 知识库问答 >
问题:

swift:未检测到精灵套件冲突和位掩码

李兴为
2023-03-14

我对以下精灵工具包代码有疑问。我试图检测飞球何时与线相撞。然而,当两者碰撞时,什么也没发生。但是,当球击中场景边缘时,将打印出以下内容:

联系人 1 位掩码1:4294967295位掩码2:4294967295

问题1:为什么没有检测到线和球的碰撞?问题2:为什么两个位掩码的边碰撞相同?如果我不知道哪个是哪个,我就无法处理尸体。

struct PhysicsCategory {
    static let None      : UInt32 = 0
    static let All       : UInt32 = UInt32.max
    static let Ball      : UInt32 = 0b1       // 1
    static let Line      : UInt32 = 0b10      // 2
    static let Shape     : UInt32 = 0b100     // 3 or 4?
}
override func didMoveToView(view: SKView) {
    /* Setup your scene here */       
    physicsWorld.contactDelegate = self

    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: view.frame);
    self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);

    let ball = SKShapeNode(circleOfRadius: 5)
    ball.fillColor = UIColor.whiteColor()
    ball.strokeColor = UIColor.whiteColor()
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.size.width/2)
    ball.physicsBody?.velocity = CGVector(dx: 200.0, dy: 200.0)
    ball.position = CGPoint(x: view.bounds.width/2, y:view.bounds.height/2)
    ball.physicsBody?.friction = 0.0;
    ball.physicsBody?.restitution = 1.0;
    ball.physicsBody?.linearDamping = 0.0;
    ball.physicsBody?.allowsRotation = false
    ball.physicsBody?.applyImpulse(CGVector(dx:CGFloat(100), dy:CGFloat(100)));
    ball.physicsBody?.categoryBitMask = PhysicsCategory.Ball
    ball.physicsBody?.dynamic = true
    ball.physicsBody?.contactTestBitMask = PhysicsCategory.Line
    ball.physicsBody?.collisionBitMask = PhysicsCategory.Line
    self.addChild(ball)
}

override func touches moved(touches:ns set,withEvent event: UIEvent) { /*当触摸开始时调用*/

    touch = touches.anyObject() as UITouch!

    var linePhysicsBody = SKPhysicsBody()
    linePhysicsBody.categoryBitMask = PhysicsCategory.Line
    linePhysicsBody.contactTestBitMask = PhysicsCategory.Ball
    linePhysicsBody.collisionBitMask = PhysicsCategory.Ball
    linePhysicsBody.dynamic = false
    linePhysicsBody.usesPreciseCollisionDetection = true

    lineNode = SKShapeNode()
    lineNode.physicsBody = linePhysicsBody
    lineNode.name = "drawingLine"
    lineNode.path = linePath
    lineNode.lineWidth = 5.0
    lineNode.strokeColor = UIColor.redColor()
    lineNode.glowWidth = 1.0

    self.addChild(lineNode)
}

func didBeginContact(contact: SKPhysicsContact) {

    println("contact \(++tempCounter)")
    println("bitmask1: \(contact.bodyA.categoryBitMask)")
    println("bitmask2: \(contact.bodyA.categoryBitMask)")
}

共有1个答案

皇甫波峻
2023-03-14

对于问题1:

你的线物理体的尺寸是0。你必须至少创建一个代表线的小矩形。否则就不会有碰撞。

对于问题2:

func didBeginContact(contact: SKPhysicsContact) {

    println("contact \(++tempCounter)")
    println("bitmask1: \(contact.bodyA.categoryBitMask)")
    println("bitmask2: \(contact.bodyA.categoryBitMask)")
}

有一个错别字。必须将 bodyB 用于位掩码 2

 类似资料:
  • 我正在使用Sprite Kit中的碰撞检测。它在起作用,防止我的精灵穿越路径。然而,我在didBeginContact中没有收到通知:而且我似乎无法控制物理引擎在发生碰撞时的响应。 我让各种汽车(SKSpriteNodes)使用SKAction followPath沿着以下路径行驶:as offset:oriento path:duration: 以前,如果两辆车相交,它们都会像往常一样继续行驶,

  • 我正在用Python pygame制作一个游戏,并制作了一个移动的背景,一个作为玩家的跳跃精灵和生成障碍物。现在我正在研究玩家和障碍物之间的碰撞,并编写了一些代码,但最终出现了错误: 我不知道,为什么那个类不是精灵,也不知道如何把它变成精灵。我希望修复这个错误后,碰撞工程。 播放器图像1 图像 2 背景图片3

  • 我是IOS开发的新手,目前在didBeginContact方法中遇到一些sprite工具包冲突问题。 如果一个碰撞的物理物体被移走了,我如何摆脱或者停止didBeginContact的运行?例:一颗子弹与两个重叠的敌人相撞。因为子弹击中第一个敌人并被摧毁,所以在第二个敌人上运行的碰撞检查抛出异常,因为子弹不再存在。 我试过检查nil和NSNULL值,但运气不好。我收到的错误代码是“线程1:EXC_

  • 在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义。 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列(按帧组成的序列),如下图所示: 图1:动作逐帧分解图 如果将逐帧分解后的动作,按照一定的频率播放,那么就形成了

  • 我在Android Studio中使用libgdx,并且我正在使用精灵碰撞检测。我需要知道如何检测两个形状不规则的精灵之间的碰撞。我的精灵是从png图像纹理创建的。是否可以使用子画面的边框作为检测表面?使用在子画面周围绘制的矩形或圆形将不够准确。感谢您的帮助!

  • 精灵位置 现在你知道了怎么创建和显示一个精灵,让我们学习如何定位他们的位置和改变他们的大小 在最早的示例里那个猫的精灵被放在了舞台的左上角。它的x和y坐标都是0。你可以通过改变它的x和y坐标的值来改变他们的位置。下面的例子就是你通过设置x和y为96坐标让它在舞台上居中。 cat.x = 96; cat.y = 96; 在你创建这个精灵之后,把这两行代码放进setup方法。 function set