2015-10-15 4 views
2

Мое игровое приложение, которое отлично работало на IOS 8 (построено с Xcode 6), внезапно испытывает множество проблем при построении с использованием Xcode 7 с IOS 9. Вот как игра привыкла смотреть. (Как это должно выглядеть). Level Select PageGame Scene Здесь он работает на IOS 9 (прерывистая) Level Select Page BrokenGame Scene BrokenПроблемы с SpriteKit в Xcode 7 и IOS 9

GAME СЦЕНЫ КОД

код для создания настольной игры в игре сцены

-(void) createBoard { 



self.buttons=[NSMutableArray new]; 

if (self.boardBlur != nil) { 
    [self.boardBlur removeAllChildren]; 
} 

self.backgroundColor=[UIColor clearColor]; 

// Use for Christmas Easter egg 

/* NSString *snowPath = [[NSBundle mainBundle] pathForResource:@"SnowParticle" ofType:@"sks"]; 
SKEmitterNode *snow = [NSKeyedUnarchiver unarchiveObjectWithFile:snowPath]; 
snow.particlePositionRange=CGVectorMake(self.frame.size.width, 20); 

snow.position=CGPointMake(self.frame.size.width/2,self.frame.size.height); 

snow.zPosition=-3; 

[self addChild:snow];*/ 

if (self.boardFrame != nil) { 
    [self.boardFrame removeFromParent]; 
    [self.boundingBox removeFromParent]; 
} 

self.boardFrame = [SKSpriteNode spriteNodeWithImageNamed:@"gameBoard2"]; 
self.boardFrame.color= self.level.baseColor; 
self.boardFrame.colorBlendFactor=1.0; 
self.boardFrame.alpha = .7; 
self.boardFrame.zPosition=-1; 
    // self.boardFrame.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)+40); 

self.boardFrame.size=self.size; 

if (self.boardBlur == nil) { 
self.boardBlur=[[SKEffectNode alloc]init]; 
    self.boardBlur.filter=[CIFilter filterWithName:@"CIGaussianBlur"]; 
    [self.boardBlur.filter setDefaults]; 
    [self.boardBlur.filter setValue:@5.0 forKey:kCIInputRadiusKey]; 
    self.boardBlur.shouldEnableEffects=NO; 
    self.boardBlur.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)+40); 
    [self addChild:self.boardBlur]; 
} 

[self.boardBlur addChild:self.boardFrame]; 


[self displayMessage:self.level.name color:[UIColor whiteColor]]; 

[self createHUD]; 

CGRect playSurface=CGRectInset(self.frame, 36,36); 

self.gridSize=fmin(playSurface.size.width,playSurface.size.height)/(fmax(self.level.width,self.level.height)); 

if (self.gridSize > 60) { 
    self.gridSize=60; 
} 

CGRect oldPlaySurface =playSurface; 

playSurface=CGRectMake(0,0,self.gridSize*self.level.width,self.gridSize*self.level.height); 

self.boardFrame.size=CGRectInset(playSurface, -24, -24).size; 
self.boardBlur.zPosition=-2; 

self.boundingBox=[SKShapeNode shapeNodeWithRect:CGRectInset(self.boardFrame.frame,self.gridSize/1.7,self.gridSize/1.7) cornerRadius:7.0]; 
self.boundingBox.strokeColor=[SKColor clearColor]; 

self.boundingBox.position=self.boardBlur.position; 
self.boundingBox.zPosition=-5; 
[self addChild:self.boundingBox]; 

self.ballSize=self.gridSize-6; 
self.enlargeAction=[SKAction resizeToWidth:self.ballSize+5 height:self.ballSize+5 duration:0.2]; 
self.shrinkAction=[SKAction resizeToWidth:self.ballSize height:self.ballSize duration:0.2]; 

self.enlargeInAction=[SKAction resizeToWidth:self.ballSize height:self.ballSize duration:0.3]; 
self.shrinkOutAction=[SKAction resizeToWidth:0 height:0 duration:0.3]; 


CGFloat horizontalSpace = (playSurface.size.width-self.gridSize*self.level.width); 
CGFloat verticalSpace = (playSurface.size.height-self.gridSize*self.level.height); 

self.topOffset=80+verticalSpace/2+(oldPlaySurface.size.height-playSurface.size.height)/2; 

self.leftOffset=40+horizontalSpace/2+(oldPlaySurface.size.width-playSurface.size.width)/2; 

