【发布时间】:2015-01-06 22:20:55
【问题描述】:
我正在尝试制作一个游戏,其中的对象在屏幕的左右壁之间弹跳直到它们到达底部。
目前,我的工作 didBeginContact 方法如下所示:
- (void)didBeginContact:(SKPhysicsContact *)contact {
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if (collision == (crabCategory | leftWallCategory)) {
// figure out which crab in the array made the contact...
for(HHCrab *object in crabs) {
if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
[object stop];
[object moveRight];
}
}
} else if (collision == (crabCategory | rightWallCategory)) {
// figure out which crab in the array made the contact...
for(HHCrab *object in crabs) {
if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
[object stop];
[object moveLeft];
}
}
}
当我尝试添加附加语句时:
else if (collision == (crabCategory | bottomWallCategory)) {
// figure out which crab in the array made the contact...
for(HHCrab *object in crabs) {
if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
[object stop];
[object resetPosition];
[object moveLeft];
}
}
}
当螃蟹到达屏幕底部时重置螃蟹位置,螃蟹不会移动。在之前的question 中,我意识到这可能是由于物理模拟覆盖了绘制螃蟹的事实。我们通过创建一个布尔值解决了这个问题,当螃蟹与底壁相交时,该布尔值将被打开和关闭,然后在 didSimulatePhysics 方法中重新定位螃蟹,如下所示:
-(void)didSimulatePhysics{
if(self.shouldResetPosition){
self.player.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMaxY(self.frame)- _player.size.height-30);
self.shouldResetPosition = NO;
}
}
虽然这适用于一只螃蟹,但现在我正在使用一个 NSMutable 螃蟹数组,每个螃蟹都有一个唯一的名称,但它不能。我尝试将布尔值移动到 Crab 类,因此每只螃蟹都有该属性,但这并没有解决问题。
【问题讨论】:
-
是的,你需要了解什么是“对象”。
-
如果您刚刚开始,那么在 Stack Overflow 上提出此类广泛的问题并不是您需要的地方。您应该找到一本好书或一系列在线教程。看看Good resources for learning ObjC。 Big Nerd Ranch 的书籍非常好,很多人喜欢 iTunes U 上的斯坦福 iOS 课程。祝你好运!
-
@Sangony 如果您能提供帮助,我将不胜感激 :)
标签: sprite-kit collision-detection