1

我正在制作一个让敌人射击东西的 cocos2d 应用程序。很多时候,当一个精灵被编程为在其队友被杀后移动到一个随机位置时,它会直接进入其他同类敌人的交火中。我如何制作一些东西来检查它是否在移动,因为大多数时候,游戏看起来就像是敌人试图自杀。我希望敌人能够自己,但不是在他们移动时。

-(void)enemy2{

    enemy2 = [CCSprite spriteWithFile:@"enemy2.png"];
    int d = arc4random()%480+480;
    int o = arc4random()%320+320;
    x = arc4random()%480;
    if( x <= 480 && x>= 460){
    x=x-100;
}
if(x <= 100){
    x = x+50;
}

y = arc4random()%320;
if(y <=320 && y >= 290){
    y = y-100;
}
if(y < 100){
    y = y + 100;
}
enemy2.position = ccp(o,d);

xc = x;
te = y;
   [enemytwo addObject :enemy2];




[self addChild:enemy2];

for(CCSprite *enetw in enemytwo){

    CCRotateBy *rotation = [CCRotateBy actionWithDuration:15 angle:1080];
    CCRepeatForever * repeatforever = [CCRepeatForever actionWithAction:rotation];

    int f = arc4random()%480;
    int s = arc4random()%320;      
    if( f <= 480 && s>= 460){
        f=f-100;
    }
    if(f <= 100){
        f = f+50;
    }

    s = arc4random()%320;
    if(s <=320 && s >= 290){
        s = s-100;
    }
    if(s < 100){
        s = s + 100;
    }

    CCMoveTo *move = [CCMoveTo actionWithDuration:0.8 position:ccp(f,s)];
    [enetw runAction: repeatforever];
    [enetw runAction:[CCSequence actions:move, nil]];



}

}

弹丸:

-(void)projectileShooting:(ccTime)dt {
 [self schedule:@selector(projectileShooting:) interval:2.5];
projcount++;
if([proj count] <= 15 )
if(enemy1.position.y < 320){
v = ccp(player.position.x,player.position.y); 
for(CCSprite *enemies in enemy){ 
    CCSprite * projectilebullet = [CCSprite spriteWithFile:@"Projectile.png"];
    [proj addObject:projectilebullet];
      [self addChild:projectilebullet];
        CGPoint MyVector = ccpSub(enemies.position,player.position );
        MyVector = ccpNormalize(MyVector);
        MyVector = ccpMult(MyVector, enemies.contentSize.width/2);
        MyVector = ccpMult(MyVector,-1);
        projectilebullet.position = ccpAdd(enemies.position, MyVector);





}

}

    for(CCSprite *enem2 in enemytwo){
      if(  [proj count] <= 15){
            CCSprite * projectilebull = [CCSprite spriteWithFile:@"Projectile.png"];

            CGPoint MyVector = ccpSub(enem2.position,player.position );
            MyVector = ccpNormalize(MyVector);
            MyVector = ccpMult(MyVector, enem2.contentSize.width/2+10);
            MyVector = ccpMult(MyVector,-1);
            projectilebull.position = ccpAdd(enem2.position, MyVector);

            [self addChild:projectilebull];  
          [proj addObject:projectilebull];
        for(CCSprite *projectile in proj){


        }

       }

    }



    }







-(void)bulletMovement:(CCSprite *)bullet{

CGPoint location = ccpSub(bullet.position, player.position);
location = ccpNormalize(location);
location = ccpMult(location, -1);
bullet.position = ccpAdd(bullet.position, location);

}

碰撞(在敌人2部分):

