スクリプト/コツ/2DRPGでの経験値制レベルアップ
最終投稿者:タクミ2310号
更新:2011年12月28日 00:02:54
タクミ2310号です。
今回は、2DRPGでの経験値制レベルアップを説明しようと思います。
しかし、この方法では獲得した経験値が表示されず、
しかもレベルが上がる度に次々2乗されていくので、
同じ敵を倒し続けているとすぐに上がらなくなってしまいます。
さらに、戦闘以外のイベントで経験値を増やしたりなどできません。
その為、2DRPGの場合、この方法をかなりいじる必要があります。
また、配列を使わないで経験値制レベルアップの処理を行う方法もあるようですが、
この方法の場合、後から修正するのがやたらと面倒で手間がかかります。
まずは下準備です。
ゲーム作りにおいて変数は必要不可欠。
しかし、いちいち入力支援を使っていると、作業効率はがた落ちします。
Variableのスペルを覚えるのも一つの手ですが、それなら2文字を打つ方がよっぽど速いです。
また文字数を減らせるので、スクリプトが見やすくなると思います。
addvは変数への足し算をします。第2引数を0より小さくすることで引き算もできます。
これも文字数を少しですが減らすことができます。
また、マップのどこかに自動開始イベントを配置し、
これを各マップに置き、warp関数でマップ移動時に
とすれば、マップを移動したときに音楽を変えることができます。
また、この処理が後々必要になります。
ですが、ここでは1人旅の場合のスクリプトに留めます。面倒くさいので。
2人以上にする際は、変数を配列化したりなどの工夫が必要になりますのでご了承ください。
ベースの方法と大きく異なるのは、
gte関数のこの部分です。
それまでで求めた経験値は今までの合計なので、
という流れで、今回の戦闘で獲得した経験値を求めます。
totalexp変数とtotalexp2変数とがありますが、
同じ合計経験値でも若干意味が違うので注意してください。
つまり、
やろうと思えばレベルアップチェック時に特定の装備をしていれば経験値ボーナスとか可能なワケです。
ちなみに、もし途中で敵の経験値を変えた場合、異常に高い経験値が入ってきたり、
逆にマイナスになったりする点に注意してください。
一度公開したら変えないぐらいの気持ちで何度もテストプレーをしましょう。
どうせなら戦闘の処理を関数化しちゃいましょう。
この関数は擬似ランダムエンカウント推奨です。
(擬似ランダムエンカウントについてはコチラ)
こうすることで、最大5種類の敵をランダムに出現させ、
誰を何体倒したので経験値はこのぐらい、といった処理が可能になります。
第1引数にrand関数を使うことで、数もランダムにできます。
(rand関数だけだと0の可能性もあるので、+1を忘れずに)
未熟者が作成したので、分かりにくい部分などあるかもしれません。
ですが、皆さんのゲーム作りの参考になれば幸いです。
今回は、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変数とがありますが、
同じ合計経験値でも若干意味が違うので注意してください。
| totalexp | totalexp2 |
|---|---|
| 全てで獲得した経験値の総合計 | 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)おわりに
いかがでしたでしょうか。未熟者が作成したので、分かりにくい部分などあるかもしれません。
ですが、皆さんのゲーム作りの参考になれば幸いです。
このWikiの掲示板(すべて読む)
コメント一覧
ゲスト
