roguev6 > field.py


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

テストは不十分。

fieldを束ねたものをstageと呼ぶ。

1つのステージは複数のfieldを持つ。


  • field_poolの消去(完全にdictで代用可能な機能しか提供していないので)
  • 追加要求メソッド:

移動可能領域のうちランダムな位置を選び出す。

randenpty()


#coding:shift_jis
from vect import Vector2d

class TileType:
  WALL=0x0
  FLOOR=0x1
  STEP=0x80
  FOREST=0x11
  GRASS=0x12
  MERE=0x13
  SAND=0x14

class Field:
  def __init__(self,csv,name,entry=None):
    self.data=self.__parse(csv)
    if None==entry:
      self.__make_autoentry()
    else:
      self.entry = __parse(entry)
    self.height = len(self.data)
    self.width = len(self.data[0])
    self.name = name
  def __parse(self,csv):
    return [[int(data) for data in line.split(',')]\
        for line in csv.split('\n')]
  def __make_autoentry(self):
    #自身にマップデータが格納されていること
    self.entry = [[False if num == 0 else True for num in line]\
        for line in self.data]
  def entry_at(self,vector):
    if self.valid_pos(vector):
      return self.entry[vector.y][vector.x]
    else:
      return False
  #表示用データを取得

  def get_showdata(self,start_pos,end_pos,backfill=TileType.WALL):
    ret =[]
    for y in xrange(start_pos.y,end_pos.y+1):
      line=[]
      for x in xrange(start_pos.x,end_pos.x+1):
        if self.valid_pos(Vector2d(x,y)):
          line.append(self.data[y][x])
        else:
          line.append(backfill)
      ret.append(line)
    return ret

  #有効範囲か否か
  def valid_pos(self,vec):
    if vec.x < 0 or self.width <= vec.x:
      return False
    elif vec.y < 0 or self.height <= vec.y:
      return False
    else:
      return True

#変化の間
#class TurnArea(FieldData):
#  pass

def test_code():
  csv = '0,0,0,0,0 \n 0,1,1,1,0 \n 0,1,1,1,0 \n 0,1,1,1,0\n 0,0,0,0,0'
  field = Field(csv,'test_field')

  assert field.name == 'test_field'
  assert field.entry_at(Vector2d(0,0)) == False
  assert field.entry_at(Vector2d(1,2)) == True
  assert field.entry_at(Vector2d(0,-3)) == False

  data = field.get_showdata(Vector2d(1,1),Vector2d(3,3))
  assert data == [[1, 1, 1], [1, 1, 1], [1, 1, 1]]

  assert field.valid_pos(Vector2d(0,0)) == True
  assert field.valid_pos(Vector2d(-1,-1)) == False
  assert field.valid_pos(Vector2d(5,5)) == False

if __name__=='__main__':
  test_code()

TurnAreaについてメモ

高級な手順1:

  1. 部屋を隣接しないように作成する
  2. 廊下で部屋をつなぐ
  3. 部屋になっている場所にアイテムを置く

高級な手順2:

  1. 廊下を作る
  2. 廊下のマスをランダムで選び出し、廊下を膨らませて部屋を作る

部屋を設置後:

  1. 敵キャラを設置可能マスに置く
  2. 廊下に敵が置かれた場合、stateをアクティブにする
  3. 部屋に敵が置かれた場合、stateをsleepにする