Continuous scrolling sprite on iOS GLKit gap between sprites
我一直在尝试在 iOS 上为我的 OpenGL ES 2.0 GLKit 游戏创建一个类。当我提高滚动速度时,sprite之间的间隙会变大。我在 Google 上进行了大量搜索,但没有找到适合我的答案。
我的滚动sprite类继承自一个具有位置、比例、子级等的"节点"(有点像 Cocos2D)。该类有一个sprite数组(节点),它们以设定的速度在 x 轴上移动,当到达屏幕末端时,移动到最后一个sprite的右侧位置。
这是我的代码的主要部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | -(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]; } } } } |
如果有人能帮助我告诉我如何阻止间隙形成,将不胜感激 :) 提前致谢!
问题很可能是这一行:
1 | node.position = GLKVector2Make(node.position.x + self.velocity*dt, node.position.y); |
当你增加速度时,添加到