-(void)update{

    deletehealth = [[NSMutableArray alloc] init];
enemytwodelete  = [[NSMutableArray alloc]init];
enemythreedelete2  = [[NSMutableArray alloc]init];

NSMutableArray *playerdelete = [[NSMutableArray alloc] init];


NSMutableArray * deleteclean = [[NSMutableArray alloc]init ];
projectilesToDelete = [[NSMutableArray alloc] init];
enemydelete  = [[NSMutableArray alloc]init];
     for(CCSprite *projectile in proj)
{

    CGRect project = CGRectMake(projectile.position.x - (projectile.contentSize.width/2), 
                                projectile.position.y - (projectile.contentSize.height/2), 
                                projectile.contentSize.width, 
                                projectile.contentSize.height);


    CGRect playerRect = CGRectMake(player.position.x - (player.contentSize.width/2), 
                                   player.position.y - (player.contentSize.height/2), 
                                   player.contentSize.width, 
                                   player.contentSize.height);



    if (CGRectIntersectsRect(playerRect, project)) {
        [projectilesToDelete addObject: projectile];
        emitter = [[CCParticleExplosion alloc] init];
        emitter.texture = [[CCTextureCache sharedTextureCache]addImage:@"particle.png"];
        emitter.position = ccp(projectile.position.x,projectile
                               .position.y);
        [self addChild:emitter];
        // NSLog(@"%i",life);
        if(life > 0){
            //lifeholder = [[NSMutableArray alloc] init];
            life -= 5;

            [self.progressTimer setPercentage:life];
        }else{
            [playerdelete addObject:player];
            emitter.position = ccp(projectile.position.x,projectile
                                   .position.y);

            [[CCDirector sharedDirector]replaceScene:[CCTransitionFade transitionWithDuration:3 scene:[end node]]];
        }


    }

    for(CCSprite*enemies in enemy){
        CGRect enemyRect = CGRectMake((enemies.position.x-5), 
                                      enemies.position.y-8.3, 
                                      7, 
                                      15);


            if(CGRectIntersectsRect(enemyRect, project)){
                enemyex = [[CCParticleExplosion alloc] init];
               enemyex.texture = [[CCTextureCache sharedTextureCache]addImage:@"particle.png"];
               enemyex.position = ccp(enemies.position.x, enemies.position.y);
               [self addChild:enemyex];
                [enemydelete addObject:enemies];


                    [projectilesToDelete addObject:projectile];

                [self powerups];
                [self clear];


            }
    }   


    for(CCSprite * enemies2 in enemytwo){

    CGRect enemy2Rect = CGRectMake(enemies2 .position.x - (enemies2 .contentSize.width/2),
                                   enemies2 .position.y - (enemies2 .contentSize.height/2),
                                   enemies2 .contentSize.width, 
                                   enemies2.contentSize.height);

        if(CGRectIntersectsRect(enemy2Rect, project)){
           explode = [[CCParticleExplosion alloc] init];
            explode .texture = [[CCTextureCache sharedTextureCache]addImage:@"particle.png"];
            explode .position = ccp(enemies2.position.x, enemies2.position.y);
            [self addChild:explode ];

            [enemytwodelete addObject:enemies2];
            [projectilesToDelete addObject:projectile];
            [self powerups];
            [self clear];


        }

    }
4

1 回答 1

1

我会创建一个 BOOL 来存储角色是否在移动。每当角色要移动时,将该 BOOL 设置为 YES。由于您使用动作来移动精灵,因此您可以使用一系列动作,第一个动作是移动动作,然后第二个动作是一个将您的 BOOL 设置为 NO 的块。这样,一旦移动动作完成,它就会被存储起来供以后参考。它看起来像这样。

BOOL isObjectMoving;将其放在其他地方,可能在您的实体子类或其他任何地方

CCMoveTo *move = [CCMoveTo actionWithDuration:0.8 position:ccp(f,s)];
CCCallBlock *end = [CCCallBlock actionWithBlock:^{
     isObjectMoving = NO;
}];

isObjectMoving = YES; //Set it to YES until the movement action finishes and sets it back to NO

[yourObject runAction:[CCSequence actionOne:move actionTwo:end]];
于 2012-11-22T17:31:12.937 回答