2015-01-17 52 views
0

好吧,所以在我的游戏中,我有一段代码,每隔x时间产生一个精灵('敌人')。它产生了高的精灵,而精灵则下降了。为什么物理学不按我想要的方式工作?

应该发生的事情是这样的:精灵倒下,它触及地面或其他敌人,然后它变成静态,所以它不能移动。

什么情况是这样的:有时它的工作原理,但有时(特别是当时间的X量小,精灵更经常产卵),而它仍然在空气中的精灵突然变为静态的。

这是怎么发生的?

下面是一些代码:

在GameScene.m ,在createSceneContents,一个由didMoveToView调用的方法:

self.physicsWorld.contactDelegate = self; 

SKSpriteNode *bottom = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(self.frame.size.width, 10)]; 
bottom.position = CGPointMake(self.frame.size.width/2, 0); 
bottom.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bottom.size]; 
bottom.physicsBody.dynamic = NO; 
bottom.physicsBody.restitution = 0; 
bottom.physicsBody.categoryBitMask = self.bottomCategory; 
bottom.physicsBody.contactTestBitMask = self.enemyCategory; 

[self spawnObject]; 
[self addChild:self.world]; 
[self.world addChild:bottom]; 

在spawnObject ,一个是被由createSceneContents调用的方法:

if (self.isPaused == NO){ 

    self.spawningSpeed = 1; 
    self.enemyData = [[Enemy alloc]init]; 
    SKAction *wait = [SKAction waitForDuration:self.spawningSpeed]; 
    SKAction *run = [SKAction runBlock:^{ 

     SKSpriteNode *aNewEnemy = [self.enemyData createEnemyWithSize:self.customUnit andWidth:self.frame.size.width andHeight:self.frame.size.height + self.player.position.y andPlayerPosition:self.player.position.x]; 
     aNewEnemy.physicsBody.allowsRotation = NO; 
     aNewEnemy.physicsBody.categoryBitMask = self.enemyCategory; 
     aNewEnemy.physicsBody.collisionBitMask = self.enemyCategory | self.bottomCategory; 
     aNewEnemy.physicsBody.contactTestBitMask = self.enemyCategory | self.bottomCategory; 
     [self.world addChild:aNewEnemy]; 



    }]; 
    SKAction *action = [SKAction repeatActionForever:[SKAction sequence:@[wait,run]]]; 
    [self runAction:action withKey:@"action"]; 

在createEnemyWithSize:andWidth:andHeight:andPlayerPosition :,在Enemy.m:

self.enemy = [SKSpriteNode spriteNodeWithImageNamed:@"block.png"]; 
self.enemy.size = CGSizeMake(size - 5, size - 5); 
self.enemy.name = @"fallingEnemy"; 
self.enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(size - 1, size - 1)]; 
self.enemy.physicsBody.restitution = 0; 
self.enemy.physicsBody.allowsRotation = NO; 

int column1 = width/7; 
int column2 = column1 * 2; 
int column3 = column1 * 3; 
int column4 = column1 * 4; 
int column5 = column1 * 5; 
int column6 = column1 * 6; 
int halfAColumn = column1/2; 

if (position > 0 && position < column1) { 
    self.enemy.position = CGPointMake(halfAColumn, height - size); 

}else if (position > column1 && position < column2) { 
    self.enemy.position = CGPointMake((column2-halfAColumn), height - size); 

}else if (position > column2 && position < column3) { 
    self.enemy.position = CGPointMake((column3-halfAColumn), height - size); 

}else if (position > column3 && position < column4) { 
    self.enemy.position = CGPointMake((column4-halfAColumn), height - size); 

}else if (position > column4 && position < column5) { 
    self.enemy.position = CGPointMake((column5-halfAColumn), height - size); 

}else if (position > column5 && position < column6) { 
    self.enemy.position = CGPointMake((column6-halfAColumn), height - size); 

}else if (position > column6 && position < width) { 
    self.enemy.position = CGPointMake((width-halfAColumn), height - size); 

} 

