2014-09-26 13 views
5

Tworzę grę typu ball/paddle "breakout" na iOS8, gdzie bloki spadają z góry ekranu.Dziwny błąd zmiany rozmiaru ekranu podczas wywoływania shadowCastBitMask =

postanowiłem spróbować nowego SKLightNode Apple w sprite-kit i wyszło wspaniale, rzucając światło od góry ekranu:

w levelScene.h:

#import <SpriteKit/SpriteKit.h> 

w levelScene.m :

-(id)initWithSize:(CGSize)size { 
... 

SKLightNode* light = [[SKLightNode alloc] init]; 
    // light.enabled = YES; 
light.categoryBitMask = lightCategory; 
light.falloff = 1; 
light.ambientColor = [UIColor whiteColor]; 
light.lightColor = [[UIColor alloc] initWithRed:0.0 green:1.0 blue:0.5 alpha:0.5]; 
light.shadowColor = [[UIColor alloc] initWithRed:0.0 green:0.0 blue:0.0 alpha:0.2]; 
light.position = CGPointMake(CGRectGetMidX(self.frame), self.frame.size.height - 20); 

[self addChild:light]; 
... 
} 

i rzuca cień z łopatką u dołu ekranu:

-(id)initWithSize:(CGSize)size { 
... 
self.paddle.shadowCastBitMask = lightCategory; 
... 
} 

Jednak, gdy próbuję sprawić, że moje spadające bloki rzucają cień, definiując shadowSastBitMask z moich prostokątnych (lub blokujących) elementów spriteNodes, które w przeciwieństwie do wiosła są dodawane w różnych odstępach czasu podczas odtwarzania, doświadczam dziwnego rodzaju obcinania gdzie cały ekran i cała jego zawartość zmieniają rozmiar na około 60% -80% pierwotnego rozmiaru, zmniejszając się nieznacznie pionowo. Jest to tylko przez krótką chwilę, więc nie mogę wyrobić sobie przyzwoitej idei tego, co robi na obrazie, nie mówiąc już dlaczego. Nie znalazłem nic związanego z tym błędem w Internecie.

Mogę powiedzieć, że jest odtworzony za każdym razem, że blok wchodzi od góry ekranu, nawet za pierwszym razem, sugerując, że nie ma to nic wspólnego z jednoczesnym wywołaniem wielu instancji. Ponieważ wiosło (i kulka podczas testowania) wydaje się rzucać cienie bez problemów, mogę tylko założyć, że ma to związek z faktem, że rozmowa jest wykonywana podczas rozgrywki, a nie przed jej rozpoczęciem, jak to ma miejsce w przypadku gry. paddle, lub że jest coś w moim wywołaniu -addRectangle, którego mi brakuje.

Tak oto - (void) addRectangle w całości przyjąć shadowCastBitMask = ... połączenie jest blisko końca:

- (void)addRectangle { 

// Create sprite 
self.rectangle = [SKSpriteNode spriteNodeWithImageNamed:@"Rectangle"]; 

// Determine where to spawn the rectangle along the X axis 



int minX = (CGRectGetMinX(self.frame) + (self.rectangle.size.width/2)) ; 
int maxX= ((CGRectGetMaxX(self.frame)) - (self.rectangle.size.width)) ; 


int actualX = (arc4random_uniform(maxX) +minX); 

// Create the rectangle slightly off-screen 
self.rectangle.position = CGPointMake(actualX, self.frame.size.height + self.rectangle.size.height/1); 

self.rectangle.zPosition = 5; 




// Determine speed of the rectangle 



    if(multiplier>=29 && multiplier<49){ 

    int minDuration = 5.5; 
    int maxDuration = 7.0; 
    int rangeDuration = maxDuration - minDuration; 
    int actualDuration = (arc4random() % rangeDuration) + minDuration; 

    // Create the actions 
    SKAction * actionMove = [SKAction moveTo:CGPointMake(actualX, -self.rectangle.size.height/1) duration:actualDuration]; 
      [self.rectangle runAction:actionMove]; 
} 


if(multiplier>=49 && multiplier < 99){ 

int minDuration = 4.0; 
int maxDuration = 5.0; 
int rangeDuration = maxDuration - minDuration; 
int actualDuration = (arc4random() % rangeDuration) + minDuration; 

// Create the actions 
SKAction * actionMove = [SKAction moveTo:CGPointMake(actualX, -self.rectangle.size.height/1) duration:actualDuration]; 
     [self.rectangle runAction:actionMove]; 
    } 

if(multiplier>=99){ 

    int minDuration = 3.0; 
    int maxDuration = 4.0; 
    int rangeDuration = maxDuration - minDuration; 
    int actualDuration = (arc4random() % rangeDuration) + minDuration; 

    // Create the actions 
    SKAction * actionMove = [SKAction moveTo:CGPointMake(actualX, -self.rectangle.size.height/1) duration:actualDuration]; 
    [self.rectangle runAction:actionMove]; 
} 




else if (multiplier<29){ 

    int minDuration = 6.0; 
    int maxDuration = 10.0; 
    int rangeDuration = maxDuration - minDuration; 
    int actualDuration = (arc4random() % rangeDuration) + minDuration; 

    // Create the actions 
    SKAction * actionMove = [SKAction moveTo:CGPointMake(actualX, -self.rectangle.size.height/1) duration:actualDuration]; 
     [self.rectangle runAction:actionMove]; 
} 



self.rectangle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.rectangle.size]; 

self.rectangle.physicsBody.dynamic = YES; 
self.rectangle.physicsBody.restitution = 0.4f; 
self.rectangle.physicsBody.density = 1000; 
self.rectangle.physicsBody.categoryBitMask = blockCategory; 
self.rectangle.physicsBody.contactTestBitMask = bottomCategory | paddleCategory | laserCategory; 
self.rectangle.physicsBody.collisionBitMask = 0x0 ; 
self.rectangle.physicsBody.affectedByGravity = NO; 

//the offending line: 

    self.rectangle.shadowCastBitMask = lightCategory; 

[self addChild:self.rectangle]; 
[_blocks addObject:self.rectangle]; 

_EyeLeft = [SKSpriteNode spriteNodeWithImageNamed:@"Eye"]; 

    _EyeLeft.position = CGPointMake(_EyeLeft.parent.position.x-10, _EyeLeft.parent.position.y) ; 
// _EyeLeft.zPosition = 7; 
    _EyeLeft.physicsBody.allowsRotation = YES; 
_EyeLeft.name = @"Eye"; 
[self.rectangle addChild: _EyeLeft]; 
[_Eyes addObject:_EyeLeft]; 



_EyeRight = [SKSpriteNode spriteNodeWithImageNamed:@"Eye"]; 

_EyeRight.position = CGPointMake(_EyeRight.parent.position.x+10, _EyeRight.parent.position.y) ; 
    // _EyeRight.zPosition = 7; 
_EyeRight.physicsBody.allowsRotation = YES; 
_EyeRight.name = @"Eye"; 

    // _EyeLeft.physicsBody.angularDamping = 0.2; 

[self.rectangle addChild: _EyeRight]; 
[_Eyes addObject:_EyeRight]; 


} 

Błąd nie jest odtwarzany, jeśli po prostu usunąć shadowCastBitMask = ... zadzwoń, ale potem nie dostaję cieni.

Ja też nie rozumiem, dlaczego cały obraz zmieniłby się, ponieważ nie jestem, o ile mi wiadomo, wywoływanie jakichkolwiek poleceń związanych z skalą lub sceną w tym czasie, z pewnością nie wywołanych przez takie połączenie .

Każda pomoc w ogóle byłaby bardzo ceniona, Z góry dziękujemy za poświęcony czas i każdą oferowaną pomoc.

+1

I Get to zbyt. Znalazłeś rozwiązanie? – RichS

+1

Nigdy się nie bałem, porzuciłem cienie na spadających klockach i zamiast tego użyłem ich na wiosła, nie ma problemu z tym najwyraźniej:/ – lazyjoeco

+0

Wstyd. Dziękuję za odpowiedź. – RichS

Odpowiedz

0

miałem ten problem, zauważyłem to się stało w przypadku korzystania z tilemap, więc po prostu używany statyczny duży obraz dla BG i wydaje się, że rozwiązał problem