for (int y=0; y < self.level.height; y++) { 
    for (int x = 0; x < self.level.width; x++) { 
     //SKSpriteNode *backgroundButtonNode = [SKSpriteNode spriteNodeWithTexture:dotTexture]; 
     SKShapeNode *backgroundButtonNode=[SKShapeNode shapeNodeWithCircleOfRadius:0.5]; 
    //  backgroundButtonNode.size=ballSize; 
     backgroundButtonNode.userInteractionEnabled=NO; 
     backgroundButtonNode.zPosition=0; 
     backgroundButtonNode.fillColor=[UIColor whiteColor]; 
    // backgroundButtonNode.colorBlendFactor=1.0; 

     backgroundButtonNode.position=[self.boardFrame convertPoint:CGPointMake(self.leftOffset+(self.gridSize*x)+self.ballSize/2,self.topOffset+(self.gridSize*y)+self.ballSize/2) fromNode:self]; 

     [self.boardFrame addChild: backgroundButtonNode]; 
    } 
} 


CGFloat menuiconsize=fmin(self.ballSize, 60.0); 

CGFloat menuWidth=fmin(self.boardFrame.size.width-40,420); 

if (self.menuBar != nil) { 
    [self.menuBar removeFromParent]; 
} 

self.menuBar=[[MenuBar alloc]initWithSize:CGSizeMake(menuWidth,self.ballSize+12) iconSize:CGSizeMake(menuiconsize,menuiconsize) Level:self.level]; 
self.menuBar.delegate=self; 
[self addChild:self.menuBar]; 

self.menuBar.position=CGPointMake(self.frame.size.width/2-(menuWidth)/2, self.topOffset-menuiconsize-40); 

self.menuBar.userInteractionEnabled=YES; 
self.gameOver=NO; 

}

Код для HUD (Звезды, Цель ...)

