Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么物理没有按照我想要的方式工作?_Ios_Objective C_Sprite Kit - Fatal编程技术网

Ios 为什么物理没有按照我想要的方式工作?

Ios 为什么物理没有按照我想要的方式工作?,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,好的,在我的游戏中,我有一段代码,每x个时间产生一个精灵“敌人”。它会使精灵在高处产卵,而精灵则会坠落 应该发生的是这样的:精灵倒下,它接触到地面或其他敌人,然后它变成静止的,所以它不能移动 发生的情况是这样的:有时它是有效的,但有时特别是当x时间量更小,精灵产卵更频繁时,精灵在空气中突然变为静止 为什么会这样 下面是一些代码: 在GameSecene.m的CreateSeceneContents中,由didMoveToView调用的方法: 在spawnObject中,createSceneCo

好的,在我的游戏中,我有一段代码,每x个时间产生一个精灵“敌人”。它会使精灵在高处产卵,而精灵则会坠落

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

发生的情况是这样的:有时它是有效的,但有时特别是当x时间量更小,精灵产卵更频繁时,精灵在空气中突然变为静止

为什么会这样

下面是一些代码:

在GameSecene.m的CreateSeceneContents中,由didMoveToView调用的方法:

在spawnObject中,createSceneContents调用的方法:

self.playerCategory = 1;
self.enemyCategory = 2;
self.edgeCategory = 4;
self.bottomCategory = 8;
在CreateEneyWith:and Width:and Height:and PlayerPosition:中,在敌人中。m:

在变更块中,在敌人中。m:

CreateScenContents中的位掩码值:

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

你可能会丢失对敌人的引用,而在另一个敌人诞生之前,敌人还没有收到联系。因此,需要进行一些修改。你根本不需要敌方类中的敌我属性

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

-(void)changeBlock:(SKSpriteNode*)block {
    block.physicsBody.dynamic = NO;
    block.name = @"staticEnemy";
}
然后清理联系人委托方法

-(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];
    }
}

我不确定你的游戏是什么,所以改变是你想要的。但是我希望您能理解。

什么是self.enemyData,您正在联系人委托中调用其changeBlock方法?敌方类的对象您需要停止将创建的敌方节点作为enemyData对象的属性引用。使用contact委托中的body.node属性可使节点处于接触状态。现在的方式把事情搞砸了。我正在写一封回信,几分钟后就发出去。非常感谢。在过去的两个小时里,我非常沮丧,你真的帮助了我!同时,你能在设置位掩码值的地方发布代码吗?当我将spritenodes传递给changeblock时,它会给我一个警告,因为主体只是节点?我应该改变它还是忽略它?你组织尸体的方式真的很聪明。多谢了,这两种方式都不会有什么不同。按照要求删除警告。我还认为你犯了一个小错误。您正在检查first/secondBody是否等于类别,而不是first/secondBody.categoryBitMask
-(void)changeBlock {
self.enemy.physicsBody.dynamic = NO;
self.enemy.name = @"staticEnemy";
}
self.playerCategory = 1;
self.enemyCategory = 2;
self.edgeCategory = 4;
self.bottomCategory = 8;
-(void)changeBlock:(SKSpriteNode*)block {
    block.physicsBody.dynamic = NO;
    block.name = @"staticEnemy";
}
-(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];
    }
}