スクリプト/コツ/2DRPGでの経験値制レベルアップ

最終投稿者:User icon mini 退会したユーザー 更新:2013/07/16 20:41:19
タクミ2310号です。
今回は、2DRPGでの経験値制レベルアップを説明しようと思います。

(1)今までにあった方法

2DACTRPGなら、この方法を少しいじればとりあえずOKです。
しかし、この方法では獲得した経験値が表示されず
しかもレベルが上がる度に次々2乗されていくので、
同じ敵を倒し続けているとすぐに上がらなくなってしまいます
さらに、戦闘以外のイベントで経験値を増やしたりなどできません。
その為、2DRPGの場合、もう少し工夫する必要があります。
今回は手法をベースに行っていきます。

また、配列を使わないで経験値制レベルアップの処理を行う方法もあるようですが、
この方法の場合、後から修正するのがやたらと面倒で手間がかかります

(2)下準備


まずは下準備です。
def sv(a,b)
  setVariable(a, b)
end

def gv(a)
  return getVariable(a)
end

def addv(a,b)
  sv(a, gv(a) + b)
end

def pow(a, b)
  v = 1;  i = 0
  while(i < b)
    v = v * a
    i = i + 1
  end
  return v
end

sv("exp",0);  sv("totalexp",0);  sv("totalexp2",0);  sv("next", 10);  sv("totalgold", 0)

ゲーム作りにおいて変数は必要不可欠。
しかし、いちいち入力支援を使っていると、作業効率はがた落ちします。
Variableのスペルを覚えるのも一つの手ですが、それなら2文字を打つ方がよっぽど速いです。
また文字数を減らせるので、スクリプトが見やすくなると思います。

addvは変数への足し算をします。第2引数を0より小さくすることで引き算もできます
これも文字数を少しですが減らすことができます。

※ただし、処理速度は低下するので、使わないほうがいい場合もあります。


また、マップのどこかに自動開始イベントを配置し、
#有効条件
!getFlag("BGM")

#実行時
sv("BGM", 音楽のID)
playBGM(gv("BGM"))
setFlag("BGM", true)

これを各マップに置き、warp関数でマップ移動時に
warp(マップID, x座標, y座標)
setFlag("BGM",false)

とすれば、マップを移動したときに音楽を変えることができます。
また、この処理が後々必要になります。

(3)経験値を調べてレベルアップ

さて、ここから経験値を調べてレベルアップをする処理に入っていきます。
ですが、これは1人旅の場合のスクリプトです。
2人以上にする際は、変数を配列化したりなどの工夫が必要になりますのでご了承ください。
#個々の敵キャラの経験値をidから求めます。
def gee(id)
 case id
    #ザコ敵
    when 9357
      return 3
    when 11734
      return 8
    when 11862
      return 10
    when 9412
      return 15
    #関係ないものは0で片付ける
    else
      return 0
  end
end

#経験値の計算
def gte(a)
  exp = 0
  killCounts = getKillCount()

  i = 0
  while i < getArrayLength(killCounts)

    #倒した敵の種類と数から経験値を計算
    exp = exp + gee(killCounts[i][0]) * killCounts[i][1]

    i = i + 1
  end
  A = exp
  exp = exp - gv("totalexp2")
  sv("totalexp2", A)
  return exp
end

def levelUpCheck()
  playBGM(gv("BGM"))#ここで音楽を元に戻す
  getE = gte()
  addv("exp", getE);  addv("totalexp", getE)
  speak(getE + " 経験値を獲得!")
  while  gv("exp") >= gv("next")
    levelUp()
    addv("exp", gv("next") * -1);  addv("next", ここに各自で増え方の式を作ってください)
    speak("レベルアップ!\nLV." + getLevel() + "になった!")
  end
end

ベースの方法と大きく異なるのは、
gte関数のこの部分です。
  A = exp
  exp = exp - gv("totalexp2")
  sv("totalexp2", A)

それまでで求めた経験値は今までの合計なので、
    予め別の変数に取る
               ↓
今回の戦闘以外で倒した敵の経験値を引く
               ↓
      履歴の更新

という流れで、今回の戦闘で獲得した経験値を求めます。
totalexp変数とtotalexp2変数とがありますが、
同じ合計経験値でも意味が違うので注意してください。
totalexptotalexp2
全てで獲得した経験値の総合計gte関数内で獲得した経験値の合計

ちなみに、もし途中で敵の経験値を変えた場合、異常に高い経験値が入ってきたり、
逆にマイナスになったりする点に注意してください。
一度公開したら変えないぐらいの気持ちで何度もテストプレーをしましょう。

(4)戦闘処理を関数化

さて、ここから先は話が少しそれますが、
どうせなら戦闘の処理を関数化しちゃいましょう。
この関数は擬似ランダムエンカウント推奨です。
(擬似ランダムエンカウントについてはコチラ)
#ターンバトル処理
#kazu     敵の数(上限6)    syu 敵の種類(上限5)
#teki0~4 敵のID
def SNB(kazu,syu,teki0,teki1,teki2,teki3,teki4)
  playBGM(戦闘時のBGM)
  tekiID = createArray()
  i = 0
  while i < kazu
    case rand(syu)
      when 0
        pushArray(tekiID, teki0)
      when 1
        pushArray(tekiID, teki1)
      when 2
        pushArray(tekiID, teki2)
      when 3
        pushArray(tekiID, teki3)
      when 4
        pushArray(tekiID, teki4)
    end
    i = i + 1
  end
    case kazu
      when 1
        flag = startTurnBattle(tekiID[0])
      when 2
        flag = startTurnBattle(tekiID[0],tekiID[1])
      when 3
        flag = startTurnBattle(tekiID[0],tekiID[1],tekiID[2])
      when 4
        flag = startTurnBattle(tekiID[0],tekiID[1],tekiID[2],tekiID[3])
      when 5
        flag = startTurnBattle(tekiID[0],tekiID[1],tekiID[2],tekiID[3],tekiID[4])
      when 6
        flag = startTurnBattle(tekiID[0],tekiID[1],tekiID[2],tekiID[3],tekiID[4],tekiID[5])
    end
  if flag
    levelUpCheck()
  elsif getTurnBattleResult() == getTurnBattleRunAway()
    playBGM(gv("BGM"))#逃げた場合も音楽を元に戻す
  end
end

こうすることで、最大5種類の敵をランダムに出現させ、
誰を何体倒したので経験値はこのぐらい、といった処理が可能になります。
第1引数にrand関数を使うことで、数もランダムにできます。
(rand関数だけだと0の可能性もあるので、+1を忘れずに)

(5)おわりに

いかがでしたでしょうか。
未熟者が作成したので、分かりにくい部分などあるかもしれません。
ですが、皆さんのゲーム製作の参考になれば幸いです。

コメントする

コメントするには、ログインする必要があります。

コメント一覧

User icon mini bakuman0(投稿日:2013/07/16 20:41, 履歴)
質問です。初心者なので( ここに各自で増え方の式を作ってください)の部分にどんな風に書けばいいかわかりません。いろいろためしてもコードに文法的なまちがいがありますと出ます。お手数ですが教えてください。
メニュー
目次