-(void) createHUD { 
if (self.topHud == nil) { 
    self.topHud=[SKShapeNode shapeNodeWithRect:CGRectMake(-2,self.frame.size.height-62,self.frame.size.width+2,64)]; 

    self.topHud.fillColor=[UIColor clearColor]; 
    self.topHud.strokeColor=[UIColor clearColor]; 
    self.topHud.lineWidth=0; 
    [self addChild:self.topHud]; 

    UIColor *textColor=[self.level textColor]; 

    self.scoreLabel=[SKLabelNode labelNodeWithFontNamed:@"Blow"]; 
    self.scoreLabel.fontSize=20; 
    self.scoreLabel.alpha = 1; 
    self.scoreLabel.horizontalAlignmentMode=SKLabelHorizontalAlignmentModeRight; 
    self.scoreLabel.fontColor=textColor; 
    self.scoreLabel.position=CGPointMake(self.frame.size.width-8,self.frame.size.height-25); 
    self.score=0; 
    [self.topHud addChild:self.scoreLabel]; 

    self.highScoreLabel=[SKLabelNode labelNodeWithFontNamed:@"Blow"]; 
    self.highScoreLabel.fontSize=20; 
    self.highScoreLabel.alpha = 1; 
    self.highScoreLabel.horizontalAlignmentMode=SKLabelHorizontalAlignmentModeRight; 
    self.highScoreLabel.fontColor=textColor; 
    self.highScoreLabel.position=CGPointMake(self.frame.size.width-8,self.frame.size.height-50); 
    //self.highScore=0; 
    [self.topHud addChild:self.highScoreLabel]; 
    [self updateScore]; 

    self.doughLabel=[SKLabelNode labelNodeWithFontNamed:@"Blow"]; 
    self.doughLabel.fontColor=textColor; 
    self.doughLabel.fontSize=20; 
    self.doughLabel.horizontalAlignmentMode=SKLabelHorizontalAlignmentModeCenter; 
    self.doughLabel.position=CGPointMake(self.frame.size.width/2, 20); 
    [self coinBalanceChanged:nil]; 
    [self addChild:self.doughLabel]; 

    self.progressNode=[SKCropNode new]; 
    self.progressNode.zPosition=1; 
    SKNode *dimStarsNode=[SKNode new]; 
    SKSpriteNode *maskNode=[SKSpriteNode spriteNodeWithColor:[UIColor blackColor] size:CGSizeMake(66,24)]; 
    maskNode.position=CGPointMake(-42, 0); 
    // self.progressNode.maskNode=maskNode; 
    for (int i=0;i<3;i++) { 
     SKSpriteNode *starNode=[SKSpriteNode spriteNodeWithImageNamed:@"SugarCookie"]; 
     starNode.size=CGSizeMake(20,20); 
     starNode.position=CGPointMake(i*22,0); 
     [self.progressNode addChild:starNode]; 
     starNode=[SKSpriteNode spriteNodeWithImageNamed:@"SugarCookie"]; 
     starNode.size=CGSizeMake(20,20); 
     starNode.zPosition=1; 
     starNode.alpha=0.3; 
     starNode.position=CGPointMake(i*22,0); 
     [dimStarsNode addChild:starNode]; 
    } 

    self.progressNode.maskNode= maskNode; 

    // self.progressNode.maskNode=maskNode; 
    self.progressNode.position=CGPointMake(22, self.frame.size.height-18); 
    dimStarsNode.position=CGPointMake(22, self.frame.size.height-18); 

    dimStarsNode.zPosition=0; 

    [self addChild:dimStarsNode]; 
    [self addChild:self.progressNode]; 

    self.goalLabel=[SKLabelNode labelNodeWithFontNamed:@"Blow"]; 
    self.goalLabel.fontSize=20; 
    self.goalLabel.alpha = 1; 
    self.goalLabel.fontColor=textColor; 
    self.goalLabel.position=CGPointMake(12,self.frame.size.height-50); 
    self.goalLabel.horizontalAlignmentMode=SKLabelHorizontalAlignmentModeLeft; 
    self.goalLabel.text=[NSString stringWithFormat:@"Goal: %ld",(long)self.level.targetScore]; 
    [self addChild:self.goalLabel]; 

    self.storeButton=[[GameButtonNode alloc]initWithColor:self.level.baseColor strokeColor:[self.level levelColorWithBrightnessDelta:0.3 alpha:1.0] imageName:@"store" radius:25 physics:NO delegate:self]; 

    self.storeButton.position=CGPointMake(self.frame.size.width-40,35); 
    [self addChild:self.storeButton]; 

    self.menuButton=[[GameButtonNode alloc]initWithColor:self.level.baseColor strokeColor:[self.level levelColorWithBrightnessDelta:0.3 alpha:1.0] imageName:@"menuButton" radius:25 physics:NO delegate:self]; 

    self.bottomMenuNode=[SKShapeNode shapeNodeWithRect:CGRectMake(5, 30, 180, 60) cornerRadius:7.0]; 
    self.bottomMenuNode.strokeColor=[UIColor clearColor]; 
    self.bottomMenuNode.fillColor=[self.level levelColorWithBrightnessDelta:-0.6 alpha:0.2]; 
    self.bottomMenuNode.zPosition=6; 

    self.homeButton=[[GameButtonNode alloc]initWithColor:self.level.baseColor strokeColor:[self.level levelColorWithBrightnessDelta:0.3 alpha:1.0] imageName:@"homeButton" radius:25 physics:NO delegate:self]; 
    self.homeButton.position=CGPointMake(35,60); 
    [self.bottomMenuNode addChild:self.homeButton]; 

    self.menuReplayButton=[[GameButtonNode alloc]initWithColor:self.level.baseColor strokeColor:[self.level levelColorWithBrightnessDelta:0.3 alpha:1.0] imageName:@"replayButton" radius:25 physics:NO delegate:self]; 
    self.menuReplayButton.position=CGPointMake(95,60); 
    [self.bottomMenuNode addChild:self.menuReplayButton]; 

    NSString *soundImage=[self soundImage]; 

    self.soundButton=[[GameButtonNode alloc]initWithColor:self.level.baseColor strokeColor:[self.level levelColorWithBrightnessDelta:0.3 alpha:1.0] imageName:soundImage radius:25 physics:NO delegate:self]; 
    self.soundButton.position=CGPointMake(155,60); 


    [self.bottomMenuNode addChild:self.soundButton]; 
    self.bottomMenuNode.position=CGPointMake(0, 0); 
    self.bottomMenuNode.hidden=YES; 
    self.bottomMenuNode.xScale=0.1; 
    self.bottomMenuNode.yScale=0.1; 

    [self.menuButton addChild:self.bottomMenuNode]; 


    self.menuButton.position=CGPointMake(40,35); 
    self.menuButton.zPosition=7; 
    [self addChild:self.menuButton]; 
} 

}

Код для GameBoardNode

-(instancetype) initWithColor:(UIColor *)color strokeColor:(UIColor *) strokeColor imageName:(NSString *)imageName radius:(CGFloat)radius physics:(BOOL)physics delegate:(id<GameButtonNodeDelegate>)delegate { 

if (self=[super init]) { 
    self.strokeColor=strokeColor; 
    self.ball=[SKShapeNode shapeNodeWithCircleOfRadius:radius]; 
    self.ball.fillColor=color; 
    self.ball.strokeColor=strokeColor; 
    self.ball.lineWidth=3.0; 
    self.ball.zPosition=0; 

    self.touchDelegate=delegate; 

    [self addChild:self.ball]; 

    self.icon=[SKSpriteNode spriteNodeWithImageNamed:imageName]; 
    self.icon.size=CGSizeMake(30, 30); 
    self.icon.zPosition=0; 
    self.enabled=YES; 


    [self addChild:self.icon]; 

    if (physics) { 

    self.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:radius ]; 
    self.physicsBody.affectedByGravity=YES; 

    } 

    self.userInteractionEnabled=YES; 

    self.fadeIn=[SKAction fadeInWithDuration:0.3]; 
    self.fadeOutRemove=[SKAction sequence:@[[SKAction waitForDuration:0.2],[SKAction fadeOutWithDuration:0.3],[SKAction removeFromParent]]]; 

} 

