1

私は iOS と cocos2d にかなり慣れていないので、コードで実行したいことを作成しようとすると問題が発生します。最初に概要を説明してから、私が持っているものを示します。

これまでに得たのは真ん中の巨大なスプライトで、これに触れると、2000 の別のスプライトが中央の位置から生成され、パーティクル システムのように全方向に発射されます。

まず、速度コード (Objective-c で記述) を Cocos2d に実装するコーディングを試みましたが、うまくいきませんでした。-コード-

-(void)ccTouchBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  if(CGRectContainsPoint([[self getChildByTag:1] boundingBox], location))
     {
        for( int i = 0; i < 100; i++)
          {
             CCSprite *ballGuySprite = [CCSprite spriteWithFile:@"ball.png"];
             [self addChild:ballGuySprite z:7];
             ballGuySprite.position = ccp(((s.width + i *10) /2), (s.height + i *10) /2);
           }
      }
}

最初のスプライトに触れると、100 個の他のスプライトが重なり合って右上隅に移動します。

私が使用した速度コードは、次のようになり、スプライトに適用しようとしても何も起こりません。- 速度コード -

-(void) checkCollisionWithScreenEdges
{
if(ballGuysRect.origin.x <= 0)
{
    ballVelocity.x = abs(ballVelocity.x);

}

if(ballGuysRect.origin.x >= VIEW_WIDTH - GUY_SIZE)
{
    ballVelocity.x = -1 * abs(ballVelocity.x);
}

if(ballGuysRect.origin.y <= 0)
{
    ballVelocity.y = abs(ballVelocity.y);
}

if(ballGuysRect.origin.y >= VIEW_HEIGHT - GUY_SIZE)
{
    ballVelocity.y = -1 * abs(ballVelocity.y);
}

}

-(void) updateModelWithTime:(CFTimeInterval)timestamp
{
    if(lastTime == 0.0)
    {
        lastTime = timestamp;
    }
else
{
    timeDelta = timestamp - lastTime;

    lastTime = timestamp;

    ballGuysRect.origin.x += ballVelocity.x * timeDelta;
    ballGuysRect.origin.y += ballVelocity.y * timeDelta;

    [self checkCollisionWithScreenEdges];


}
}

そのコードをスプライトにアタッチすると、何も起こりません。

また、CCParticleExplosion を追加してみましたが、これは私が望んでいたことを行いましたが、生成された個々のスプライトにタッチ機能を追加したいのですが、それらは消えていく傾向があります。

繰り返しますが、私はまだこれにかなり慣れていないので、誰かが何かアドバイスをくれるとしたら、それは素晴らしいことです.

患者様、お読みいただきありがとうございます。

4

2 に答える 2

0

どのバージョンの cocos2d を使用しているかはわかりませんが、いくつかの点が少し奇妙に見えます。

最初の問題は、同じスプライトを何度も使用していることです。

非常に多くの異なるスプライトを発射したいので、CCSpriteBatchNode を使用することをお勧めします。これにより、処理が簡素化され、処理が高速化されます。

次のコードは、その設定を取得し、CCMoveTo を使用して画面外に移動するのに役立ちます。

    //in your header file:
    CCSpriteBatchNode *batch;

    //in your init method
    batch = [CCSpriteBatchNode batchNodeWithFile:@"ball.png"];

     //Then in your ccTouches method
    for( int i = 0; i < 100; i++)
      {
         CCSprite *ballGuySprite = [CCSprite spriteWithFile:@"ball.png"];
         [batch addChild:ballGuySprite z:7 tag:0];
         ballGuySprite.position = ccp(where-ever the center image is located);
          id actionMove = [CCMoveTo actionWithDuration:actualDuration 
                                position:ccp(random off screen location)];
          [ballGuySprite runAction:actionMove];
       }

また、通常、更新方法は次のようになります。

    -(void)update:(ccTime)delta{
        //check for sprites that have moved off screen and disable them. 
    }

お役に立てれば。

于 2013-01-08T03:48:17.940 に答える
0

あなたのコードは私には良さそうに見えますが、スプライトの位置を決して更新していないようです。どこかで、それぞれ高さまたは幅の半分にプラスupdateModelWithTimeして設定することを期待しています。ballGuySprite.position = ballGuysRect.origin

updateModelWithTimeまた、 100 種類のスプライトを制御する方法がわかりません。ここには 1 つのインスタンスしか表示されませんballGuysRectballGuysRect配列など、スプライトごとに が必要になります。

ballGuysRect最後に、 、ballVelocity、およびスプライトは必要ありません。は、速度ベクトルを含むBallのサブクラスである可能性があります。CCSpriteあとは、 の配列を保持し、Ballそれらを管理するだけです。

于 2013-01-07T22:14:22.130 に答える