tmlib-rpg 맵의 이동 제한이라든지 타이틀 장면이라든지 만들었습니다.

17409 단어 tmlib.jsCoffeeScript
tmlib.js 0.1.8 의 MapSheet 클래스에서는, 이동 제한이 아직 없는 것 같기 때문에 구현해 보았습니다.
우선 타일 세트에서의 이동 제한

VX Ace에서는 비트 연산이었지만 어쨌든 배열에
# 移動制限定数、移動できる方向が true
# 方向は [2,4,6,8] の位置パラメータ
# VXAce にならって乗り物も入れるか…?
MOVE_RESTRICTION = {
  ALLOK: [true,true,true,true]
  UPOK: [false,false,false,true]
  DOWNOK: [true,false,false,false]
  LEFTOK: [false,true,false,false]
  RIGHTOK: [false,false,true,false]
  ALLNG: [false,false,false,false]
  HORIZON: [false,true,true,false]
  VERTICAL: [true,false,false,true]
  CORNER1: [false,false,true,true]
  CORNER3: [false,true,false,true]
  CORNER7: [true,false,true,false]
  CORNER9: [true,true,false,false]
  UPNG: [true,true,true,false]
  DOWNNG: [false,true,true,true]
  LEFTNG: [true,false,true,true]
  RIGHTNG: [true,true,false,true]
}

이제 여러가지 힘들어 ^^
실제로, 이 값을 사용하는 것은 내부이므로, 별로 신경 쓰지 않을지도 모르지만, 이름이 특히 힘들다…

예를 들어 HORIZON은 수평으로 통과할 수 있을까? 통과 할 수 없습니까? 라든지 (OK라든지 NG라든지 붙이고 있지만… 엄청…)

본래는 xml 로 MapSheet 로 설정됩니다만, 여기서는 json 로 우선. 라고 할까 JavaScript의 Object.
xml의 ​​경우 tilesets 요소에 이미지에서 타일 세트를 지정했지만 이동 제한으로 restriction을 추가했습니다.
이것은 타일 ID에 대응하는 이동 가능 방향을 설정한다.
  'sample.tileset': 'img/test_tileset.png'
  'sample.mapsheet':
    tilesets: [
    _type: 'tmx'
    width: 30
    height: 30
    tilewidth: 32
    tileheight: 32
    tilesets: [
      {
        image: 'sample.tileset'
        restriction: [
          MOVE_RESTRICTION.ALLOK
          MOVE_RESTRICTION.ALLNG
          MOVE_RESTRICTION.UPOK
          MOVE_RESTRICTION.DOWNOK
          MOVE_RESTRICTION.LEFTOK
          MOVE_RESTRICTION.RIGHTOK
          MOVE_RESTRICTION.HORIZON
          MOVE_RESTRICTION.VERTICAL
          MOVE_RESTRICTION.CORNER1
          MOVE_RESTRICTION.CORNER3
          MOVE_RESTRICTION.CORNER7
          MOVE_RESTRICTION.CORNER9
          MOVE_RESTRICTION.UPNG
          MOVE_RESTRICTION.DOWNNG
          MOVE_RESTRICTION.LEFTNG
          MOVE_RESTRICTION.RIGHTNG
        ]
      }
    ]

테스트용 타일 세트


그리고는, 뭐~여러가지 노력하고 있습니다.

Character.coffee
  # 移動可能判定
  # TODO: ななめどしよ
  isPassable: (x, y, d) ->
    # マップの取得
    map = rpg.system.scene.map
    # 向き指定が文字列の場合は、数値に
    d = CHARACTER_DIRECTION[d] if typeof d is 'string'
    # 向き設定インデックスの計算 2,4,6,8 と言うのを、0,1,2,3 に
    di = d / 2 - 1
    # 移動先座標の計算
    nx = x + X_ROUTE[di]
    ny = y + Y_ROUTE[di]
    # マップ範囲チェック
    return false if not map.isValid(nx,ny)
    # 移動可能チェック
    return false if not map.isPassable(x,y,d)
    # 向きを逆に
    rd = REVERSE_DIRECTION[di]
    return false if not map.isPassable(nx,ny,rd)
    true

Map.coffee
  # マップ範囲内かどうか
  isValid: (x, y) -> 0 <= x and x < @width and 0 <= y and y < @height

  # 移動可能判定
  isPassable: (x, y, d) ->
    r = @_restriction(x,y)
    r[d / 2 - 1]

  # 移動制限情報の取得
  _restriction: (x, y) ->
    # TODO: イベントから見つかったらそれを返す
    # TODO: マップ固有情報から見つかったらそれを返す
    # タイルセットから
    @_restrictionTileset(x, y)

  _restrictionTileset: (x, y) ->
    i = @mapSheet.layers.length - 1
    while i >= 0
      layer = @mapSheet.layers[i--]
      if layer.type == 'layer'
        tileid = layer.data[x + y * @width]
        if tileid >= 0
          return @mapSheet.tilesets[0].restriction[tileid]
    MOVE_RESTRICTION.PASS

지금 보고 생각했지만, 오토 타일의 이동 제한을 생각하지 않아…

그리고 타이틀 장면도 만들고 있습니다.
  'scene.title':
    _type: 'json'
    background:
      image: 'scene.title.background.image'
    menus: [{
        name:'Start'
        next:
          scene:'SceneMap'
      },{
        name:'Continue'
        next:
          scene:''
      },{
        name:'Exit'
        next:
          scene:''
      }
    ]

기본적으로 JavaScript는 쓰지 않고 RPG를 만들 수 있게 되지만, json 의 정리라든지 다시 하고 있는 곳…
Window 클래스도 다시 만들었고, 여러가지 힘들다.

샘플

좋은 웹페이지 즐겨찾기