2015-01-17 94 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

相關問題