1

我对 iOS 和 cocos2d 很陌生,我在尝试创建我想要代码做的事情时遇到了问题。让我先给你一个纲要,然后我会展示我所拥有的。

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

首先,我尝试在 Cocos2d 上实现速度代码(用 Objective-c 编写),但没有成功。-代码-

-(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 个不同的精灵。我只看到ballGuysRect这里的一个实例。每个精灵都需要一个ballGuysRect,例如一个数组。

最后,我想说你并不真的需要ballGuysRect,ballVelocity和 sprite。Ball可以是 的子类CCSprite,包括速度向量。然后,您需要做的就是保留一系列Balls 并管理它们。

于 2013-01-07T22:14:22.130 回答