1

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

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

我尝试了几种不同的方法,我可以使用 JavaFX 让它工作。我究竟做错了什么?

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

在此处输入图像描述

我的代码相当简单,可以在这里看到:

#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 */
}

@结尾

4

2 回答 2

3

似乎您没有考虑每个框的边框线宽-因此,当您创建黄色框时,它们会被与“边框”数相等的点数移位。

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

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

至:

int x = (width * fieldIndexX) + fieldIndexX;
int y = (height * fieldIndexY) + fieldIndexY;
于 2014-05-19T10:34:24.963 回答
0

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

解决方法很明确,将节点的锚点设置为 0,0,如下所示:

node.anchorPoint = CGPointMake(0,0);

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

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

希望这可以帮助。

于 2014-05-20T14:05:50.537 回答