我已经知道如何使用doesintersectNode
Cocos3d 中的 - 方法检查碰撞,但就我而言,我想在接触障碍物之前避开障碍物。例如,我想在撞到墙之前停在墙前。
出于这个原因,我getNodeAtLocation
在 CC3Scene 的子-(BOOL)shouldMoveDirectionallywithDistance:(float)distance
类和我的 person 类中编写了方法,这些方法应该可以移动。不幸的是,我对最后一种方法的算法有一些问题。这里的代码:
-(BOOL)shouldMoveDirectionallywithDistance:(float)distance
{
BOOL shouldMove = NO;
float x = self.person.globalLocation.x;
float z = self.person.globalLocation.z;
int times = 5;
for (int i = 0; i < times; i++) {
CC3Vector newPos = cc3v(x, 0.5, z);
CC3PODResourceNode *obstacle = (CC3PODResourceNode *)[myScene getNodeAtLocation:newPos];
if (obstacle) {
return NO;
}else{
shouldMove = YES;
}
x += self.person.globalForwardDirection.x * distance / times;
z += self.person.globalForwardDirection.z * distance / times;
}
return shouldMove;
}
在这种方法中,我得到了坐标的重要部分(对于我的建议,只是 x 和 z 值)并将它们增加了forwardDirection
. 我决定,当障碍物是薄壁时,这是有道理的。但是不知什么原因,这种方法行不通,人却能穿过这堵墙。那么我的代码中的问题在哪里?
我坚信,getNodeAtLocation
- 方法可以正常工作,因为我多次测试过它,但也许有我的错误:
-(CC3Node *)getNodeAtLocation:(CC3Vector )position
{
CC3Node *node = nil;
for (CC3PODResourceNode *aNode in self.children) {
if ([aNode isKindOfClass:[CC3PODResourceNode class]] ) {
for (CC3PODResourceNode *child in aNode.children) {
if (CC3BoundingBoxContainsLocation(child.globalBoundingBox, position)) {
node = aNode;
}
}
}
}
return node;
}
总而言之,在我看来,错误在于-(BOOL)shouldMoveDirectionallywithDistance:(float)distance
- 方法。我想,x- 和 z-values 的增加是有问题的,但我不知道究竟是什么不正确。