2

iOSでOpenGLES2.0+GLKitゲームのクラスを作成しようとしています。スクロール速度を上げると、スプライト間のギャップが大きくなります。私はグーグルでたくさんの検索をしましたが、私のために働く答えを見つけられませんでした。

私のスクロールスプライトクラスは、位置、スケール、子など(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);

速度を上げると、追加される量がx増加します。私の推測では、オブジェクトの 1 つが他のオブジェクトよりも遅く更新されていると思われます。それを修正するには、各オブジェクトが他のオブジェクトから希望する距離であることを確認し、そうでない場合はそこに移動します。

于 2012-07-10T17:27:43.877 に答える