SpriteKit
我搜索了文档和stackoverflow,但未能找到有用的资料。
当用户在屏幕上拖动我的SKpriteNodes时,我正在更新精灵的zPosition,以便在必要时在其他精灵前面正确显示精灵。我需要它如何工作是基于精灵的yPosition。具有较高yPosition的精灵需要位于具有较低yPosition的精灵之前。所以我只是将yPosition设置为zPosition,这几乎可以正常工作。
由于SpriteKit的坐标系,当精灵在屏幕的一半左右时,yPosition会达到零,然后进入负数 - 这对我的zPosition有一个向后的影响。我尝试使用[self convertPointToView]方法将点从场景坐标转换为视图坐标,但没有帮助。我想知道这是否与父级(背景spritenode)有关,它具有CGPointZero的锚点 - 这仍然让我感到困惑。
有关如何根据yPosition正确设置zPosition的任何建议 - 或者是否可以更改场景的坐标系。 (看来{0,0}不是我背景节点的左下角,而是屏幕的中心)
-(id)initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
//_field is the background of my scene
_field = [SKSpriteNode spriteNodeWithImageNamed:@"field"];
[_field setName:@"field"];
[_field setXScale:fieldMAX_x];
[_field setYScale:fieldMAX_y];
[_field setAnchorPoint:CGPointZero];
[self addChild:_field];
//creates an array of childNodes and positions them into a block
for (int marcherNumber=1; marcherNumber < 101; marcherNumber++)
{
Marcher* marcher = [Marcher node];
[_field addChild:[marcher createTypeOfNode:hornline
inSection:trumpet
atPosition:marcherPoint]];
//here is where I initially set the zPosition based on it's yPosition
marcher.zPosition = marcher.frame.origin.y;
[arrayOfMarcherInstances addObject:marcher];
//set the point for the next node to be positioned at
marcherPoint.x += 30;
if ((marcherNumber == 10) ||
(marcherNumber == 20) ||
(marcherNumber == 30) ||
(marcherNumber == 40) ||
(marcherNumber == 50) ||
(marcherNumber == 60) ||
(marcherNumber == 70) ||
(marcherNumber == 80) ||
(marcherNumber == 90))
{
marcherPoint.x = defaultMarcherPoint.x;
marcherPoint.y += 30;
}
}
}
}
-(void)PanMethod
{
for (Marcher * marcherInstance in arrayOfMarcherInstances)
{
//if you find one that is 'selected', then move it
if (marcherInstance.isMarcherSelected)
{
//here I tried converting the Point -- (I tried convertPointFromView and convertPointToView)
tempY = [self convertPointFromView:marcherInstance.marcherNode.position].y;
//here I tried converting the negative yPos's into positive yPos's - no help
if (tempY < 0)
tempY = tempY * -1;
marcherInstance.marcherNode.zPosition = tempY;
[marcherInstance.marcherNode setPosition:CGPointMake(marcherInstance.marcherNode.position.x + translation.x, marcherInstance.marcherNode.position.y + translation.y)];
[marcherInstance.marcherSelectionNode setPosition:[self setBoxPositionBasedOnMarcherPosition:marcherInstance.marcherNode]];
}
}
}
答案 0 :(得分:0)
作为快速修复,尝试在每个点的y位置添加一些常量,只要该常量大于场景高度的一半。
答案 1 :(得分:0)
我怀疑您遇到的问题是尝试从视图转换点。 Sprite Kit使用坐标系统,屏幕下方为0。传统的UIKit使用坐标系,其中0位于屏幕顶部。
如果您只使用nodeImTouching.position.y,那么您应该获得一个相对于场景的位置。你在触摸的东西,在一个不是场景的节点内吗?如果是这种情况那么你需要将该节点的位置转换为场景的坐标系,因为被触摸的节点在其父节点内报告它的位置。
CGPoint pointInScene = [touchedNode.parent convertPoint:touchedNode.position toNode:theMainScene];