【问题标题】:background image is not properly scrolling in cocos2d背景图像在 cocos2d 中无法正确滚动
【发布时间】:2012-12-12 08:22:27
【问题描述】:

我编写了在游戏背景中滚动图像的代码。只需定义两个精灵并设置它们的位置。

CGSize screenSize=[[CCDirector sharedDirector]winSize];

sky1 = [CCSprite spriteWithFile:@"sky1.png"];

sky1.position=ccp(screenSize.width/2, screenSize.height/2);
[self addChild:sky1];
CCLOG(@"sky1 position  width=%f    height=%f",sky1.position.x,sky1.position.y);
sky2=[CCSprite spriteWithFile:@"sky2.png"];
sky2.position=ccp(screenSize.width/2, sky1.position.y+sky1.contentSize.height/2+sky2.contentSize.height/2);
[self addChild:sky2];
[self schedule:@selector(scroll:) interval:0.01f];

并在scroll方法中编写滚动代码:

-(void)scroll:(ccTime)delta{
    CGSize screen=[[CCDirector sharedDirector] winSize];
    CCLOG(@"come from schedule method    pos.y=%f",sky1.position.y);
    sky1.position=ccp(sky1.position.x, sky1.position.y-1);
    sky2.position=ccp(sky2.position.x, sky2.position.y-1);
    if(sky1.position.y <= -([sky1 boundingBox].size.height));
    {
         sky1.position=ccp(sky1.position.x, sky2.position.y+[sky2 boundingBox].size.height);

        CCLOG(@"COMING IN first ifin scroll mwthod  position width=%f  pos.y=%f",sky1.position.x,sky1.position.y);
    }
    if(sky2.position.y<= -[sky2 boundingBox].size.height);
    {
        sky2.position=ccp(sky2.position.x, sky1.position.y+[sky1 boundingBox].size.height);
        CCLOG(@"coming in secnond if ");
    }
}

当我删除if 条件时,它会正常工作一次。我不知道我的情况有什么问题,也不知道我的代码到底发生了什么。 谁能解释一下?

【问题讨论】:

  • 您是否考虑过为您的问题添加更详细的描述,然后是“代码到底是怎么回事”?
  • @Morion 基本上是我的 if 条件无法正常工作。当我删除它时,我的代码运行良好。所以我只是想知道在滚动方法中检查我的“if”条件为什么它对我不起作用......

标签: ios cocos2d-iphone xcode4.5


【解决方案1】:

我不太确定您的代码为什么不能正常工作。我脑海中闪现的一个想法是你的间隔可能太短了。换句话说,0.01f (1/100) 比你的游戏更新速度更短,很可能是 0.016 (1/60)。所以我要尝试的第一件事是将你的间隔调整到 0.02f。您还可以从调度调用中删除间隔参数,以便它每帧只运行一次。我也会尝试删除 ccTime 参数,因为它没有被使用。

[self schedule:@selector(scroll)];

-(void)scroll {}

但除此之外,这可能最好使用 CCActions 处理。这看起来像是一对简单的 CCMoveTo 动作与 CCRepeatForever 组合以获得您想要的效果。这就是我要走的路。

编辑:这里有更多关于使用 CCActions 来完成此操作的详细信息。有多种方法可以做同样的事情,但您可以尝试以下一种:

float moveDuration = 3; // or however fast you want it to scroll
CGPoint initialPosition = ccp(screenSize.width/2, screenSize.height/2);
CGPoint dp = ccp(0, -1*sky1.contentSize.height); // how far you want it to scroll down
CCMoveBy *scrollSky1 = [CCMoveBy actionWithDuration:moveDuration position:dp];
CCMoveTo *resetSky1 = [CCMoveTo actionWithDuration:0 position:initialPosition];
CCSequence *sequence = [CCSequence actionOne:scrollSky1 two:resetSky1];
CCRepeatForever *repeat = [CCRepeatForever actionWithAction:sequence];
[sky1 runAction:repeat];

【讨论】:

  • 实际上我通过增加时间间隔尝试了这个,但它不起作用。可以请详细说明我将如何使用 ccaction 吗??
猜你喜欢
  • 2021-01-05
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多