【发布时间】:2015-08-27 10:36:44
【问题描述】:
我正在尝试制作一个游戏,其中的对象在屏幕的左右壁之间弹跳直到它们到达底部。
我在这些方法中创建对象,这些方法将对象存储在 NSMutable 数组中,并在游戏开始时调用。
-(void)createContent
{
self.backgroundColor = [SKColor colorWithRed:0.54 green:0.7853 blue:1.0 alpha:1.0];
world = [SKNode node];
[self addChild:world];
crabs = [NSMutableArray new];
[self performSelector:@selector(createCrabs) withObject:nil afterDelay:1];
}
-(void)createCrabs {
crab = [HHCrab crab];
[crabs addObject:crab];
[world addChild:crab];
crab.position = CGPointMake(world.scene.frame.size.width/12 , world.scene.frame.size.height/3.2);
[crab moveLeft];
//Next Spawn
[self runAction:[SKAction sequence:@[
[SKAction waitForDuration:10],
[SKAction performSelector:@selector(createCrabs) onTarget:self],
]]];
}
这将无休止地创建新对象,但问题始于碰撞检测。最初我的碰撞检测设置是这样的:
-(void)didBeginContact:(SKPhysicsContact *)contact
{
SKPhysicsBody *firstBody, *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
} else {
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
if (firstBody.categoryBitMask==crabCategory && secondBody.categoryBitMask == leftWallCategory) {
NSLog(@"Crab Hit Left Wall");
[crab stop];
[crab moveRight];
} else if (firstBody.categoryBitMask == crabCategory && secondBody.categoryBitMask == rightWallCategory) {
NSLog(@"Crab Hit Right Wall");
[crab stop];
[crab moveLeft];
}
}
但是,在地图上出现多个对象后,当原始对象与墙壁碰撞时,它开始出现故障并停止移动。这会导致生成新对象的错误堆积。 我还尝试使用 update CurrentTime 方法来查看碰撞检测是否会有所改善,但正如预测的那样,一次只有一个对象会移动,而其余对象将保持静止。
-(void)didBeginContact:(SKPhysicsContact *)contact {
SKPhysicsBody *firstBody, *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
} else {
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
if (firstBody.categoryBitMask==crabCategory && secondBody.categoryBitMask == leftWallCategory) {
NSLog(@"Crab Hit Left Wall");
self.crabTouchLeftWall = YES;
} else if (firstBody.categoryBitMask == crabCategory && secondBody.categoryBitMask == rightWallCategory) {
NSLog(@"Crab Hit Right Wall");
self.crabTouchRightWall = YES;
}
}
-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
for (HHCrab *crabNode in crabs){
if (self.crabTouchLeftWall){
[crabNode stop];
[crabNode moveRight];
self.crabTouchLeftWall = NO;
}
if (self.crabTouchRightWall){
[crabNode stop];
[crabNode moveLeft];
self.crabTouchRightWall = NO;
}
}
}
我该如何解决这个问题,以便当一个物体与墙壁碰撞时,它不会影响其他物体的运动,只会影响它自己?
【问题讨论】:
-
尝试使用 SKSpriteNodes 数组
-
WraithSeeker,我相信这就是我已经在做的事情。
-
@HansHartle 你是靠力移动螃蟹还是手动设置它们的位置属性?
-
@Whirlwind 我将它们向左/向右递增并永远运行该动作,当它们撞到墙上时,我删除动作并翻转方向。我确实使用重力来移动螃蟹,将它们拉到屏幕上。
标签: sprite-kit nsmutablearray collision-detection