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

SK物理触摸不要用子弹接触敌人

匡祖鹤
2023-03-14

我已经有我的categorybitmasks设置,希望是正确的,但我下面的代码应该有我的子弹和敌人接触,然后删除对方。什么也没发生,它们只是碰撞,仍然停留在屏幕上

func didBeginContact(联系人:SKPhysicsContact!){

  var firstBody: SKPhysicsBody!
  var secondBody: SKPhysicsBody!

  if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
    firstBody = contact.bodyA
    secondBody = contact.bodyB
  }
  else {
    firstBody = contact.bodyB
    secondBody = contact.bodyA
  }

  if (firstBody.categoryBitMask & bulletCategory) != 0 &&
    (secondBody.categoryBitMask & enemyCategory) != 0 {
        destroyEnemy(bullet: firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)
  }
}

func destroyEnemy(bullet: SKSpriteNode, enemy: SKSpriteNode) {
  
  bullet.removeFromParent()
  enemy.removeFromParent()
}
    enemy.physicsBody?.categoryBitMask = CollisionTypes.enemy.rawValue
    enemy.physicsBody?.contactTestBitMask = CollisionTypes.bullet.rawValue
    enemy.physicsBody?.collisionBitMask = CollisionTypes.bullet.rawValue

bullet.physicsBody?.categoryBitMask=CollisionTypes.bullet.rawValuebullet.physicsBody?.contactTestBitMask=CollisionTypes.enemy.rawValuebullet.physicsBody?.collisionBitMask=CollisionTypes.enemy.rawValue

共有1个答案

宋昕
2023-03-14

这本身不是一个答案,但评论有点长:

在您的didBegin中,您有:

if (firstBody.categoryBitMask & bulletCategory) != 0 &&
    (secondBody.categoryBitMask & enemyCategory) != 0 {
        destroyEnemy(bullet: firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)

如果firstBody是敌人,第二个是子弹会发生什么?当接触发生时,要运行的代码似乎不会触发。如果看不到你的分类比特掩码定义,我们就不知道,因为你似乎是按照分类比特掩码值的升序分配第一个和第二个身体。

您可以确认这是否与if块中的另一个print一起工作。

我从来没有真正喜欢过这种形式的< code>didBegin,我个人觉得这种风格更具可读性:

  func didBegin(_ contact: SKPhysicsContact) {
     print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))")

     let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

     switch contactMask {
     case bulletCategory | enemyCategory:
        print("bullet and enemy have contacted.")
        let bulletNode = contact.bodyA.categoryBitMask == bulletCategory ? contact.bodyA.node : contact.bodyB.node
        let enemyNode = contact.bodyA.categoryBitMask == enemyCategory ? contact.bodyA.node : contact.bodyB.node
        destroyEnemy(bullet: bulletNode, enemy: enemyNode)
     case playerCategory | enemyCategory:
        // Handle player/Enemy collisions
     default:
        print("Some other contact occurred")
     }
 类似资料:
  • 在本地MacOS应用程序的触摸栏中创建一个Popover弹出框 进程: 主进程​ new TouchBarPopover(options) 实验功能 用途:创建新Popover弹出框 options Object label String (可选) - Popover按钮文本 icon NativeImage (可选) - Popover按钮图标 items TouchBar (可选) - 在Po

  • 启用触摸保护 把 Yubikey-manager 安装在一个绝对路径:【译者注:homebrew 是 macOS 平台的包管理软件】 ❯ brew install libu2f-host libusb swig ykpers ❯ git clone git@github.com:Yubico/Yubikey-manager.git ❯ git submodule update --init --r

  • 为本机macOS应用程序创建TouchBar布局 进程: 主进程​ new TouchBar(options) 实验功能 用途:使用指定项目创建新的触摸条,使用 BrowserWindow.setTouchBar将 TouchBar加到窗口中 options - Object items (TouchBarButton | TouchBarColorPicker | TouchBarGroup |

  • 触摸操作概述 浏览器的触摸 API 由三个部分组成。 Touch:一个触摸点 TouchList:多个触摸点的集合 TouchEvent:触摸引发的事件实例 Touch接口的实例对象用来表示触摸点(一根手指或者一根触摸笔),包括位置、大小、形状、压力、目标元素等属性。有时,触摸动作由多个触摸点(多根手指)组成,多个触摸点的集合由TouchList接口的实例对象表示。TouchEvent接口的实例对

  • 触摸开关可以连接导电的物品,将它变成触摸开关。通过检测四色鳄鱼夹和地线的导通状态,能实现简单有趣的人机交互。 净重量:28.8g 体积:24×48×14mm 参数 触发电阻范围:<24MΩ 夹子大小:35mm 工作电压:DC 5V 抗跌落能力:1.5m 工作温度:-10℃~55℃ 工作湿度:<95% 特点 16种的输入组合 与其他模块丰富的离线互动效果 多样化的触发方式 定制化平口鳄鱼夹,大幅度减

  • 多路触摸上包含多个触摸传感器,可以检测对应触点被触摸的状态. 当检测到对应触点被触摸时,触点对应的指示灯会亮起。同时你可以通过鳄鱼夹或导线,将触摸传感器上的触点引出,比如通过导线将触点与水果相连,这将大大扩宽该模块的应用场景。 该模块能够智能地调节阈值,每一次断电重启后,该模块都会重置阈值,确保触点连接各种导电材质后,依旧能够灵敏的检测触摸事件。你还可以使用软件中的编程积木进一步调节触摸传感器的灵