マップの読み込み
マップの保存で作成したバイナリ形式のマップを読み込めるようにします。マップの読み込みはLキーを押してください。ウィンドウが開くのでマップ名を入力します。マップファイルの拡張子を除いて大文字にした名前がマップ名です。たとえば、field.mapを読み込みたいときはFIELDを入力します。
マップの読み込み
マップの保存はLキー。イベントハンドラを見るとSキーを入力したときマップ名を入力するInputWindowが開き、その名前をMapのload()に渡しています。
elif event.type == KEYDOWN and event.key == K_l: # マップをロード try: name = input_wnd.ask(screen, "LOAD?") map.load(name) except IOError: print "Cannot load: %s" % file continue
次にMapのload()です。
def load(self, name): """バイナリ形式のマップを読み込む""" file = "%s.map" % (name.lower()) fp = open(file, "rb") self.name = name # unpack()はタプルが返されるので[0]だけ抽出 self.row = struct.unpack("i", fp.read(struct.calcsize("i")))[0] self.col = struct.unpack("i", fp.read(struct.calcsize("i")))[0] self.default = struct.unpack("B", fp.read(struct.calcsize("B")))[0] self.map = [[self.default for c in range(self.col)] for r in range(self.row)] for r in range(self.row): for c in range(self.col): self.map[r][c] = struct.unpack("B", fp.read(struct.calcsize("B")))[0] fp.close()
バイナリを解釈するにはstruct.unpack()を使います。第1引数はフォーマット文字で書き込んだときと同じ文字を指定します。第2引数はバイナリデータです。バイナリデータはread()でファイルから読み込んでいます。何バイト読み込むかをstruct.calcsize()で計算しています。たとえば、i型のバイナリを読み込むときはi型サイズ分読み込む必要があるし、B型のバイナリを読み込むときはB型サイズ分読み込む必要があります。読みこんだ値はタプルで返されるので[0]番目を指定しています。
数値をいっぺんに読む方法もあるようですがここでは1つずつ読み込んで変数にセットしています。
これでマップの読み書きはできました!他にもいろいろな機能を付け足すことが考えられますが基本的なマップならこれまでの機能だけで作れます。サンプルマップとして「FIELD」「CASTLE」「TOWN」も同梱しているので試しに読み込んでみてください。