我正在使用 curses 用 Python 编写一个非常简单的农业游戏。在这一点上,我已经成功地允许玩家(只是一个“@”字符)在一个窗口内移动。
我有一些带有 ascii-art 的文件,我将它们打印到窗口中,作为填充玩家可以在其中移动的世界的东西。例如,我有一个名为“house”的文件,其中包含:
_ . ^ . _
/____.____\
| |
| ## _ ## |
|_""_H_""_|
我有一个事物类如下:
class Thing(object):
def __init__(self, Xstart, Ystart, looksLike, list, window):
self.Xstart = Xstart
self.Ystart = Ystart
self.X = Xstart
self.Y = Ystart
self.looksLike = looksLike
self.boundries = []
self.find_boundries()
list.append(self)
self.draw(window)
def find_boundries(self):
file = open(self.looksLike).readlines()
for line in file:
for char in line:
if char == '\n':
pass
elif char == ' ': # skip all whitespace
self.X += 1
else:
self.boundries.append([self.X, self.Y])
self.X += 1
self.Y += 1
self.X = self.Xstart
self.X = self.Xstart # reset x & y to starting coordinates
self.Y = self.Ystart
def draw(self, window):
#file = open(self.looksLike).readlines()
#for line in file:
# window.addstr(self.Y, self.X, line)
# self.Y += 1
#self.Y = self.Ystart
file = open(self.looksLike).read()
for char in file:
window.addch(self.Y, self.X, char)
if char == '\n':
self.Y += 1
self.X = self.Xstart
else:
self.X += 1
self.X = self.Xstart
self.Y = self.Ystart
因此,我的 Thing 类的构造函数将文件名作为参数 (looksLike),draw 方法打开文件,读取它,并将其内容打印到窗口。然后,我可以创建一个房子对象,将我的“房子”文件作为参数传递,我的 ascii 房子将被打印到窗口上。
问题是,一旦将对象打印到窗口,当我将播放器移动到打印对象的右侧时,播放器就会消失。但是,在打印对象的上方、下方和左侧,玩家仍然在视野中。例如,
_ . ^ . _
/____.____\
| |
| ## _ ## |
|_""_H_""_|
@
在这个位置,“@”字符是可见的,但如果我向上移动一个空格,它就会消失。如果我继续向上移动播放器,“@”将在它移动到房子最上面的字符后重新出现。
我认为这个问题是由于 addstr() 和 addch() 的性质(我都尝试过)打印空白直到窗口结束,但我找不到任何关于此的文档。
我考虑过为每个打印的对象创建一个新窗口,但是当将多个对象打印到窗口时,这似乎会变得非常麻烦。另外,我希望在打印到屏幕上的对象周围定义边框,这些边框不仅仅是正方形或矩形。
无论如何从文件打印到窗口而没有尾随空格并且没有为每个打印对象创建一个新窗口?