return self; 

}

это появляется выбор уровня Единственная проблема с этой точки зрения фоновое изображение (синий градиент) и затем исчезает. Фоновое изображение настроено в раскадровке.

  • Большинство изображений поступает из папки Images.xcassets.
  • Все изображения являются png.
  • битовый код выключен (если это имеет значение)

Любой другой код или изображения, просто спросите.

Как я могу исправить эту проблему и снова восстановить свою игру?

+1

У меня возникли аналогичные проблемы с изображениями с IOS 9, о которых я сообщил Apple, но пока не получил ответа. Случайно ли изображения не отображаются только на устройствах iPhone 4 и iPhone 5 и симуляторе? Кроме того, ваши изображения @ 2x ~ iphone, потому что я обнаружил, что изменение изображений на @ 2x универсальное, кажется, заставляет их появляться снова. – Jarron

+0

Они не работают на iPhone 5s. Я проверю другие 2 предложения. – huddie96

+0

@Jarron Игра универсальная (iPad, iPhone), поэтому она использует универсальные изображения. – huddie96

ответ

2

iOS 9 больше заботится о zPosition, чем iOS 8. В прошлом, если бы вы не установили zPosition, iOS8 сделал бы действительно хорошую работу, предполагая, что вы хотели. В iOS9 все равно, и он сделает это, но он хочет.

Я также заметил, что оставляя его на ноге тоже очень плохо. Например, если у вас есть узел в 0 и добавьте ребенка с zPosition 0, они оба равны 0, а iOS9 выберет тот, который он должен отобразить первым. Если я прав, это должно привести к тому, что ваше верхнее пятно снова появится.

if (self.topHud == nil) { 
    self.topHud=[SKShapeNode shapeNodeWithRect:CGRectMake(-2,self.frame.size.height-62,self.frame.size.width+2,64)]; 

    self.topHud.fillColor=[UIColor clearColor]; 
    self.topHud.strokeColor=[UIColor clearColor]; 
    self.topHud.lineWidth=0; 
    self.topHud.zPosition = 100;//added zPosition 
    [self addChild:self.topHud]; 

    UIColor *textColor=[self.level textColor]; 

    self.scoreLabel=[SKLabelNode labelNodeWithFontNamed:@"Blow"]; 
    self.scoreLabel.fontSize=20; 
    self.scoreLabel.alpha = 1; 
    self.scoreLabel.zPosition = 1;//added zPosition 
    self.scoreLabel.horizontalAlignmentMode=SKLabelHorizontalAlignmentModeRight; 
    self.scoreLabel.fontColor=textColor; 
    self.scoreLabel.position=CGPointMake(self.frame.size.width-8,self.frame.size.height-25); 
    self.score=0; 
    [self.topHud addChild:self.scoreLabel]; 

    self.highScoreLabel=[SKLabelNode labelNodeWithFontNamed:@"Blow"]; 
    self.highScoreLabel.fontSize=20; 
    self.highScoreLabel.alpha = 1; 
    self.highScoreLabel.horizontalAlignmentMode=SKLabelHorizontalAlignmentModeRight; 
    self.highScoreLabel.fontColor=textColor; 
    self.highScoreLabel.position=CGPointMake(self.frame.size.width-8,self.frame.size.height-50); 
    self.highScoreLabel.zPosition = 1;//added zPosition 
    //self.highScore=0; 
    [self.topHud addChild:self.highScoreLabel]; 

примечание 4 добавлены позиции z. Надеюсь, что это поможет добиться успеха в правильном направлении.

+0

zПопозиции действительно кажутся проблемой, чем выше число, чем раньше они были созданы? Например, если бы у меня было представление с zPos 1 и другое с zPos 2 одинаковым пятном и размером, я бы никогда не увидел первый вид? – huddie96

+1

Чем меньше число, тем раньше оно нарисовано. Например, фон будет 0, игровой материал может быть от 1 до 99, а hud может быть 100, и это будет отображаться в правильном порядке. Также обратите внимание, что zPosition основан на родительском zPosition. Итак, если один из zPosition 10 и вы добавляете ребенка с zPosition 2 ... его реальный мир zPosition будет 12. Надеюсь, это имеет смысл. –

+0

ваш ответ на причину был правильным, но пример кода не работал – huddie96

Смежные вопросы