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 に設定します。アクションを使用してスプライトを移動しているため、最初のアクションが移動アクションであり、2 番目のアクションが 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 に答える