无法精确定位网格中的SKShapeNode(矩形)

时间:2014-05-19 08:42:27

标签: sprite-kit skshapenode

成为obj-c语言和Sprite工具包的新手我很难在网格中定位矩形......

我创建的矩形中有一个偏移 - 如果我设法让代码在一个选定的字段中定位一个矩形,那么另一个矩形将被偏移......

我尝试了几种不同的方法,我可以使用JavaFX来实现它。我做错了什么?

下面的照片清楚地显示了我的问题。

enter image description here

我的代码非常简单,可以在这里看到:

#import "MyScene.h"

@implementation MyScene

const int ROWS = 10;

-(id)initWithSize:(CGSize)size {    
if (self = [super initWithSize:size]) {
    /* Setup your scene here */

    self.backgroundColor = [SKColor darkGrayColor];

    [self createBoardWithRows:ROWS];

    [self createBoxPositionX:1 positionY:1];
    [self createBoxPositionX:3 positionY:3];
    [self createBoxPositionX:5 positionY:5];

}
return self;
}

-(void) createBoardWithRows: (int) rows{

for (int i = 1; i < rows; i++){

    //Horisontal lines
    int yPos = self.size.height/rows * i;

    SKShapeNode *lineH = [SKShapeNode node];
    CGMutablePathRef pathToDraw = CGPathCreateMutable();

    CGPathMoveToPoint(pathToDraw, NULL, 0, yPos);
    CGPathAddLineToPoint(pathToDraw, NULL, self.size.width, yPos);

    lineH.path = pathToDraw;
    lineH.lineWidth = 1.0;
    [lineH setStrokeColor:[UIColor blackColor]];


    //Vertical Lines
    int xPos = self.size.width/rows * i;

    SKShapeNode *lineV = [SKShapeNode node];

    CGPathMoveToPoint(pathToDraw, NULL, xPos, 0);
    CGPathAddLineToPoint(pathToDraw, NULL, xPos, self.size.height);

    lineV.path = pathToDraw;
    lineV.lineWidth = 1.0;
    [lineV setStrokeColor:[UIColor blackColor]];

    //Add lines
    [self addChild:lineH];
    [self addChild:lineV];
}
}

-(void) createBoxPositionX:(int) fieldIndexX positionY:(int) fieldIndexY{

int width = self.size.width/ROWS;
int height = self.size.height/ROWS;

int x = (width * fieldIndexX);
int y = (height * fieldIndexY);

CGRect box = CGRectMake(x, y, width, height);

SKShapeNode *shapeNode = [[SKShapeNode alloc] init];
shapeNode.path = [UIBezierPath bezierPathWithRect:box].CGPath;
shapeNode.fillColor = SKColor.yellowColor;
//Stroke settings
shapeNode.strokeColor = [SKColor clearColor];
shapeNode.lineWidth = 0;
[self addChild:shapeNode];

//Alternative rectangle
//SKSpriteNode spriteNodeWithColor:CGSize:
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
}

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

@end

2 个答案:

答案 0 :(得分:3)

看起来你似乎没有考虑每个方框中边框的线宽 - 所以当你创建黄色方框时,它们会被相当于“边框”数量的点数所取代。

要解决此问题,请更改以下两行:

int x = (width * fieldIndexX);
int y = (height * fieldIndexY);

为:

int x = (width * fieldIndexX) + fieldIndexX;
int y = (height * fieldIndexY) + fieldIndexY;

答案 1 :(得分:0)

如果您向任何方向移动1个像素,则可能是锚点问题。 默认情况下它是0.5,0.5 - 在精灵的中心。 因此,如果你的精灵有均匀的长度,例如4,中间可以落在2或3上,你将获得1个像素的定位。

对此的修复很明确,将节点的锚点设置为0,0,如下所示:

node.anchorPoint = CGPointMake(0,0);

这样做是为了将精灵固定在父级左下角而不是中心。由于左下角始终以0,0像素开始,因此无论节点的像素数如何,您都将拥有正确的位置。

但是你必须调整节点位置以适应这种变化。

希望这有帮助。