return self.enemy; 

在didBeginContact ,在GameScene.m:

SKPhysicsBody *enemyBodyA, *bottomBodyA, *enemyBodyB, *bottomBodyB; 
if (contact.bodyA.categoryBitMask == self.enemyCategory) { 
     enemyBodyA = contact.bodyA; 

}else if (contact.bodyA.categoryBitMask == self.bottomCategory) { 

     bottomBodyA = contact.bodyA; 

} 
    if (contact.bodyB.categoryBitMask == self.enemyCategory) { 
     enemyBodyB = contact.bodyB; 

}else if (contact.bodyB.categoryBitMask == self.bottomCategory) { 

     bottomBodyB = contact.bodyB; 

} 

     if (enemyBodyA == contact.bodyA && enemyBodyB == contact.bodyB) { 

     [self.enemyData changeBlock]; 


     NSLog(@"Change1"); 
    } 
    if (contact.bodyA == enemyBodyA && contact.bodyB == bottomBodyB) { 
     NSLog(@"Change2"); 
     [self.enemyData changeBlock]; 


    } 
    if (contact.bodyB == enemyBodyB && contact.bodyA == bottomBodyA) { 
     NSLog(@"Change3"); 
     [self.enemyData changeBlock]; 


    } 

在changeBlock ,在Enemy.m :

-(void)changeBlock { 
self.enemy.physicsBody.dynamic = NO; 
self.enemy.name = @"staticEnemy"; 
} 

createSce中的位掩码值neContents:

self.playerCategory = 1; 
self.enemyCategory = 2; 
self.edgeCategory = 4; 
self.bottomCategory = 8; 
+0

什么是您在联系人委托中调用changeBlock方法的self.enemyData? – ZeMoon

+0

敌人对象类 – Squid

+0

您需要停止将创建的敌方节点作为enemyData对象的属性。使用联系人委托中的body.node属性来获取联系的节点。目前的方式是搞砸了。我正在写一个答案,并在几分钟内发布。 – ZeMoon

回答

0

您可能会失去对另一个未产生接触的敌人的引用。因此需要做一些改变。你根本不需要敌人的自我财产。

首先,修改changeBlock方法,以便它可以在作为参数传递的任何块上执行。

-(void)changeBlock:(SKSpriteNode*)block { 
    block.physicsBody.dynamic = NO; 
    block.name = @"staticEnemy"; 
} 

然后清理contact委托方法。

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    SKPhysicsBody *firstBody, *secondBody; 

    //This is a useful technique for organising bodies in the contact delegate 
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) { 
     firstBody = contact.bodyA; 
     secondBody = contact.bodyB; 
    } else { 
     firstBody = contact.bodyB; 
     secondBody = contact.bodyA; 
    } 
    //Since enemyCategory < bottomCategory, the firstBody is an enemy node, and second either an enemy or bottom node 

    if (firstBody.categoryBitMask == self.enemyCategory && secondBody.categoryBitMask == self.bottomCategory) { 
     [self.enemyData changeBlock: (SKSpriteNode*)firstBody.node]; 
    } else if (firstBody.categoryBitMask == self.enemyCategory && secondBody.categoryBitMask == self.enemyCategory) { 
     [self.enemyData changeBlock: (SKSpriteNode*)firstBody.node]; 
     [self.enemyData changeBlock: (SKSpriteNode*)secondBody.node]; 
    } 
} 

我不确定你的游戏是什么,所以改变是你想要的。但我希望你明白这一点。

+0

它给我一个警告,当我通过spritenodes改变块,因为身体只是节点?我应该改变它还是忽略它?你组织尸体的方式非常聪明。非常感谢 – Squid

+0

是的,它不应该有任何区别。做什么是删除警告所需的。 – ZeMoon

+0

我也觉得你犯了一个小错误。你正在检查第一个/ secondBody等于一个类别而不是第一个/ secondBody.categoryBitMask – Squid

相关问题