【開発日記】キャラクタースプライトについて
こんにちは、けだまです。
今回はキャラクタースプライトについて書いていきます。
スプライトとは
画像素材のことです。
どちらかと言えばサイズが小さめで、画面に表示したあと、動きをつけるものをそう呼ぶと思っています。
海外の妖精でスプライトと呼ばれるものがいて、それが語源となっているそうです。
画面上をひらひらと動き回る様子から名付けられたらしいです。
「もちダン」では
「もちほっぺの大冒険」では、さまざまなスプライト素材を用意しています。
キャラクター、エネミー、アイテム、トラップ、プロップなど。
キャラクターはプレイヤーや仲間など、いわゆるもちほっぺのみなさん。
エネミーはいわゆる敵です。
アイテムはそのままアイテムのこと。アニメーションしないので、一枚の画像に詰め込んでいます。
トラップは罠のこと。こちらも一枚の画像に詰め込んでいます。
プロップは、地形ではないが、地形の上に乗せるオブジェクトをまとめてそう呼んでいます。
石や草、木など、地形用のマップチップでは表現しきれない素材は、プロップとしてマップの上に配置しています。
アニメーションについて
当初の想定では、1キャラクターにつきスプライトを11枚x5方向、合計55枚描くつもりでした。
- アイドル(立ち止まっているとき)のモーション用に4枚。
- 歩いているときのモーション用に4枚。
- 攻撃、被ダメージ、眠り用に3枚。
これを、正面/斜め前/横/斜め後ろ/後ろ向きの5方向用意して、左右は反転して使います。
開発初期は敵に対しても55枚分のスプライトを描いていたのですが、早々に諦めました。
枚数が多すぎたのです。
そこで、敵についてはコスト削減のため、斜め前/斜め後ろの2方向、アイドルモーションも省略して、合計14枚のスプライトを描けばいいようにしました。
これにより、当初想定よりは素早く敵を用意することが可能になりました。
※ドット絵もけまみReさんに描いていただいています。
実装方法について
キャラクターの向きから、フォールバックを含めた識別子を取得します。
return direction switch
{
DirectionType.Up => new[] { "back", "back_diag" },
DirectionType.Down => new[] { "front", "front_diag" },
DirectionType.Left or DirectionType.Right => new[] { "side", "front_diag" },
DirectionType.UpLeft or DirectionType.UpRight => new[] { "back_diag", "side" },
DirectionType.DownLeft or DirectionType.DownRight => new[] { "front_diag", "front" },
_ => new[] { "front", "front_diag" },
};
スプライトシートから、結合した識別子を順番に取得できるかどうかを試みます。
例えば、(idle, front)モーションを適用したいときは
idle_front, idle_front_diag, idle, front, front_diagの順でスプライトを検索する仕組みにしています。
この仕組みで、スプライトを表示する側は、アセットがどのように準備されているかを意識せずに命令を出せるようにしています。
今回はプログラムについて書いてみました。
実装作業はAIに手伝ってもらっていますが、こういった細かい工夫は自分で考えたものを指示することも多かったりします。
いつも応援ありがとうございます。
引き続きよろしくお願いします。