cocos2d用速度生成多个相同的精灵

时间:2013-01-07 21:52:20

标签: objective-c ios xcode cocos2d-iphone

我是iOS和cocos2d的新手,我在尝试创建我想要的代码时遇到了问题。让我先给你一个破败,然后我会展示我所拥有的东西。

到目前为止我得到的是一个中间的巨型精灵,当它被触摸时,我想要说2000个不同的精灵从中心位置生成并像粒子系统一样,朝各个方向射击。

首先,我尝试将速度代码(用Objective-c编写)的代码编写到Cocos2d上,但是没有用。 -code -

-(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,它确实做了我想做的事情,但我仍然想为每个生成的精灵添加一个触摸功能,它们往往会逐渐消失。

所以,我仍然相当新,如果有人能提出任何可能很好的建议。

感谢您的患者及时间阅读本文。

2 个答案:

答案 0 :(得分:0)

您的代码对我来说很好,但您似乎永远不会更新精灵的位置。在updateModelWithTime的某个地方我希望你分别设置ballGuySprite.position = ballGuysRect.origin加上它的一半高度或宽度。

另外,我没有看到updateModelWithTime如何控制100个不同的精灵。我在这里只看到ballGuysRect的一个实例。每个精灵都需要ballGuysRect,例如一个数组。

最后,我要说你真的不需要ballGuysRectballVelocity和精灵。 Ball可以是CCSprite的子类,包括速度向量。然后,您需要做的就是保留一组Ball并管理它们。

答案 1 :(得分: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. 
    }

希望这有帮助。