@akashg 指出了在传送带上移动物体的解决方案,我给出的答案是如何使传送带看起来好像在移动
一个建议和我最初的直觉是在场景中放置一个比屏幕更大的矩形并反复移动它。经过反思,我认为这不是一个好的解决方案,因为如果我们想在中间放置一条传送带,在某种程度上我们可以看到它的两端,如果没有额外的剪贴蒙版,这将是不可能的。
理想的解决方案是将SKTexture 平铺在SKSpriteNode 上并仅偏移此纹理;但这似乎不适用于 Sprite Kit(无平铺机制)。
所以基本上我所做的就是从类似 [tile][tile](2 次可重复的 tile)的纹理创建子纹理,我只是一个接一个地显示这些子纹理以创建动画。
代码如下:
- (SKSpriteNode *) newConveyor
{
SKTexture *conveyorTexture = [SKTexture textureWithImageNamed:@"testTextureDouble"];
SKTexture *halfConveyorTexture = [SKTexture textureWithRect:CGRectMake(0.5, 0.0, 0.5, 1.0) inTexture:conveyorTexture];
SKSpriteNode *conveyor = [SKSpriteNode spriteNodeWithTexture:halfConveyorTexture size:CGSizeMake(conveyorTexture.size.width/2, conveyorTexture.size.height)];
NSArray *textureArray = [self horizontalTextureArrayForTxture:conveyorTexture];
SKAction *moveAction = [SKAction animateWithTextures:textureArray timePerFrame:0.01 resize:NO restore:YES];
[conveyor runAction:[SKAction repeatActionForever:moveAction]];
return conveyor;
}
- (NSArray *) horizontalTextureArrayForTxture : (SKTexture *) texture
{
CGFloat deltaOnePixel = 1.0 / texture.size.width;
int countSubtextures = texture.size.width / 2;
NSMutableArray *textureArray = [[NSMutableArray alloc] initWithCapacity:countSubtextures];
CGFloat offset = 0;
for (int i = 0; i < countSubtextures; i++)
{
offset = i * deltaOnePixel;
SKTexture *subTexture = [SKTexture textureWithRect:CGRectMake(offset, 0.0, 0.5, 1.0) inTexture:texture];
[textureArray addObject:subTexture];
}
return [NSArray arrayWithArray:textureArray];
}
现在这仍然不理想,因为需要手动制作具有 2 个图块的图像。我们还可以编辑带有CIFilter 变换的SKTexture,它可能被用来创建这个带有2 个图块的纹理。
除此之外,我认为这个解决方案更好,因为它不依赖于屏幕的大小并且内存效率高;但为了在整个屏幕上使用它,我必须创建更多 SKSpriteNode 对象,这些对象共享我使用过的 moveAction,因为根据此来源,Sprite Kit 无法进行平铺:
How do you set a texture to tile in Sprite Kit。
我将尝试更新代码,以便可以使用多个SKSpriteNode 对象进行平铺。