Swift 不能使用 Sphero 碰撞检测?
Can't use Sphero collision detection with Swift?
我是 Swift 和 Sphero 开发的新手,但有人要求我制作一款基于与 Sphero 碰撞的游戏。
到目前为止,我已经成功地实现了驱动部分,但我遇到了碰撞问题。
我一直在整个 Internet 上寻找代码示例和类似问题,但我发现的所有内容都是基于其他语言,如 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的官方页面某处实现了collision streaming方法时,这些疑惑更加强烈,但是对于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 实现它的任何方法?
提前谢谢你。
本SDK是在Objective-C中编写的; Swift 通过 Objective-C 内置于 Swift 的互操作性来工作。无论您选择哪种语言,一切都应该有效。看起来您可能缺少响应观察器。在你调用 robot.addResponseObserver(self)
的机器人上确保你实现了 RKResponseObserver
协议。
我是 Swift 和 Sphero 开发的新手,但有人要求我制作一款基于与 Sphero 碰撞的游戏。 到目前为止,我已经成功地实现了驱动部分,但我遇到了碰撞问题。 我一直在整个 Internet 上寻找代码示例和类似问题,但我发现的所有内容都是基于其他语言,如 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的官方页面某处实现了collision streaming方法时,这些疑惑更加强烈,但是对于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 实现它的任何方法? 提前谢谢你。
本SDK是在Objective-C中编写的; Swift 通过 Objective-C 内置于 Swift 的互操作性来工作。无论您选择哪种语言,一切都应该有效。看起来您可能缺少响应观察器。在你调用 robot.addResponseObserver(self)
的机器人上确保你实现了 RKResponseObserver
协议。