gpt4 book ai didi

objective-c - 用 cocoa 画板/网格

转载 作者:行者123 更新时间:2023-12-03 17:27:50 28 4
gpt4 key购买 nike

我正在使用 Cocoa 为 Mac OS X 编写一个小型棋盘游戏。我实际的网格绘制如下:

- (void)drawRect:(NSRect)rect
{
for (int x=0; x < GRIDSIZE; x++) {
for (int y=0; y < GRIDSIZE; y++) {

float ix = x*cellWidth;
float iy = y*cellHeight;

NSColor *color = (x % 2 == y % 2) ? boardColors[0] : boardColors[1];
[color set];

NSRect r = NSMakeRect(ix, iy, cellWidth, cellHeight);

NSBezierPath *path = [NSBezierPath bezierPath];
[path appendBezierPathWithRect:r];

[path fill];
[path stroke];
}
}
}

这效果很好,只是我发现图 block 之间的颜色存在一些错误。我想这是由于一些抗锯齿或类似的原因。请参阅下面的屏幕截图(希望您也能看到相同的问题......它是图 block 重叠处的一些黑线):

rendered board

因此我有以下问题:

  1. 有什么方法可以消除这些图形伪影,同时仍然保留可调整大小/可扩展的板?
  2. 我应该使用其他图形库,例如 Core Graphics 或 OpenGL?

更新:

const int GRIDSIZE = 16;
cellWidth = (frame.size.width / GRIDSIZE);
cellHeight = (frame.size.height / GRIDSIZE);

最佳答案

如果您想要清晰的矩形,您需要对齐坐标,以便它们与底层像素匹配。 NSView 有一个用于此目的的方法:- (NSRect)backingAlignedRect:(NSRect)aRect options:(NSAlignmentOptions)options。这是绘制网格的完整示例:

const NSInteger GRIDSIZE = 16;

- (void)drawRect:(NSRect)dirtyRect {
for (NSUInteger x = 0; x < GRIDSIZE; x++) {
for (NSUInteger y = 0; y < GRIDSIZE; y++) {
NSColor *color = (x % 2 == y % 2) ? [NSColor greenColor] : [NSColor redColor];
[color set];
[NSBezierPath fillRect:[self rectOfCellAtColumn:x row:y]];
}
}
}

- (NSRect)rectOfCellAtColumn:(NSUInteger)column row:(NSUInteger)row {
NSRect frame = [self frame];
CGFloat cellWidth = frame.size.width / GRIDSIZE;
CGFloat cellHeight = frame.size.height / GRIDSIZE;
CGFloat x = column * cellWidth;
CGFloat y = row * cellHeight;
NSRect rect = NSMakeRect(x, y, cellWidth, cellHeight);
NSAlignmentOptions alignOpts = NSAlignMinXNearest | NSAlignMinYNearest |
NSAlignMaxXNearest | NSAlignMaxYNearest ;
return [self backingAlignedRect:rect options:alignOpts];
}

请注意,您不需要笔画来绘制游戏板。要绘制像素对齐的笔划,您需要记住 Cocoa 中的坐标实际上指向像素的左下角。为了使线条清晰,您需要将坐标从积分坐标偏移半个像素,以便坐标指向像素的中心。例如,要为网格单元绘制清晰的边框,您可以这样做:

NSRect rect = NSInsetRect([self rectOfCellAtColumn:column row:row], 0.5, 0.5);
[NSBezierPath strokeRect:rect];

关于objective-c - 用 cocoa 画板/网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18344776/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com