Как снизить элемент UIView в сцене SpriteKit

У меня есть обычная сцена SpriteKit. Фактически, это сцена по умолчанию, созданная из "Sprite Kit", которая рисует космические корабли.

Я хотел бы опираться на задний план.

Я успешно добавил UIImageView в качестве подзапроса основного skView. Я могу нарисовать это с помощью строк и т.д.

Но я не могу, похоже, успешно поставить UIImageView за основной skview.

Как я могу это сделать? Вот мой пример кода.

(В UIImageView я просто рисую случайные строки каждые 0,1 секунды.)

@implementation GameViewController

- (void)viewDidLoad
{
 [super viewDidLoad];

 // Configure the view.
 SKView * skView = (SKView *)self.view;
// skView.showsFPS = YES;
// skView.showsNodeCount = YES;
 /* Sprite Kit applies additional optimizations to improve rendering performance */
 //skView.ignoresSiblingOrder = YES;

 // Create and configure the scene.
 GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"];
 scene.scaleMode = SKSceneScaleModeAspectFill;

 [skView presentScene:scene];
}

-(void)viewWillLayoutSubviews{

 self.imageView = [UIImageView new];
 self.imageView.frame = self.view.frame;
 [self.view addSubview:self.imageView];
 [self startRepeatingTimer];
}

-(void)viewDidLayoutSubviews{

 // this doesn't work. was just trying it out.
 int i = [[self.view subviews] count];
 [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:i-1];

}

///// DRAW RANDOM LINES EVERY 0.1 SECONDS ON THE UIIMAGEVIEW SUBVIEW
- (********)startRepeatingTimer {

 [self.repeatingTimer invalidate];
 self.repeatingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(drawOnImage:) userInfo:nil repeats:YES];
}

- (void)drawOnImage:(NSTimer*)theTimer {

 //setup
 float w = self.view.frame.size.width;
 float h = self.view.frame.size.height;

 UIGraphicsBeginImageContextWithOptions(self.view.frame.size,NO,0.0);
 [self.imageView.image drawInRect:CGRectMake(0, 0, w, h)];
 CGContextRef c = UIGraphicsGetCurrentContext();

 //draw
 CGContextMoveToPoint(c, drand48()*w,drand48()*h);
 CGContextAddLineToPoint(c, drand48()*w,drand48()*h);
 CGContextSetLineCap(c, kCGLineCapRound);
 CGContextSetLineWidth(c, 1.0f );
 CGContextSetRGBStrokeColor(c, drand48(), drand48(), drand48(), 1.0);
 CGContextStrokePath(c);

 // set the image
 self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
}
1 ответ

Здесь удобный способ SpriteKit рисовать случайные строки на фоновом изображении. Основные этапы:

  1. Создать пустое изображение
  2. Преобразование изображения в SKTexture
  3. Создайте спрайт с текстурой
  4. Нарисуйте случайную строку на изображении
  5. Обновите текстуру спрайта с изображением
  6. Подождите 0,1 секунды
  7. Итерацию через шаги 4-6

В GameScene.m добавьте следующее

-(void)didMoveToView:(SKView *)view {

 self.scaleMode = SKSceneScaleModeResizeFill;

 // 1. Create an empty UIImage
 self.image = [self blankImageWithSize:view.frame.size];
 // 2. Convert the image to a texture
 SKTexture *texture = [SKTexture textureWithImage:_image];
 // 3. Create a sprite from the texture
 SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithTexture:texture];

 // Center the sprite in the view
 sprite.position = CGPointMake(CGRectGetMidX(view.frame), CGRectGetMidY(view..frame));
 // Set zPosition such that the sprite is underneath other nodes
 sprite.zPosition = -1000;
 [self addChild:sprite];

 self.sprite = sprite;

 // 4. and 5. Create an SKAction that draw lines on the image and then update the
 // sprite texture
 SKAction *drawAction = [SKAction runBlock:^{
 [self drawOnImage];
 _sprite.texture = [SKTexture textureWithImage:_image];
 }];
 // 6. create a 0.1 second delay
 SKAction *wait = [SKAction waitForDuration:0.1];
 SKAction *action = [SKAction sequence:@[drawAction,wait]];

 // 7. Iterate
 [self runAction:[SKAction repeatActionForever:action]];

 // Create a label and add it to the scene to show the image is
 // in the background
 SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];

 myLabel.text = @"Hello, World!";
 myLabel.fontSize = 65;
 myLabel.position = CGPointMake(CGRectGetMidX(view.frame), CGRectGetMidY(view..frame));

 [self addChild:myLabel];

}

Этот метод создает пустую картинку

- (UIImage*) blankImageWithSize:(CGSize)size
{
 UIGraphicsBeginImageContext(size);
 UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 return image;
}

Этот метод рисует линии на изображении

- (void)drawOnImage {

 //setup
 float w = _image.size.width;
 float h = _image.size.height;

 UIGraphicsBeginImageContextWithOptions(_image.size,NO,0.0);
 [_image drawInRect:CGRectMake(0, 0, w, h)];
 CGContextRef c = UIGraphicsGetCurrentContext();

 //draw
 CGContextMoveToPoint(c, drand48()*w,drand48()*h);
 CGContextAddLineToPoint(c, drand48()*w,drand48()*h);
 CGContextSetLineCap(c, kCGLineCapRound);
 CGContextSetLineWidth(c, 1.0f );
 CGContextSetRGBStrokeColor(c, drand48(), drand48(), drand48(), 1.0);
 CGContextStrokePath(c);

 // set the image
 _image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
}

licensed under cc by-sa 3.0 with attribution.