不能在 Swift 中使用 Sphero 碰撞检测?

Posted

技术标签:

【中文标题】不能在 Swift 中使用 Sphero 碰撞检测?【英文标题】:Can't use Sphero collision detection with Swift? 【发布时间】:2016-06-15 10:38:41 【问题描述】:

我是 Swift 和 Sphero 开发的新手,但有人要求我制作一款基于与 Sphero 碰撞的游戏。 到目前为止,我已经成功地实现了驱动部分,但我遇到了碰撞问题。 我一直在互联网上寻找代码示例和类似问题,但我发现的所有内容都基于其他语言,如 JAVA 或 ObjectiveC。

Sphero官方页面提供的代码如下:

**Enable collision detection**

robot.enableCollisions(true)
robot.sendCommand(RKConfigureCollisionDetectionCommand(forMethod: .Method3, xThreshold: 50, xSpeedThreshold: 30, yThreshold: 200, ySpeedThreshold: 0, postTimeDeadZone: 0.2))

**Handle Async Messages on collision**

func handleAsyncMessage(message: RKAsyncMessage!, forRobot robot: RKRobotBase!) 
    if let collisionMessage = message as? RKCollisionDetectedAsyncData 
    // handleCollisionDetected
    
  

我已经尝试过很多方法,但是在执行时它不会发送任何命令,甚至不会访问 handleAsyncMessage 方法,所以我开始认为这段代码不是为 Swift 实现的。 当我发现在 ObjectiveC 的官方页面中某处实现了碰撞流方法时,这些疑虑更加严重,但对于 Swift 我只能找到 //Coming Soon!。

Collisions
  [_robot sendCommand:[[RKConfigureCollisionDetectionCommand alloc]
   initForMethod:RKCollisionDetectionMethod3
   xThreshold:50 xSpeedThreshold:30 yThreshold:200 ySpeedThreshold:0 postTimeDeadZone:.2]];

  ...
- (void)handleAsyncMessage:(RKAsyncMessage *)message forRobot:(id<RKRobotBase>)robot 
   if( [message isKindOfClass:[RKCollisionDetectedAsyncData class]]) 

  RKCollisionDetectedAsyncData *collisionAsyncData = (RKCollisionDetectedAsyncData *) message;

    float impactAccelX = [collisionAsyncData impactAcceleration].x;
    float impactAccelY = [collisionAsyncData impactAcceleration].y;
    float impactAccelZ = [collisionAsyncData impactAcceleration].z;

    float impactAxisX = [collisionAsyncData impactAxis].x;
    float impactAxisY = [collisionAsyncData impactAxis].y;

    float impactPowerX = [collisionAsyncData impactPower].x;
    float impactPowerY = [collisionAsyncData impactPower].y;

    float impactSpeed = [collisionAsyncData impactSpeed];


我应该将语言更改为 ObjectiveC 还是你们知道使用 Swift 实现它的任何方法? 提前谢谢你。

【问题讨论】:

【参考方案1】:

这个 SDK 是用 Objective-C 编写的; Swift 通过内置于 Swift 中的 Objective-C 互操作性来工作。无论您选择哪种语言,一切都应该正常工作。看起来您可能缺少响应观察者。在你调用robot.addResponseObserver(self) 的机器人上,确保你实现了RKResponseObserver 协议。

【讨论】:

就是这样,这件事快把我逼疯了……非常感谢!

以上是关于不能在 Swift 中使用 Sphero 碰撞检测?的主要内容,如果未能解决你的问题,请参考以下文章

Sphero 可以在不撞到物体的情况下检测到物体吗?

使用 Sphero 映射环境,如何获得更好的精度?

使用 SKSpritenodes/碰撞检测在 Swift 中自定义类

仅在矩形物理体的一侧检测碰撞 - Swift3

如何设置 SceneKit 碰撞检测

斯威夫特:分数增加两次,因为碰撞被检测到两次?