2

我一直在尝试在 iOS 上为我的 OpenGL ES 2.0 + GLKit 游戏创建一个类。当我提高滚动速度时,精灵之间的间隙会变大。我在 Google 上进行了很多搜索,但没有找到适合我的答案。

我的滚动精灵类继承自具有位置、比例、子级等的“节点”(有点像 Cocos2D)。该类有一个精灵数组(节点),它们在 x 轴上以设定的速度移动,当到达屏幕末端时,移动到最后一个精灵的右侧位置。

这是我的代码的主要部分:

    -(id)initWithTexture:(GLKTextureInfo *)texture effect:(GLKBaseEffect *)effect xScrollRange:(float)range yPosition:(float)y xScrollVelocity:(float)velocity{
if (self = [super init]) {
        //set globals
    self.velocity = velocity;
    xRange = range;

        //create a first sprite, set position, add to children
    JGSprite *firstSprite = [[JGSprite alloc] initWithTexture:texture effect:effect];
    firstSprite.position = GLKVector2Make(range, y);
    [self.children addObject:firstSprite];

        //calc how many sprites are needed to cover range+1
    float spritesNum = range/firstSprite.contentSize.width;
    int spritesNumRound = roundf(spritesNum)+1;

        //add enough sprites to cover the screen
    for (int i = 1; i < spritesNumRound; i++) {
            //create, set position, add to children
        JGSprite *sprite = [[JGSprite alloc] initWithTexture:texture effect:effect];
        sprite.position = GLKVector2Make(range - (i*sprite.contentSize.width), y);
        [self.children addObject:sprite];

    }

        //if moving left, set last sprite as right most
    if (velocity < 0)
        lastReorderedSprite = 0;
    else    //set left most
        lastReorderedSprite = self.children.count-1;



   }

    return self;
}

-(void)update:(float)dt
{
        //loop through sprites
    for (JGNode *node in self.children)
    {
            //update sprites position
        node.position = GLKVector2Make(node.position.x + self.velocity*dt, node.position.y);

        //if moving left
    if (self.velocity < 0)
    {
            //if reached gone off screen
        if (node.position.x <= -node.contentSize.width/2) 
        {
                //get last node
            JGNode *lastSprite = [self.children objectAtIndex:lastReorderedSprite];

                //set the position to the right of the last node
            node.position = GLKVector2Make(lastSprite.position.x+lastSprite.contentSize.width, node.position.y);

                //set re-positioned node as lastreordered
            lastReorderedSprite = [self.children indexOfObject:node];
        }            
    }
    else //moving right
    {
            //gone off screen   
        if (node.position.x >= xRange+node.contentSize.width/2) 
        {
                //get last node
            JGNode *lastSprite = [self.children objectAtIndex:lastReorderedSprite];

                //set the position to the left of the last node
            node.position = GLKVector2Make(lastSprite.position.x-node.contentSize.width, node.position.y);

                //set re-positioned node as lastreordered
            lastReorderedSprite = [self.children indexOfObject:node];

        }

    }
    }
}

如果有人可以通过告诉我如何阻止间隙形成来提供帮助,将不胜感激:) 提前致谢!

4

1 回答 1

2

问题很可能是这一行:

node.position = GLKVector2Make(node.position.x + self.velocity*dt, node.position.y);

When you increase velocity, the amount added to x increases. My guess is that one of your objects is having its speed updated later than the others. To fix it, just have each object check that it's the distance that you want it to be from the others and if it isn't, move it there.

于 2012-07-10T17:27:43.877 回答