2

スプライトに雪のパーティクル エフェクトを追従させたいので、いくつかの方法を試しましたが、最終的には、雪が追従するのではなく静止したままになるだけです。私はこの1つのチュートリアルを行いました(見つけたらすぐに投稿します)。これは、火でそれを行う方法を示していますが、まったくうまくいきませんでした. チュートリアルや提案をいただければ幸いです。画面外で敵を作成すると書かれているスニペット部分に、何らかのコードを追加する必要があると思います。

   [self schedule:@selector(gameLogicboss:) interval:180 ];        
      [self schedule:@selector(updateboss:)];                

 -(void)addTarget1 {

     Boss *target1 = nil;    


     if ((arc4random() % 2) == 0) {{
      target1 = [WeakAndFastBoss boss];
   }}  else {
     target1 = [WeakAndFastBoss boss];
      }                      

       // Determine where to spawn the target along the Y axis
      CGSize winSize = [[CCDirector sharedDirector] winSize];
     int minY = target1.contentSize.height/2;
    int maxY = winSize.height - target1.contentSize.height/2;
    int rangeY = maxY - minY;
    int actualY = (arc4random() % rangeY) + minY;

  // Create the target slightly off-screen along the right edge,
      // and along a random position along the Y axis as calculated above
    target1.position = ccp(winSize.width + (target1.contentSize.width/2), actualY);
     [self addChild:target1 ];

       // Determine speed of the target

       int minDuration = target1.minMoveDuration;
       int maxDuration = target1.maxMoveDuration;
         int rangeDuration = maxDuration - minDuration;
          int actualDuration = (arc4random() % rangeDuration) + minDuration;

           // Create the actions
                                                                                                 id actionMove = [CCMoveTo actionWithDuration:actualDuration      position:ccp(-target1.contentSize.width/2, actualY)];


  id actionMoveDone = [CCCallFuncN actionWithTarget:self 
                                     selector:@selector(spriteMoveFinished:)];
 [target1 runAction:[CCSequence actions:actionMove, actionMoveDone, nil]];
  target1.tag = 1;
     [_targets addObject:target1];   
       }

 -(void)gameLogicboss:(ccTime)dt {
 [self addTarget1];
   iterations_++;
       }

                - (void)updateboss:(ccTime)dt {
        CGRect projectileRect = CGRectMake(projectile.position.x -                  (projectile.contentSize.width/2), projectile.position.y - (projectile.contentSize.height/2),                           projectile.contentSize.width,                                   projectile.contentSize.height);

BOOL bossHit = FALSE;
NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];
for (CCSprite *target1 in _targets) {
    CGRect target1Rect = CGRectMake(target1.position.x - (target1.contentSize.width/2),                                        target1.position.y - (target1.contentSize.height/2),                                        target1.contentSize.width,                                  target1.contentSize.height);

    if (CGRectIntersectsRect(projectileRect, target1Rect)) {

        //[targetsToDelete addObject:target];   
        bossHit = TRUE;
        Boss *boss = (Boss *)target1;
        boss.hp--;
        if (boss.hp <= 0) {
            _score ++;
            [targetsToDelete addObject:target1];
        }
        break;

    }                       
}

for (CCSprite *target in targetsToDelete) {
    [_targets removeObject:target];
    [self removeChild:target cleanup:YES];                                  
    _projectilesDestroyed++;
    if (_projectilesDestroyed > 2) {

          } 
         }

if (bossHit) {
    //[projectilesToDelete addObject:projectile];
    [[SimpleAudioEngine sharedEngine] playEffect:@"explosion.caf"];
}
[targetsToDelete release];
 }

     -(void)spriteMoveFinishedboss:(id)sender {
       CCSprite *sprite = (CCSprite *)sender;
      [self removeChild:sprite cleanup:YES];
       GameOverScene *gameOverScene = [GameOverScene node];
         [gameOverScene.layer.label setString:@"You Lose"];
       [[CCDirector sharedDirector] replaceScene:gameOverScene];    

      if (sprite.tag == 1) { // target
[_targets removeObject:sprite];
      } else if (sprite.tag == 2) { // projectile
[_projectiles removeObject:sprite];
     }
     }
4

5 に答える 5

1

スプライトでパーティクル エミッタの位置を更新する必要はありません。パーティクル システムを子としてスプライトに追加できます。パーティクル システムは次のように入力する必要があります。

 CCParticleSystem * booster = [CCParticleSystem particleWithFile:@"boosterParticles.plist"];
    //customize your particles' options

    //assuming you have a sprite defined as _motherShip
    [_motherShip addChild:booster];

    /*
     * now that the particles are the _motherShip's child, you must remember 
     * to set the position relative to the mothership's origin...
     */
    particles.position = ccp(15,0);

...これで、_motherShip.position が変更されるたびに、ブースターが追従します。船と一緒に回転します。

于 2014-06-22T05:09:07.430 に答える
0

私はこれをします

vehicleParticleSystem = [CCParticleSystemQuad particleWithFile:@"vehicleParticle.plist"];
vehicleParticleSystem.position = ccp(_ship.position.x - _ship.contentSize.width/3, _ship.position.y - _ship.contentSize.height/3);
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
    vehicleParticleSystem.scale = 0.5;
}
[self addChild:vehicleParticleSystem z:-1];

これでその位置を更新します

- (void) updateParticleSystem:(ccTime)dt {
vehicleParticleSystem.position = ccp(_ship.position.x - _ship.contentSize.width/3, _ship.position.y - _ship.contentSize.height/3);
}

これは-(void) update:(ccTime)dtメソッドで呼び出されます。

船は、ユーザーがジョイパッドを介して移動します。

お役に立てれば。パーティクルの配置は、エンジン効果のために車両の少し後ろにあります。

于 2012-07-10T11:46:39.823 に答える
0

コードに入る必要のない非常に単純なロジック:

スプライトをスポーンし、位置 (x, y) を指定します。スプライトごとに、CCParticleSystem もスポーンし、必要なパーティクル タイプ、スポーン レートなどを指定します。CCParticleSystem の位置は、スプライトと同じ (x,y) 位置に設定され、スプライトの ( x,y) 場所が更新されます。

スプライトと CCParticleSystem が動き回ると、この場所 (x, y) は、間隔ステップ時間ごとにスケジュール メソッドで常にランダムに更新されます。

それが理にかなっていることを願っています。

于 2012-07-10T10:33:15.847 に答える