【プチコン4講座】RPG作成講座第1回~第3回のコードの最適化

プチコン4

プチコン4 ソースコード最適化

コードが一部抜けていた箇所があったり関数の名前が違っていたので修正いたしました。大変申し訳ございません。ツイッターでご報告・ご質問いただいた方のお陰です。ありがとうございます。

こんにちは。継続の錬金術士なおキーヌです。

ブログ毎日更新は167日目になります。

前回「【プチコン4講座】ゲームループ実装とスプライト表示とキー操作」でマップデータをレイヤー別に作りました。

第1回~第3回までで作ったソースをプチコン4仕様に最適化しようと思います。

プチコン4になって命令が結構変化があったり、SmileBasic ver3 ではできなかった書き方ができたりするので
基本的にはプチコン4仕様で書いていこうかなと思います。

それではプチコン4でRPG作りその3.5回目始めましょう。

1~3回目までのコードを最適化&小文字化

まずは第3回までのコードをきれいにしました。
一連の初期化などの関数化できるところは関数化しています。

'──────────────────────────
' ▼ 動作モード設定:変数宣言は必須
'──────────────────────────
OPTION STRICT
'──────────────────────────
' ▼ 画面のクリア
'──────────────────────────
ACLS
'──────────────────────────
' ▼ 定数・構造体の定義
'──────────────────────────
CONST #CSZ = 16
'──────────────────────────
' ▼ 変数・配列の定義
'──────────────────────────
' ┠─ 汎用変数
'━━━━━━━━━━━━━━━━━━━━━━━━━━
var G_I = 0, G_J = 0, ¥
G_BGW = 0, G_BGH = 0
' ゲームループを制御するフラグ
var G_GameLoopFlag = #TRUE
'──────────────────────────
' ┠─ マップシーン用配列
'━━━━━━━━━━━━━━━━━━━━━━━━━━
' 空配列宣言
DIM G_MapData[]

'──────────────────────────
' ▼ プログラム初期化処理
'──────────────────────────
D_GAME_INITIALIZE
'──────────────────────────
' ゲームループ開始
'──────────────────────────
loop
  ' コントローラー関数呼び出し
  D_Controller

  ' ゲームループフラグ監視
  if !G_GameLoopFlag then BREAK
  ' フレームレート安定
  VSYNC 1
endloop

'──────────────────────────
' ▼ 関数の定義
'──────────────────────────
' ┠─ ▼ 初期化関連
'━━━━━━━━━━━━━━━━━━━━━━━━━━
DEF D_GameInitialize
  ' マップデータのロード
  D_MapInitialize "DAT:MAP001"
  ' マップデータの描写
  D_MapDraw
  ' スプライトの初期化
  D_SpInitialize
END

'──────────────────────────
' ┗━┓ ▼ マップ関連
'━━━━━━━━━━━━━━━━━━━━━━━━━━
DEF D_Mapinitialize A_FILENAME$
  ' マップデータファイル読み込み
  G_MapData = LOADV(A_FILENAME$)

  ' マップデータ配列の先頭2つを取り出す
  G_BGW = SHIFT(G_MapData)
  G_BGH = SHIFT(G_MapData)
END
'──────────────────────────
'   ┗━┳━ ▼ マップデータ描写
'━━━━━━━━━━━━━━━━━━━━━━━━━━
' マップデータの描写関数
DEF D_MapDraw
  ' マップチップ配列を描写
  for G_J = 0 to G_BGH-1
    for G_I = 0 to G_BGW-1
      ' ローカル変数CPに計算した値を入れる 
      var cp = G_I + ( G_J * G_BGW )
      ' CASE文でMAPDATA[CP]の内容に応じて処理を切り替える
      case G_MapData[cp]
        ' 0のとき
        when 0:
          ' 地面を表示
          TPUT 0, G_I, G_J, CHR$(&HE8C9)
        ' 1のとき
        when 1:
          ' 木を表示
          TPUT 0, G_I, G_J, CHR$(&HE8CA)
      endcase
    next
  next
end

'──────────────────────────
' ┠─ コントローラー関連
'━━━━━━━━━━━━━━━━━━━━━━━━━━
' コントローラー関数
def D_Controller
  var B = BUTTON(0)

  # #B_RRIGHTは右コントローラーの右ボタンつまりAボタンの意
  var BTN_UP = 1 << #B_LUP
  var BTN_DOWN = 1 << #B_LDOWN
  var BTN_LEFT = 1 << #B_LLEFT
  var BTN_RIGHT = 1 << #B_LRIGHT

  if (B and BTN_UP) > O then
    SPVAR 0, "Y", SPVAR(0, "Y") - 1
  endif
  if  (B AND BTN_DOWN) > O then
    SPVAR 0, "Y", SPVAR(0, "Y") + 1
  endif
  if  (B AND BTN_LEFT) > O then
    SPVAR 0, "X", SPVAR(0, "X") - 1
  endif
  if  (B AND BTN_RIGHT) > O then
    SPVAR 0, "X", SPVAR(0, "X") + 1
  endif

  # キャラクターの移動
  SPOFS 0, SPVAR(0,"X"), SPVAR(0,"Y")
end
'──────────────────────────
' ┠─ ▼ スプライト関連
'━━━━━━━━━━━━━━━━━━━━━━━━━━
' スプライト初期化
def D_SpInitialize
  ' プレイヤーキャラクターの描写と初期化【追加部分】
  SPSET 0, 500
  SPVAR 0, "X", 0
  SPVAR 0, "Y", 0
  SPOFS 0, SPVAR(0,"X"), SPVAR(0,"Y")
end

だいぶ見やすくなりました。

プチコン4からは小文字を取り入れました。

既存命令は大文字のままで行こうかなと思います。

開始時の初期化は1つの関数を呼び出すだけになりましたね。

プチコンBIGの講座で最初に初期化関数を用意しておかないと、
後から面倒になるということを体感したので今回は最初から初期化関数を使って
様々な値の初期化を行っています。

初期化関数にする利点は、コンティニューで完全に最初からやらせたい場合など
その関数を呼んであげればゲーム開始時の状態に戻せます。

強くてニューゲーム等の引継ぎ要素を実装したい場合

初期化させたくない変数などがあれば、初期化から除外しておくといいでしょう。

例えばプレイヤーのステータスを維持したまま再開したい…

つまり強くてニューゲームみたいな引継ぎシステムに感じにしたい場合は
プレイヤーの能力を保持している変数を初期化関数から除外しましょう。

──これ以上話すことがないので最適化だけにしておきます。

コントローラーは正直なところ別ファイルに切り分けたいですね。

今の所プチコン4で外部関数を呼び出す方法がよくわかってないので、
わかり次第切り分け用の記事を書こうと思います。

次回からは今回最適化したコードで進めていきますので、注意してください。

それでは。