2015-12-03 86 views
2

我對spritekit座標系非常困惑。我需要澄清兩起案件。SpriteKit中的座標系

案例1:

當一個精靈節點作爲子項添加到場景:

SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"]; 
[email protected]"blueball"; 
blueBall.size=CGSizeMake(75, 75); 
blueBall.position=point; //I am varying this point 
[self addChild:blueBall]; 

我加入了在不同的點節點的每個time.These是我加了點在節點:(100x100)(200x200)(300x300)(400x400)(900,600)

在我的iPhone 5的設備,他們是這樣的:

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

如果你看看100×100,當我在點(100,100)加雪碧,在設備上,當我登錄的節點位置,它給我(99.9,138.17)這與點(100,100)相比是巨大的差異。

儘管其他點也有變化,但我忽略了它們,因爲其他點的差別太小了。

-(void)didMoveToView:(SKView *)view { 
    /* Setup your scene here */ 
     [self bounceTheBlueBallAtPoint:CGPointMake(100, 100)]; 

} 

    -(void)bounceTheBlueBallAtPoint:(CGPoint)point{ 


    SKSpriteNode * blueBall = [SKSpriteNode spriteNodeWithImageNamed:@"hRedBall.png"]; 
    [email protected]"blueball"; 
    blueBall.size=CGSizeMake(75, 75); 

    blueBall.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:blueBall.frame.size.width/2]; 


    blueBall.physicsBody.categoryBitMask=blueBallHitCategory; 
    blueBall.physicsBody.collisionBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory; 
    blueBall.physicsBody.contactTestBitMask=blueBallHitCategory|pinkBallHitCategory|wallHitCategory; 

    blueBall.physicsBody.dynamic=YES; 
    blueBall.physicsBody.affectedByGravity=NO; 
    blueBall.physicsBody.restitution=1.0; 
    blueBall.physicsBody.friction=0.0; 
    blueBall.physicsBody.linearDamping=0.0; 
    blueBall.physicsBody.angularDamping=0.0; 

    blueBall.position=point; 

    [self addChild:blueBall]; 


    //applying impulse to bounce off 
// CGVector impulse = CGVectorMake(30.0,60.0); 
// [blueBall.physicsBody applyImpulse:impulse]; 
//  

} 

我檢查在這種方法中,球的位置:

 -(void)update:(CFTimeInterval)currentTime { 
    /* Called before each frame is rendered */ 

    [self checkSpriteMovement]; 

    } 

    -(void)checkSpriteMovement{ 

    [self enumerateChildNodesWithName:@"blueball" usingBlock:^(SKNode * _Nonnull node, BOOL * _Nonnull stop) { 

     SKSpriteNode *ball=(SKSpriteNode *)node; 

     if (ball.physicsBody.resting) { 

      NSLog(@"The ball position is %@",NSStringFromCGPoint(ball.position)); 
     } 

    }]; 

} 

案例2:

比方說,我有一個背景精靈節點,我的球節點添加到這個而不是將球節點添加到場景中。

_background = [SKSpriteNode spriteNodeWithImageNamed:@"parkImage.jpg"]; 
_background.size = self.frame.size; //frame size is (1024x768) 
_background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
[self addChild:_background]; 

,然後我將球節點添加到這個背景:

[_background addChild:blueBall]; 

這是添加了背景節點:

enter image description here

現在我試圖球加入到加背景:

點:(100,100):

enter image description here

在點:( - 280,-150)

enter image description here

我也想討論第三種情況:

案例3:

我想要另一個節點來精靈backgorund叫環。後來我想添加球到背景。所以會有2個子節點。

_ringNode=[SKSpriteNode spriteNodeWithImageNamed:@"hue_ring.png"]; 
_ringNode.size=CGSizeMake(80, 80); 
_ringNode.position=CGPointMake(0, 0); //center point of background in this case 
_ringNode.anchorPoint=CGPointMake(0.5,0.5); 
_ringNode.name=kRingNodeName; 
[_background addChild:_ringNode]; 

所以環將在這裏:

enter image description here

現在我想的球節點添加到背景節點:

我用同樣的代碼中添加球在點(-280,-150):

enter image description here

爲什麼場景和精靈節點的座標系有變化?

我面臨的另一個問題是:

雖然現場啓動節點不會添加到現場properly.Even,節點是不可見的用戶,但我可以看到的節點數它說屏幕上有節點。我需要再次運行代碼才能看到正確添加到場景中的節點。這種情況每4次發生一次。我只需要停止代碼並再次運行它以查看碎石上的球,否則我會看到沒有任何球的背景,儘管我將它們添加到背景中。

這是怎麼發生的?

,我將所有的節點didMoveToView

+0

請顯示案例1的代碼。 – trojanfoe

+0

代碼添加到案例1 @trojanfoe –

+0

我不認爲這是案例1的代碼。它看起來像案例2。 – trojanfoe

回答

4

好的,所以要回答這個問題很難,因爲它不像你有一個問題,但我會盡我所能解釋爲什麼事情正在發生。

首先要考慮的事情。你的場景是1024 x 768(猜測是因爲你的一個評論和你的問題)現在這會導致一些問題。首先是你的手機不是那種寬高比,你的手機不是那麼大。如果你看看你的ViewController,你可能會看到一些AspectFill或AspectFit被設置。這縮小了你的場景。當涉及到你所看到的以及你在代碼中做什麼時,事情不再是1:1的定位。

讓我們走得更遠。場景的原點位於左下方,取決於您的場景大小和縮放比例,它可能會在屏幕外。這是0,0的地方。所以你添加的每一個孩子都會從那裏開始,並根據位置正確地工作。 SKSpriteNode的起源在中心。例如,你的背景會在中心出現。注意如何將位置設置爲框架寬度和高度的一半。它的起源在中間,你將它移到右邊,並從左下角向上移動到正確的距離。現在,當您將一個子節點添加到該節點時,它將從其父節點的起點開始。在這個例子中心。所以這就是爲什麼當你向背景添加一個球時你必須給它負值才能到達左下角。

就節點沒有顯示出來。如果你看看你的ViewController,你可能會看到忽略了兄弟順序或這種性質的東西。這意味着您必須設置節點的zPosition。較低的zPositions首先被渲染,所以背景通常是0,並且所有顯示在背景之上的節點都會得到1或更高的zPosition。

希望有幫助。雖然你的問題已經很好地記錄下來,但是在一個答案中很難回答你的所有問題。在將來,我會建議在第一個問題得到解答之後提出問題並提出一個新問題,因爲在您有機會問問問題之前,您可能會知道答案=)

2

案例1:不知道爲什麼它的38餘分折;我需要看看添加節點的代碼。

情況2和3:場景和精靈節點具有不同的定位點。對於SKScene它是(0.0,0.0),對於SKSpriteNode它是(0.5,0.5)。

+0

我也添加了案例1的代碼。如果你看看didmovetoview方法,你會發現點100,100 –

+0

在藍色ball.position =點;線的點是100,100 –

+0

但是,這是使用物理和添加節點到後臺節點。這不是案例1中提出的問題。我需要確保您在查看當前位置時通過(100,100)並查看(100,138)。 – trojanfoe