成为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 */
}
@end
答案 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像素开始,因此无论节点的像素数如何,您都将拥有正确的位置。
但是你必须调整节点位置以适应这种变化。
希望这有帮助。