Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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
Objective c 我如何实现射击的敌人?_Objective C_Methods_Sprite Kit_Nstimer_Game Physics - Fatal编程技术网

Objective c 我如何实现射击的敌人?

Objective c 我如何实现射击的敌人?,objective-c,methods,sprite-kit,nstimer,game-physics,Objective C,Methods,Sprite Kit,Nstimer,Game Physics,我用SpriteKit做了一个游戏。我通过编写一个游戏场景(SKScene)和一个单独的敌人类来构建我的游戏。 我想让产卵的敌人射出一个粒子,例如,每2秒(只是移动一个SKEmitterNode的y轴),我尝试用定时器来完成,但它并没有真正起作用 我在游戏场景中使用以下代码调用我的敌人类: 游戏场景.m -(void)enemiesLevel1{ EnemyClass* wave1 = [[EnemyClass alloc] init]; [wave1 enemiesLevel

我用SpriteKit做了一个游戏。我通过编写一个游戏场景(SKScene)和一个单独的敌人类来构建我的游戏。 我想让产卵的敌人射出一个粒子,例如,每2秒(只是移动一个SKEmitterNode的y轴),我尝试用定时器来完成,但它并没有真正起作用

我在游戏场景中使用以下代码调用我的敌人类:

游戏场景.m

 -(void)enemiesLevel1{
    EnemyClass* wave1 = [[EnemyClass alloc] init];
    [wave1 enemiesLevel1:self];
 }
-(void)enemiesLevel1:(SKScene *)scene
{
    enemy = [SKSpriteNode spriteNodeWithImageNamed:Enemy];
    //Enemy Path
    (...)

    SKAction *followPath2 = [SKAction followPath:pathRef2
                                        asOffset:NO
                                    orientToPath:YES
                                        duration: pathSpeed];




    SKAction *forever = [SKAction repeatActionForever:followPath2];



    //PhysicsBody Eigenshaften
    enemy.physicsBody =[SKPhysicsBody bodyWithCircleOfRadius:enemy.size.width];
    enemy.physicsBody.dynamic = YES;
    enemy.physicsBody.categoryBitMask = enemyCategory;

    [enemy runAction:forever];
    [scene addChild:enemy];

    NSTimer *timer;
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5
                                         target:self
                                       selector:@selector(weaponParticle)
                                       userInfo:nil
                                        repeats:YES];
    }




-(void)weaponParticle{


    screenHeight = self.frame.size.height;
    screenWidth = self.frame.size.width;

    //Schuss-Particles

    enemyParticlePath = [[NSBundle mainBundle] pathForResource:@"ShootFire" ofType:@"sks"];
    enemyParticle = [NSKeyedUnarchiver unarchiveObjectWithFile:enemyParticlePath];

    enemyParticle.physicsBody =[SKPhysicsBody bodyWithCircleOfRadius:0.2];
    enemyParticle.physicsBody.categoryBitMask = shootCategory;
    enemyParticle.physicsBody.contactTestBitMask = playerCategory;

    //Schuss-Action
    moveDown = [SKAction moveByX:0.0 y:-screenHeight duration:1.0];
    remove = [SKAction removeFromParent];
    weaponShot = [SKAction sequence:@[moveDown, remove]];

    enemyParticle.position = CGPointMake(enemy.position.x, enemy.position.y+10);



    [self addChild:enemyParticle];
    [enemyParticle runAction: weaponShot];

}
我基本上是从EnemyClass.m

 -(void)enemiesLevel1{
    EnemyClass* wave1 = [[EnemyClass alloc] init];
    [wave1 enemiesLevel1:self];
 }
-(void)enemiesLevel1:(SKScene *)scene
{
    enemy = [SKSpriteNode spriteNodeWithImageNamed:Enemy];
    //Enemy Path
    (...)

    SKAction *followPath2 = [SKAction followPath:pathRef2
                                        asOffset:NO
                                    orientToPath:YES
                                        duration: pathSpeed];




    SKAction *forever = [SKAction repeatActionForever:followPath2];



    //PhysicsBody Eigenshaften
    enemy.physicsBody =[SKPhysicsBody bodyWithCircleOfRadius:enemy.size.width];
    enemy.physicsBody.dynamic = YES;
    enemy.physicsBody.categoryBitMask = enemyCategory;

    [enemy runAction:forever];
    [scene addChild:enemy];

    NSTimer *timer;
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5
                                         target:self
                                       selector:@selector(weaponParticle)
                                       userInfo:nil
                                        repeats:YES];
    }




-(void)weaponParticle{


    screenHeight = self.frame.size.height;
    screenWidth = self.frame.size.width;

    //Schuss-Particles

    enemyParticlePath = [[NSBundle mainBundle] pathForResource:@"ShootFire" ofType:@"sks"];
    enemyParticle = [NSKeyedUnarchiver unarchiveObjectWithFile:enemyParticlePath];

    enemyParticle.physicsBody =[SKPhysicsBody bodyWithCircleOfRadius:0.2];
    enemyParticle.physicsBody.categoryBitMask = shootCategory;
    enemyParticle.physicsBody.contactTestBitMask = playerCategory;

    //Schuss-Action
    moveDown = [SKAction moveByX:0.0 y:-screenHeight duration:1.0];
    remove = [SKAction removeFromParent];
    weaponShot = [SKAction sequence:@[moveDown, remove]];

    enemyParticle.position = CGPointMake(enemy.position.x, enemy.position.y+10);



    [self addChild:enemyParticle];
    [enemyParticle runAction: weaponShot];

}

敌人正按照我的要求一个接一个地繁殖,但他们不能射击。有人能帮我吗?

与其安排时间,不如尝试以下方法:

SKAction *shoot = [SKAction runBlock:^{
      // add code that shoots here
}];

SKAction *wait = [SKAction waitForDuration:0.5];
[enemy runAction:[SKAction repeatActionForever:[SKAction sequence:@[shoot, wait]]]];

好主意!因为某种原因还是不起作用?我通过在这个动作下放置一个NSLog来检查代码是否真的会运行,控制台显示了NSLog,但敌人仍然不射击。有什么想法吗?我再试了一次,现在我得到了这个打破游戏规则的错误:
2014-10-20 23:32:49.659像素平面[1791:352128]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“试图添加一个已经有父节点的SKNode:name:”(null)“particlexture:'spark.png”(20 x 16)位置:{0,0}累积帧:{{inf,inf},{inf,inf}}'
我猜这是因为我在游戏场景中已经有了玩家节点使用的相同粒子?如何防止这种情况发生?必须每次创建一个新节点/粒子。你不能重复使用它们。错误消息清楚地表明。基本上,不能对同一节点调用“addChild”方法两次。如果您需要更多帮助,请发布您的“武器粒子”代码。我已将其发布在EnemyClass.m文件下。如果我想“重用”一个节点而不是addChild,我必须使用什么代码?我发现了我的错误,在粒子节点上实际上有两个addChild方法。如果有人遇到相同的问题:不要在Sprite工具包中使用NSTimer,请参阅: