2014-10-12 5 views
1

왜 슬라이드가 발생했는지 판단하려고합니다. 나는 2 개의 노드를 만들었고 그 중 하나는 SKAction을 사용하여 움직이고 있습니다. 그러나 그들 중 하나가 위에있을 때 노드 아래에 움직이지 않습니다.SpriteKit SKSpriteNode slide

그것은 설명하기 조금 어려운, 그래서이 비디오 만든 : 귀하의 답변에 대한 https://www.youtube.com/watch?v=F4OuTBVd5sM&feature=youtube_gdata_player

감사합니다! 코드의

부품 :

CGPoint positionPoint = [valuePoint CGPointValue]; 
    SKSpriteNode *slab = [SKSpriteNode spriteNodeWithTexture:plitaTexture]; 
    slab.name = @"plita"; 
    slab.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:plitaTexture.size]; 
    slab.position = positionPoint; 
    slab.physicsBody.dynamic = NO; 
    CGFloat duration = 3.0; 
    CGFloat firstDuration = duration/(self.size.width/slab.position.x); 
    SKAction *moveLeftFirstTime = [SKAction moveTo:CGPointMake(0.0 + plitaTexture.size.width/2, positionPoint.y) duration:firstDuration]; 
    SKAction *moveLeft = [SKAction moveTo:CGPointMake(0.0 + plitaTexture.size.width/2, positionPoint.y) duration:5]; 
    SKAction *moveRight = [SKAction moveTo:CGPointMake(self.size.width - plitaTexture.size.width/2, positionPoint.y) duration:5]; 
    SKAction *movingRightLeft = [SKAction sequence:@[moveRight, moveLeft]]; 
    SKAction *moving = [SKAction sequence:@[moveLeftFirstTime,[SKAction repeatActionForever:movingRightLeft]]]; 
    [slab runAction:moving]; 
    [self addChild:slab]; 

토끼 초기화 코드 :

-(instancetype)init { 
    if (self = [super initWithImageNamed:@"eating-rabbit1"]) { 
     self.physicsBody = [SKPhysicsBody bodyWithTexture:self.texture size:self.texture.size]; 
     self.physicsBody.allowsRotation = NO; 
     self.physicsBody.dynamic = YES; 
     self.physicsBody.friction = 1; 
    } 
    return self; 
} 

답변

2

시간이 지남에 따라 슬래브의 위치를 ​​변경하여 움직이기 때문에 주인공이 움직입니다. 당신이 움직이고있는 열차의 꼭대기에 서 있다고 상상해보십시오, 마찰로 인해 열차의 방향으로 움직일 것입니다. 그러나 기차가 마침내 점 A에서 점 B로 마침내 사라지고 한 번에 1cm 씩 움직이면 마침내 A 지점에 머물러있게됩니다. 주인공에게 무슨 일이 일어 났습니까?

이 문제를 해결하려면 물리를 사용하여 슬라브를 이동해야합니다. 다음은이를 수행하는 방법의 예입니다.

slab.physicsBody.affectedByGravity = NO; 
slab.physicsBody.dynamic = YES; 

// These will help prevent the slab from twisting due to the weight of the main character 
slab.physicsBody.angularDamping = 1.0; 
slab.physicsBody.mass = 1e6; 

// Air resistance will slow slab's movement, set the damping to 0 
slab.physicsBody.linearDamping = 0; 

슬래브를 왼쪽과 오른쪽으로 이동할 일련의 SKActions를 정의하십시오. 원하는 모션을 얻으려면 속도 및 지속 시간 변수를 조정하십시오.

SKAction *moveLeft = [SKAction customActionWithDuration:0 actionBlock:^(SKNode *node, CGFloat elapsedTime){ 
    node.physicsBody.velocity = CGVectorMake(-speed, 0); 
}]; 
SKAction *moveRight = [SKAction customActionWithDuration:0 actionBlock:^(SKNode *node, CGFloat elapsedTime){ 
    node.physicsBody.velocity = CGVectorMake(speed, 0); 
}]; 

SKAction *wait = [SKAction waitForDuration:duration]; 

SKAction *action = [SKAction sequence:@[moveRight, wait, moveLeft, wait]]; 

[slab runAction:[SKAction repeatActionForever:action]]; 
+0

! 고마워요! – Stillfinder

0

당신은 동적으로 슬래브의 physicsBody을 설정해야합니다.

slab.physicsBody.dynamic = YES; 
slab.physicsBody.affectedByGravity = NO; 

비 동적 물리학 본문은 정적으로 렌더링되며 적용된 모든 힘과 충격을 무시합니다. 문서 here에서 해당 속성을 찾으십시오.

+0

감사합니다,하지만 난 비디오에서처럼 뭔가를 얻을이 경우 : https://www.youtube.com/watch?v=ewbTiUTm8cw&feature=youtube_gdata_player을 당신은 바위입니다 – Stillfinder