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

11 / 30
Sat

Ziphil です。

プレイヤーをキー入力にしたがって移動させる処理なんですが、 こんな感じのコードになってます。

private fun movePlayer(): Unit {
  when (_pressedKeyCode) {
    VK_DOWN -> {
      if (_map.canMoveInDirection(_player.getX(), _player.getY(), DOWN)) {
        _player.moveInDirection(DOWN)
      }
    }
    VK_RIGHT -> {
      if (_map.canMoveInDirection(_player.getX(), _player.getY(), RIGHT)) {
        _player.moveInDirection(RIGHT)
      }
    }
    VK_LEFT -> {
      if (_map.canMoveInDirection(_player.getX(), _player.getY(), LEFT)) {
        _player.moveInDirection(LEFT)
      }
    }
    VK_UP -> {
      if (_map.canMoveInDirection(_player.getX(), _player.getY(), UP)) {
        _player.moveInDirection(UP)
      }
    }
    else -> {}
  }
}

関数それぞれの説明は省略するとして、 似たようなコードが 4 つ連なってますよね。 私個人の感想ですが、 こういうコードは好きじゃないです。

コードを書く際の注意事項の 1 つに DRY (Don't Repeat Yourself)、 つまり 「同じコードを 2 回書くな」 というものがあります。 同じコードが別々の位置に 2 つあると、 片方を修正するときにもう片方も修正しないといけないので、 非常に不便です。 というわけで、 私もこれに則って、 同じコードを 2 ヶ所に書かないようにしています。

さて、 最初のコードですが、 同じではないにしても似ているコードが 4 つあります。 できれば、 可読性を維持しつつ 1 つにまとめたいのです。 可読性を無視すれば、 こんなコードにすることもできます。

private fun movePlayer(): Unit {
  val keys: List<Int> = listOf(VK_DOWN, VK_RIGHT, VK_LEFT, VK_UP)
  val directions: List<Int> = listOf(DOWN, RIGHT, LEFT, UP)
  for (i: Int in keys.indices()) {
    if (_pressedKeyCode == keys[i] && _map.canMoveInDirection(_player.getX(), _player.getY(), directions[i])) {
      _player.moveInDirection(directions[i])
    }
  }
}

重複部分がなくなり、 短くなりましたね。 しかし、 パッと見で何の処理してるかよく分からず、 良いコードとは言えません。 ・・・難しいんです。

ちなみに、 せっかく Kotlin 使ってるのに、 そこら中に変数のクラスが明記されてるのは、 私の趣味です。 いや、 型が書いてないと落ち着かなくて・・・。 長いこと Ruby 使いだった人が何言ってんだって話ですが。


スポンサーサイト
comment ×0
11 / 30
Sat

JavaScript が分からない Ziphil です。

プレイヤーのドット絵が完成したので、 さっそくマップに表示させてみました。 ついでに、 方向キーで移動できるようにして、 カメラ位置がプレイヤーに追従するようにしておきました。

678_製作過程A

そうそう、 Kotlin の when 文って、 処理が 2 行以上になるとブレースが必要なんですね。 知らなくてしばらくエラーに悩まされした。

じゃ、 プレイヤーの表示もできたところですし、 次は何をしましょうか。 NPC の設置でも良いですし、 敵キャラの設置でも良いんですが、 どっちもキャラチップが必要なんですよねー。 当分はキャラチップの作成になるのかなぁ・・・。


comment ×0
11 / 28
Thu

風邪と花粉症に悩まされている Ziphil です。

ようやく 1 つ目のキャラチップが完成しました。 FSM の素材などを参考に、 というかほぼ FSM の素材そのままな感じで、 ポチポチとドットを打ちました。

676_プレイヤー

で、 キャラチップ打ってみて決めました。 キャラクターの歩行アニメーションはあきらめます。 正面向いているチップ描くだけで、 のべ 2 時間かかってますからね。 おそらく、 数を描いているうちに慣れるでしょうけど、 それでも時間がかかりすぎます。 ということで、 キャラクターは全部正面向きで、 アニメーションなしにするしかありません。 ・・・不本意ですが。 私の画力じゃどうしようもない。

そういえば、 キャラチップの雛形作るの忘れてたなぁ・・・。


comment ×0
11 / 23
Sat

人生初のフォアグラを味わった Ziphil です。

ゲーム起動時に表示する Ziphil Soft のロゴを描きました、 というか、 描いていて今日完成しました。

671_ロゴ

左の記号の由来は長くなるので割愛します。 簡単に言えば、 私の名前のイニシャルの合字です。

ドットで文字書くのは好きなんですけどねー、 絵はまだ苦手です。


comment ×0
11 / 18
Mon

Kotlin に触りすぎて Ruby を忘れかけている Ziphil です。

キャラチップ描いてます。 全然うまく描けないですねー。 マップチップとかアイテムとか、 非生物に比べて圧倒的に難しい。 First Seed Material とかで配布されているドット絵とかを参考に、 いろいろ試行錯誤してるんですが、 どうもうまくいかないです。 あー、 この素材をそのまま使えたらどんなに楽なことか・・・。

いまだに陰影のつけ方のコツがつかめてないんですよね。 どこを明るくして、 どこを暗くするか。 これが結構難しくて、 不自然になっちゃうんですよね。 Google 画像検索で対象の物体の写真を出して、 それを観察しながら描いてたりしてます。 対象をいかにしっかり観察するかが鍵ですね。


comment ×0
11 / 18
Mon

ついさっき Windows が起動しなくなった Ziphil です。

そろそろキャラチップ描かないとなー、 とか思いつつ、 なかなかやる気になれずにいるところなんですが、 よくよく考えたら、 キャラチップって上下左右に動くわけなので、 4 方向分描かないといけないわけですし、 歩行アニメーションもありますから、 マップチップとかのように簡単にはいきませんよね。 まあ、 まだ人間だけなら雛形を一度作ってしまえば、 2 人目以降は楽なんですが、 モンスターみたいになると、 1 体分描くだけで、 かなりの労力が必要で、 ゾッとします。

Elona では、 モンスターや NPC は正面だけのグラフィックしか用意されておらず、 プレイヤーが動くとモンスターは移動先に瞬間移動します。 この方式を採用すれば、 モンスターは下向きの 1 方向だけ描けば良くなるので、 かなりの労力が減らせますが、 味気ないんですよねぇ・・・。 できることなら、 モンスターも 4 方向描いて歩行アニメーションもつけたいんですけどねぇ・・・。

あ、 そういえば、 前のエントリーで、 アイテムアイコンの個数を 800 とか言ってましたが、 マップチップとかキャラチップとか攻撃エフェクトとか、 グラフィック素材として必要なのは他にもあるので、 おそらく、 完成までに 2000 くらいのドット絵を描かないといけない気がします。 2000 ですよ、 2000。 大丈夫かなぁ・・・。

グラフィックを担当してくれる人がいればいいんですけどね・・・。 といっても、 もう私が自分で描き始めてしまいましたし、 途中でグラフィック担当を交代しても、 やっぱり作風が違いますから統一感がなくなりますし、 結局、 私が全部やらなきゃいけないんでしょうか。


comment ×0
11 / 14
Thu

7 時間は寝ないと眠くてしょうがない Ziphil です。

整数値を扱う型、 Int と Long しか使ったことがないんですが、 Short とか Byte もありますよね。 Short は 16 バイト、 Byte は 8 バイトの整数値を取り扱えるんですが、 32 バイトを扱える Int じゃだめなのか、 と不思議に思いました。 存在するからには意味があるんでしょうけど、 いまいち思いつかなかったので、 調べてみてました。

・・・で、 調べてみはしたんですが、 よく分かりませんね。 他の Java とかのソースコードとか見ても、 整数はほとんど Int で、 大きな数値が必要なときは Long って感じですし。 もちろん Short や Byte のメリットに、 メモリ消費が少ないというのはあると思うんですが、 だったら 127 までしか代入され得ないような変数は全て Byte にした方が良いはずです。 それとも、 代入され得る数値によって Byte にしたり Short にしたりするのが面倒だから、 とりあえず全て Int で定義してるみたいな感じなんでしょうか。 最近のパソコンは昔のよりはるかに性能が良いですし、 メモリにそんなに気を使わなくてもいいですしね。

実際のところはどうなんでしょう。


comment ×0
11 / 11
Mon

11 月 11 日 11 時 11 分 11 秒を見逃した Ziphil です。

データベース作成に追われています。 RPG を作るのが難しいといわれている理由の 1 つですね、 データベース。 難しいというよりは、 面倒って感じですね。 根気がいる作業です。 まあ、 私はそれが好きなんですけど。

そのデータベースですが、 現時点でまとまっている部分を公開したいと思います。 LibreOffice で管理しているので、 拡張子が .ods ですが、 Excel でも開けますし、 ブラウザ上でも閲覧できるはずです。

データベースはこちらです。 特に防具の種類とか状態異常とかのアイデア募集中・・・です。


comment ×0
11 / 10
Sun

『巡り廻る』 をプレイし始めた Ziphil です。

最近ドット絵を描いていなかったので、 描きました。 一度マップチップから離れて、 食べ物のアイコンです。

657_にんじんとパン

にんじんとパンです。 急いで描いたので雑です、 すいません。 後で細かいところを手直しするつもりです。

さて、 私は一体いくつのアイテムアイコンを描けば良いのでしょうか? アイテムにはそれぞれ ID を与えていて、 武器は 2000 ~ 2999, 料理は 5000 ~ 5999 のように、 ジャンルごとに番号を割り当てています。 で、 その割り当てられた ID がいくつあるかですが、 8000 です。 といっても、 8000 個のアイコンを描けば良いわけではないです。 そもそも 8000 個も描いていたら、 死んでしまいます。 というのも、 後からアイテムが追加できるように、 初期段階では割り当てない ID も多くあるんです。 で、 おそらく実際に用いられる ID は 1/10 くらいかなーと見積もって、 描くべきアイコンの数は 800 ですね。

・・・なるほど、 800 か。 ・・・え? ・・・無理じゃね? ・・・できんの?

まあ、 個人開発ですし、 やるしかないんですけどね。 完成はいつになることやら・・・。


comment ×0
11 / 09
Sat

見知らぬ小学生につきまとわれるという謎の夢を見た Ziphil です。

ステータスとか状態異常とか、 いろいろ設定するのが想像以上に大変ですね・・・。 考え出すときりがないし、 それを今度はプログラムしないといけないと考えると、 やばいです。

基本ステータスは、 今のところ以下の 6 つにしようと考えています。

  • 筋力 (STR) ・・・ 物理攻撃力
  • 耐久 (VIT) ・・・ 防御力, 最大重量
  • 知恵 (INT) ・・・ 魔法攻撃力, 読書成功率
  • 器用 (DEX) ・・・ ?
  • 集中 (CON) ・・・ 命中率
  • 魅力 (CHA) ・・・ ペット化成功率, 売買有利度
  • 敏捷 (AGI) ・・・ 移動速度

魅力の英語名称を charisma にしようか charms にしようか迷ったりしましたが、 どっちも略したら CHA だったので、 どちらかには決めてません。

ちなみに、 ステータスはこれだけではなく、 レベルアップなどでは成長せずにイベントなどで増減するものがあります。 運 (LUC) とか業 (KAR) とか。 「業」 って聞くと意味不明ですが、 いわゆるカルマです。 こういうのは、 特定のイベントのみで増減します。

こういうこと考えてると、 大規模 RPG とか MMORPG とかの製作者って、 すごいなぁと感嘆するばかりです。


comment ×0
11 / 04
Mon

interoperability を intero-perability と区切ってしまい 「インテロ」 って何なのか不思議に思った Ziphil です。

Kotlin でこんなプログラムを書いたとしましょう。

fun foo(i: Int): Int {
  while (true) {
    // 何らかの処理
  }
  return i
}

これ、 「何らかの処理」 に break 文が書いてある場合でも、 コンパイルエラーになるんですね。 Java でもそうでしたっけ?


comment ×0
11 / 03
Sun

方向を表現するとき、 下は 2, 左は 4, 右は 6, 上は 8 と、 テンキーの位置に対応する数字を使ってます。 そこで困るのは、 方向を表す数字が格納された変数 direction があって、 ある座標 (x, y) から direction の方向に 1 進んだ座標を取得するときです。 コードはこんな感じ。 (rx, ry) が移動後の座標です。

var rx: Int = x
var ry: Int = y
when (direction) {
2 ->
  rx = x
  ry = y - 1
4 ->
  rx = x - 1
  ry = y
6 ->
  rx = x + 1
  ry = y
8 ->
  rx = x
  ry = y + 1
}

あるいは、 マップを使ってもっと簡略に。

val directionX: Map = mapOf(2 to x, 4 to x - 1, 6 to x + 1, 8 to x)
val directionY: Map = mapOf(2 to y - 1, 4 to y, 6 to y, 8 to y + 1)
val rx: Int = directionX[direction]
val ry: Int = directionY[direction]

さて、 これはこれで良いんですが、 この処理、 結構いろいろなところで使うんですよ。 同じコードを何度も書くのって嫌じゃないですか。 そこで、 Vector クラスというものを作って、 val vector: Vector = Vector(x, y) みたいにオブジェクト作って、 vector.inDirection(direction) で、 ほしい Vector オブジェクトが返される、 みたいにすれば良いんじゃないかと思ったんです。

で、 この Vector クラスに plus, minus とかの関数を定義して、 演算子のオーバーロードすれば、 いろいろ便利になると思うんです。 ということで、 座標の管理をこの Vector クラスで行うように、 プログラムを修正しています。


comment ×0
back-to-top
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。