-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

10 / 21
Mon

ここでオートタイルの処理を行った画像を上げましたが、 オートタイルの処理のコードはこんな感じになってます。

def autotileNumber(x: Int, y: Int): Array[Int] = {
  val direction: Array[Array[Int]] = Array(Array(x - 1, y - 1), Array(x + 1, y - 1), Array(x - 1, y + 1), Array(x + 1, y + 1),
                                           Array(x - 1, y + 1), Array(x + 1, y + 1))
  val number: Array[Array[Int]] = Array(Array(5, 11, 4, 1, 0), Array(5, 15, 6, 1, 2), Array(5, 3, 4, 9, 8),
                                        Array(5, 7, 6, 9, 10), Array(16, 16, 16, 13, 12), Array(16, 16, 16, 13, 14))
  var resultArray: ArrayBuffer[Int] = ArrayBuffer()
  for (i <- 0 to 5) {
    val fx: Int = direction(i)(0)
    val fy: Int = direction(i)(1)
    var result: Int = 16
    (isAutotile(fx, fy), isAutotile(fx, y), isAutotile(x, fy)) match {
    case (true, true, true) =>
      result = number(i)(0)
    case (false, true, true) =>
      result = number(i)(1)
    case (_, false, true) =>
      result = number(i)(2)
    case (_, true, false) =>
      result = number(i)(3)
    case _ =>
      result = number(i)(4)
    }
    resultArray += result
  }
  return resultArray.toArray
}

返される値は、 左上の天井, 右上の天井, 左下の天井, 右下の天井, 左の壁, 右の壁のオートタイル番号を順に格納した配列です。 オートタイル番号というのは、 この記事の 2 枚目の画像で表示されている番号です。

同じ処理を 2 年くらい前に Ruby で書いたときよりコード量がかなり減っています。 たぶん半分くらい。 まあ、 2 年前のコードは無駄が多かったというのもあるんですが、 Scala のパターンマッチのおかげで、 かなり綺麗に短くコードが書けました。 ・・・その代わりに、 簡略化しすぎて direction とか number とかの変数が何を表してるのか分かりにくくなりましたけどね。

あ、 そうそう、 Scala には型推論という非常に強力な機能がありますが、 私は全然利用してません。 全ての変数に型を明示してます。 何か書かないと落ち着かないんですよ・・・。

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。