Objective c 我如何实现射击的敌人?
我用SpriteKit做了一个游戏。我通过编写一个游戏场景(SKScene)和一个单独的敌人类来构建我的游戏。 我想让产卵的敌人射出一个粒子,例如,每2秒(只是移动一个SKEmitterNode的y轴),我尝试用定时器来完成,但它并没有真正起作用 我在游戏场景中使用以下代码调用我的敌人类: 游戏场景.mObjective 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
-(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,请参阅: