目前正在编写 roguelike 以了解有关 Objective-C/Cocoa 的更多信息。到目前为止,我真的很喜欢它,而且我学到了很多东西。
此代码移动origin
视图的bounds
,以便它在玩家移动时跟随玩家。代码运行完美,我只是问是否有比使用 4 更好for
的方法。
在某些情况下,我还看到最好分开做事情而不是一体做事,尤其是在绘图和nsbezierpath
涉及到的情况下,这是为什么呢?
编辑:人们很难弄清楚我在做什么,所以我会尽可能多地分解它。
这view
是一个 30x30 的网格 (0-29,0-29),每个 20x20。地图可以根据需要变大或变小。
首先,您得到,[player_ location]
以及origin
的bounds
。view
它被除以20
因为瓷砖大小是20,
所以当它在 时(1,2)
,它实际上是在(20,40)
。我这样做的唯一原因是使其更易于操作(以 1 为单位比以 20 为单位更容易计数)。四个人for
通过并检查[player_ location]
是否在中心 ( ) 的15
瓷砖内。如果玩家正在向屏幕的边缘之一移动,并且小于当前地图的高度/宽度,它会移动 以使玩家仍然居中并显示在地图上。bounds + 15
view
bounds.x/y + 30
origin
代码运行完美,我在 ' 发生setbounds
后将其移至for
,并且只有一个。它没有被遗忘drawRect
,我只是在这里尝试弄清楚我需要做什么。它现在在它自己的位置,并且仅在玩家实际移动时才被调用。
这是新代码:
- (void)keepViewCentered
{
NSPoint pl = [player_ location];
NSPoint ll;
NSPoint location = [self bounds].origin;
ll.x = location.x / 20;
ll.y = location.y / 20;
for ( pl.y = [player_ location].y; pl.y >= ll.y + 15 && ll.y + 30 < [currentMap_ height]; ll.y++ )
{
location.y = ll.y * 20;
}
for ( pl.x = [player_ location].x; pl.x >= ll.x + 15 && ll.x + 30 < [currentMap_ width]; ll.x++ )
{
location.x = ll.x * 20;
}
for ( pl.y = [player_ location].y; pl.y <= ll.y + 15 && ll.y >= 0; ll.y-- )
{
location.y = ll.y * 20;
}
for ( pl.x = [player_ location].x; pl.x <= ll.x + 15 && ll.x >= 0; ll.x-- )
{
location.x = ll.x * 20;
}
[self setBoundsOrigin: location];
}
这是它的图片!
图 1:这是 1,1 处的玩家。没什么特别的。 http://sneakyness.com/stackoverflow/SRLbounds1.png
图 2:3 个金块表示在视图的 bounds.origin 移动到保持在玩家中心之前玩家可以移动多远。尽管无关紧要,但请注意玩家实际上看不到黄金。事实证明,编程视野是一个备受争议的领域,您可以使用几种不同的算法,它们都没有缺点,或者已被移植到 Objective-C。目前它只是一个正方形。看穿墙壁和一切。 http://sneakyness.com/stackoverflow/SRLbounds2.png
图 3:具有不同 bounds.origin 的视图,以玩家为中心。 http://sneakyness.com/stackoverflow/SRLbounds3.png