精灵套件的精确碰撞错误
precise collision error with sprite kit
我创建了一个英雄节点和敌人节点,当它们碰撞时,游戏 over.But我有精确碰撞的问题。有时,当一个节点未到达另一节点的帧时,会发生 overlap.Sometimes 冲突。有人可以给我一些建议吗?感谢您的帮助~
我的英雄受重力影响,点击时会改变重力方向。
以下是我的部分代码:
-(void)addRectHero {
rectHero = [SKSpriteNode spriteNodeWithImageNamed:@“hero.png”];
rectHero.scale = 0.2;
rectHero.position = CGPointMake(self.size.width/2, self.size.height*0.3);
rectHero.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rectHero.size];
rectHero.physicsBody.restitution = 0.0;
rectHero.physicsBody.allowsRotation = NO;
rectHero.physicsBody.dynamic = YES;
rectHero.physicsBody.affectedByGravity=NO;
rectHero.physicsBody.categoryBitMask = heroCategory;
rectHero.physicsBody.contactTestBitMask = enemyCategory;
rectHero.zPosition = 100;
rectHero.physicsBody.collisionBitMask = enemyCategory;
rectHero.physicsBody.usesPreciseCollisionDetection = YES;
[self addChild:rectHero];
}
-(void)createEnemy{
randomStartPoint =(float)((random()%(int)(self.size.height/3))+self.size.height/3);
startPoint = CGPointMake(self.size.width + 50, randomStartPoint);
enemyNode = [SKSpriteNode spriteNodeWithImageNamed:@"enemy_4.png"];
enemyNode.scale =0.5;
enemyNode.position = startPoint;
enemyNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:enemyNode.size];
enemyNode.physicsBody.dynamic = NO;
enemyNode.physicsBody.categoryBitMask = enemyCategory;
enemyNode.physicsBody.contactTestBitMask = heroCategory;
enemyNode.physicsBody.collisionBitMask = heroCategory;
enemyNode.physicsBody.usesPreciseCollisionDetection = YES;
enemyNode.physicsBody.allowsRotation = NO;
enemyNode.physicsBody.restitution = 0.0;
enemyNode.name = @"enemy";
[self addChild:enemyNode];
}
-(void)didBeginContact:(SKPhysicsContact *)contact{
if (!_gameIsOn) {
return;
}
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 == heroCategory && secondBody.categoryBitMask == enemyCategory) {
[self runAction:sound_play completion:^{
[self gameOver];
}];
[self stopTimer];
}
}
我在update方法中创建了很多敌人:(我也试过self repeatActionForever方法创建敌人但是问题依然存在)
-(void)update:(CFTimeInterval)currentTime {
if (_lastTime)
{
_dt = currentTime - _lastTime;
}
else
{
_dt = 0;
}
_lastTime = currentTime;
if( currentTime - _lastEnemyAdded > 1 && _gameIsOn)
{
_lastEnemyAdded = currentTime + 1;
[self createEnemy];
}
}
在您的 ViewController 中确保您再次 skView.showsPhysics = YES;
运行 您的游戏并查看您的物理体是否符合您的预期。听起来你正在创造一个比你想要的更大的物理 body。
如果问题最终变得比预期的物理量大 body,请尝试创建一个物理量 body,如下所示:
// to create a circular physics body
self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10 center:CGPointMake(0, 0)];
// to create a rect physics body
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20, 20) center:CGPointMake(0, 0)];
使用中心坐标将body正确居中。
要创建由多个形状组成的物理 body,您可以这样做:
SKPhysicsBody *firstBody = [SKPhysicsBody bodyWithCircleOfRadius:20 center:CGPointMake(0, 0)];
SKPhysicsBody *secondBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20, 20) center:CGPointMake(0, 20)];
self.physicsBody = [SKPhysicsBody bodyWithBodies:@[firstBody, secondBody]];
我创建了一个英雄节点和敌人节点,当它们碰撞时,游戏 over.But我有精确碰撞的问题。有时,当一个节点未到达另一节点的帧时,会发生 overlap.Sometimes 冲突。有人可以给我一些建议吗?感谢您的帮助~
我的英雄受重力影响,点击时会改变重力方向。
以下是我的部分代码:
-(void)addRectHero {
rectHero = [SKSpriteNode spriteNodeWithImageNamed:@“hero.png”];
rectHero.scale = 0.2;
rectHero.position = CGPointMake(self.size.width/2, self.size.height*0.3);
rectHero.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rectHero.size];
rectHero.physicsBody.restitution = 0.0;
rectHero.physicsBody.allowsRotation = NO;
rectHero.physicsBody.dynamic = YES;
rectHero.physicsBody.affectedByGravity=NO;
rectHero.physicsBody.categoryBitMask = heroCategory;
rectHero.physicsBody.contactTestBitMask = enemyCategory;
rectHero.zPosition = 100;
rectHero.physicsBody.collisionBitMask = enemyCategory;
rectHero.physicsBody.usesPreciseCollisionDetection = YES;
[self addChild:rectHero];
}
-(void)createEnemy{
randomStartPoint =(float)((random()%(int)(self.size.height/3))+self.size.height/3);
startPoint = CGPointMake(self.size.width + 50, randomStartPoint);
enemyNode = [SKSpriteNode spriteNodeWithImageNamed:@"enemy_4.png"];
enemyNode.scale =0.5;
enemyNode.position = startPoint;
enemyNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:enemyNode.size];
enemyNode.physicsBody.dynamic = NO;
enemyNode.physicsBody.categoryBitMask = enemyCategory;
enemyNode.physicsBody.contactTestBitMask = heroCategory;
enemyNode.physicsBody.collisionBitMask = heroCategory;
enemyNode.physicsBody.usesPreciseCollisionDetection = YES;
enemyNode.physicsBody.allowsRotation = NO;
enemyNode.physicsBody.restitution = 0.0;
enemyNode.name = @"enemy";
[self addChild:enemyNode];
}
-(void)didBeginContact:(SKPhysicsContact *)contact{
if (!_gameIsOn) {
return;
}
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 == heroCategory && secondBody.categoryBitMask == enemyCategory) {
[self runAction:sound_play completion:^{
[self gameOver];
}];
[self stopTimer];
}
}
我在update方法中创建了很多敌人:(我也试过self repeatActionForever方法创建敌人但是问题依然存在)
-(void)update:(CFTimeInterval)currentTime {
if (_lastTime)
{
_dt = currentTime - _lastTime;
}
else
{
_dt = 0;
}
_lastTime = currentTime;
if( currentTime - _lastEnemyAdded > 1 && _gameIsOn)
{
_lastEnemyAdded = currentTime + 1;
[self createEnemy];
}
}
在您的 ViewController 中确保您再次 skView.showsPhysics = YES;
运行 您的游戏并查看您的物理体是否符合您的预期。听起来你正在创造一个比你想要的更大的物理 body。
如果问题最终变得比预期的物理量大 body,请尝试创建一个物理量 body,如下所示:
// to create a circular physics body
self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10 center:CGPointMake(0, 0)];
// to create a rect physics body
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20, 20) center:CGPointMake(0, 0)];
使用中心坐标将body正确居中。
要创建由多个形状组成的物理 body,您可以这样做:
SKPhysicsBody *firstBody = [SKPhysicsBody bodyWithCircleOfRadius:20 center:CGPointMake(0, 0)];
SKPhysicsBody *secondBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20, 20) center:CGPointMake(0, 20)];
self.physicsBody = [SKPhysicsBody bodyWithBodies:@[firstBody, secondBody]];