※素材を準備・設定するのが面倒だったのでフィールドがいい加減な状態
(4種32x32の画像しか使ってない)になっています。
とはいえ、素材のおかげでかなりいい感じの見た目になっているので、素材提供者様、ありがとうございます。
DXライブラリを使用したRPGのサンプルです。
ただし、dixqさんのhttp://dixq.net/sakuhin.html
にあるサンプル
ゲーム名 : RPGのサンプル
を丸々参考にさせていただいています。素材探しの絡みもあったりで機能を削っています。
Cで書かれているものをC++で説明(コメント)付で記載させていただきました(現状非公開)。
dxiqさんのホームページ http://dixq.net/
本人曰く相当前に書いたもので、アンチパターンの嵐で、
比較的新しい記事を見ると別人が書いたようなソースコードに代わっています。
効果音や音楽はライセンスを調べるのに困難だったため、そのあたりのコードは削除しました。
Dxライブラリが必要です。 下記Visual Studioの設定をしてビルドをする必要があります。
矢印ボタン 移動
Bボタンを押しながら移動 2倍速で移動
Fボタンを押しながら移動 4倍速で移動
Eボタンを押しながら移動 エンカウントしない
Xボタン 決定
Zボタン キャンセル
Visual Studio Community 2017以降 推奨 (C++14の機能一部使用)
https://dxlib.xsrv.jp/dxdload.html
よりVisual Studio用のをダウンロードして、
DxLib_VC3_21.zipを展開します。
解凍後DxLib_VCというフォルダがあるので、それを
C:\Library\
ディレクトリを作成し、C:\Library\
に移動させます。
C:\Library\DxLib_VC\プロジェクトに追加すべきファイル_VC用
を
C:\Library\DxLib_VC\DxLibrary
に名前変更します。
以上でDxライブラリのインストールは終わりです。
なお、DXライブラリのパスは
C:\Library\DxLib_VC\DxLibrary
としています。
さらにシステム環境変数に
DX_LIB_VC_DIR
に上記パス(C:\Library\DxLib_VC\DxLibrary
)を登録しています。
このあたりはVisual Studioのプロジェクトのプロパティ ページ
の
追加のインクルードディレクトリ
等を見ていただければわかります。
AppMain.cpp
のファイルがエントリーポイントです。
Util/GameController
クラスがFPSとキー入力の制御を行っています。
Util/ResourceLoader
クラスは画像ファイルを読込むクラスです。
Util/SharedCharacterStatus
クラスはHPとかMPとかを持っているクラスです。
Sequence
以下のクラスがシーンの遷移を制御していてここのクラスの中の処理を
ぐるぐる回って処理されています。
最初はMapの画面からスタートして敵にエンカウントしたらバトルとなっています。
Map
に入っているものはフィールドに関するキャラクターのデータが中心です。
Battle
にはいいているものは戦闘シーンに関するキャラクターのデータが中心です。
Battleは処理が多いので一部メインの処理はBattle
内に処理を分割させているものがあります。
Battleの処理がまだ整理しきれてません。
もともと書いてあった説明をそのまま載せています。
戦闘シーンに突入する瞬間、画面を16分割してキャプチャし、その画像を中心から外へむけて座標移動して描画し(※1)、
一定の時間がたつと静止、ある程度静止したら加速度をもって落ちる(※2)ようにしてあります。
※1,2において、毎回同じ描画にならないよう、少々乱数の要素を持たせてます。
x方向y方向にあらかじめ乱数をセットし、その乱数を使って微妙にずらして描画します。
ATB=アクティブタイムバトル。リアルタイムで戦闘が出来る戦闘システムの事
ATBカウンタ=最大になるとレインボーになるあのメーターのカウンタ
カウンタは満タンでないときで、増加フラグが立っている時は毎回1増加します。
1秒で60増加し、デフォルトで4秒で満タンにさせるため240で満タンになるようになっています。
時間があればここの構造も変えたいと思っています…普通に選択状態をクラスに持たせればよいので。
メニューは何を現在選択しているかという「選択状態」と選択しているy座標である「選択位置」から
諸々の計算を行います。
メニューは
「選択項目表示」->(決定を受ける)->「詳細選択項目表示」->(決定を受ける) =行動パターン決定
となっています。
選択状態は決定するごとに100をかけています。
「攻撃」の選択が1であった時は選択が決定されると選択状態は100になります。
選択状態が100~199の時は、攻撃に関する詳細選択項目を出します。選択後に10100~ 19900となります。
「魔法」の選択が2であった時はこの選択が決定されると選択状態は200になります。
選択状態が200~299の時は、攻撃に関する詳細選択項目を出します。選択後に20000~29900となります。
攻撃を選択・決定し、通常攻撃、をさらに選択・決定した場合、選択状態は10000になります。
選択状態は10000以上なら全ての選択が終了したことになります。
選択 | 値 |
---|---|
攻撃 | 1 |
魔法 | 2 |
逃げる | 3 |
選択 | 値 |
---|---|
攻撃 | 100 |
-通常攻撃 | 10000 |
-テクニカルアタック | 10100 |
選択 | 値 |
---|---|
魔法 | 200 |
-キュア | 20000 |
-エアロ | 20100 |
-ファイア | 20200 |
-フリーザ | 20300 |
-サンダー | 20400 |
選択 | 値 |
---|---|
逃げる | 300 |
-逃げる | 30000 |
-略 | 略 |
つまりこのような対応になっていて、全てが決定されると詳細選択項目*100
の値になります。
一方で選択位置は0から2で初期で選択状態は選択位置より+1というようにしています。
選択位置 | 選択状態 |
---|---|
0 | 1 |
1 | 2 |
2 | 3 |
ダメージは正規分布する乱数を用いて決定しています。計算式は以下です。
ダメージ = レベル * 2 + ((自分の攻撃力 + 武器の攻撃力)
- (相手の防御力 + 相手の装備防御力)) * 自分の力 * 乱数1 + 自分の力 * 乱数2
だいたい自分の攻撃力が1あがったり相手の防御力が1下がるとダメージはだいたい1変化します。
レベルを基本ダメージとして加算するのでレベルが上がるごとにダメージは底上げされます。
ソースコードに関してはMITライセンス
その他素材(画像)については下記
ぴぽや https://pipoya.net/
下記素材はぴぽやさんの利用規約に従います
[アニメーション]
resouces/img/animation/pipo-btleffect001.png
resouces/img/animation/pipo-btleffect037.png
resouces/img/animation/pipo-btleffect038.png
resouces/img/animation/pipo-btleffect039.png
resouces/img/animation/pipo-btleffect040.png
resouces/img/animation/pipo-btleffect045.png
[背景]
resources/back/kaidou0331_800b.jpg
[キャラクタ]
resouces/character/1.png
resouces/character/2.png
resouces/character/3.png
resouces/character/4.png
[マップチップ]
resouces/maptip/field.png
[モンスター]
resouces/monster/enemy_popm003.png
[数値]
resouces/num/suuji12x24_04.png
resouces/num/suuji12x24_06.png
以下自作の画像(利用規約は特になし)
[メッセージウィンドウ]
resources/battle/0.png
[ウィンドウ]
resources/battle/10.png
[サブウィンドウ]
resources/battle/11.png
[選択アイコン]
resouces/icon/cursor.png