스크롤 배경 - 스프라이트 키트
-
21-12-2019 - |
문제
이 게시물의 솔루션을 사용하여 무한 스크롤 배경을 만들려고 노력했습니다 ( 스프라이트 키트 사이드 스크롤 ). 그러나 이미지를 반복 할 수있게하고 싶습니다.아래의 비디오에서 볼 수 있듯이 이미지가 가로 방향으로 끝나면 빈 틈이 있습니다. 이미지를 틈새를 채우고 끝없이 반복하십시오.
http://www.youtube.com/watch?v=kyltgz7irrc 또는 https://vimeo.com/79555900 (암호 : spritekit)
내가 한 일 :
for (int i = 0; i < 2; i++) {
SKSpriteNode * bg = [SKSpriteNode spriteNodeWithImageNamed:@"bgimage"];
bg.anchorPoint = CGPointZero;
bg.position = CGPointMake(CGRectGetMidX(self.frame), self.frame.origin.y);
bg.name = @"snow1";
[self addChild:bg];
}
.
및 업데이트 방법 :
[self enumerateChildNodesWithName:@"snow1" usingBlock: ^(SKNode *node, BOOL *stop) {
SKSpriteNode *bg = (SKSpriteNode *) node;
bg.position = CGPointMake(bg.position.x - 5, bg.position.y);
if (bg.position.x <= -bg.size.width)
bg.position = CGPointMake(bg.position.x + bg.size.width * 2, bg.position.y);
}];
. 해결책
어쨌든, 나는 그것을 고쳤다.다른 사람이 필요로하는 경우에, 이것은 내가 어떻게했는지입니다 :
// Create 2 background sprites
bg1 = [SKSpriteNode spriteNodeWithImageNamed:@"bg1"];
bg1.anchorPoint = CGPointZero;
bg1.position = CGPointMake(0, 0);
[self addChild:bg1];
bg2 = [SKSpriteNode spriteNodeWithImageNamed:@"bg2"];
bg2.anchorPoint = CGPointZero;
bg2.position = CGPointMake(bg1.size.width-1, 0);
[self addChild:bg2];
.
그런 다음 업데이트 방법 :
bg1.position = CGPointMake(bg1.position.x-4, bg1.position.y);
bg2.position = CGPointMake(bg2.position.x-4, bg2.position.y);
if (bg1.position.x < -bg1.size.width)
bg1.position = CGPointMake(bg2.position.x + bg2.size.width, bg1.position.y);
if (bg2.position.x < -bg2.size.width)
bg2.position = CGPointMake(bg1.position.x + bg1.size.width, bg2.position.y);
. 다른 팁
사소한 변경 사항이있는 루프가있는 원래의 로직은
for (int i = 0; i < 2; i++) {
SKSpriteNode * bg = [SKSpriteNode spriteNodeWithImageNamed:@"bgimage"];
bg.anchorPoint = CGPointZero;
bg.position = CGPointMake(i*bg.size.width, 0);
bg.name = @"snow1";
[self addChild:bg];
}
.
및 업데이트 방법 :
[self enumerateChildNodesWithName:@"snow1" usingBlock: ^(SKNode *node, BOOL *stop) {
SKSpriteNode *bg = (SKSpriteNode *) node;
bg.position = CGPointMake(bg.position.x - 5, bg.position.y);
if (bg.position.x <= -bg.size.width) {
bg.position = CGPointMake(bg.position.x + bg.size.width * 2, bg.position.y);
}
}];
. SEBYDDD의 답변을 사용하여 코드를 약간 수정하여 여러 배경 이미지의 스택을 표시합니다.(7 개의 배경 이미지가 정확하게).고투하고있는 사람들을위한 조금 더 많은 코드를 추가했습니다.
myscene.h :
@interface MyScene : SKScene
{
SKSpriteNode *bg1;
SKSpriteNode *bg2;
SKSpriteNode *bg3;
SKSpriteNode *bg4;
SKSpriteNode *bg5;
SKSpriteNode *bg6;
SKSpriteNode *bg7;
}
.
myscene.m :
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
// create 7 background sprites
bg1 = [SKSpriteNode spriteNodeWithImageNamed:@"background1"];
bg1.anchorPoint = CGPointZero;
bg1.position = CGPointMake(0, 0);
[self addChild:bg1];
bg2 = [SKSpriteNode spriteNodeWithImageNamed:@"background2"];
bg2.anchorPoint = CGPointZero;
bg2.position = CGPointMake(bg1.size.width-1, 0);
[self addChild:bg2];
bg3 = [SKSpriteNode spriteNodeWithImageNamed:@"background3"];
bg3.anchorPoint = CGPointZero;
bg3.position = CGPointMake(bg2.size.width-1, 0);
[self addChild:bg3];
bg4 = [SKSpriteNode spriteNodeWithImageNamed:@"background4"];
bg4.anchorPoint = CGPointZero;
bg4.position = CGPointMake(bg3.size.width-1, 0);
[self addChild:bg4];
bg5 = [SKSpriteNode spriteNodeWithImageNamed:@"background5"];
bg5.anchorPoint = CGPointZero;
bg5.position = CGPointMake(bg4.size.width-1, 0);
[self addChild:bg5];
bg6 = [SKSpriteNode spriteNodeWithImageNamed:@"background6"];
bg6.anchorPoint = CGPointZero;
bg6.position = CGPointMake(bg5.size.width-1, 0);
[self addChild:bg6];
bg7 = [SKSpriteNode spriteNodeWithImageNamed:@"background7"];
bg7.anchorPoint = CGPointZero;
bg7.position = CGPointMake(bg6.size.width-1, 0);
[self addChild:bg7];
}
}
- (void)update:(NSTimeInterval)currentTime {
[self moveBackground];
}
-(void)moveBackground
{
bg1.position = CGPointMake(bg1.position.x-4, bg1.position.y);
bg2.position = CGPointMake(bg2.position.x-4, bg2.position.y);
bg3.position = CGPointMake(bg3.position.x-4, bg3.position.y);
bg4.position = CGPointMake(bg4.position.x-4, bg4.position.y);
bg5.position = CGPointMake(bg5.position.x-4, bg5.position.y);
bg6.position = CGPointMake(bg6.position.x-4, bg6.position.y);
bg7.position = CGPointMake(bg7.position.x-4, bg7.position.y);
if (bg1.position.x < -bg1.size.width){
bg1.position = CGPointMake(bg7.position.x + bg7.size.width, bg1.position.y);
}
if (bg2.position.x < -bg2.size.width) {
bg2.position = CGPointMake(bg1.position.x + bg1.size.width, bg2.position.y);
}
if (bg3.position.x < -bg3.size.width) {
bg3.position = CGPointMake(bg2.position.x + bg2.size.width, bg3.position.y);
}
if (bg4.position.x < -bg4.size.width) {
bg4.position = CGPointMake(bg3.position.x + bg3.size.width, bg4.position.y);
}
if (bg5.position.x < -bg5.size.width) {
bg5.position = CGPointMake(bg4.position.x + bg4.size.width, bg5.position.y);
}
if (bg6.position.x < -bg6.size.width) {
bg6.position = CGPointMake(bg5.position.x + bg5.size.width, bg6.position.y);
}
if (bg7.position.x < -bg7.size.width) {
bg7.position = CGPointMake(bg6.position.x + bg6.size.width, bg7.position.y);
}
}
. 제휴하지 않습니다 StackOverflow