RGSS2

スクリプトのお話10とゲーム制作

久しぶりにまた更新をば

ゲーム制作の方は例によってあんまり画面的にかわってないので、またスクリプトのお話でも

と思ったんですが、一応変わってる部分もあるので動画も乗せておきます



HPとMPの下にゲージが増えたのと、通常攻撃がスキルになっているのがわかるかと思います

まあ正確には通常攻撃は、前に使ったスキルを再使用しているだけなのですが、とにかく今回は通常攻撃に分類される物がないわけです、はい

ゲージに関してはスキルの使用に必要になる予定です

まあこんな感じでぼちぼち開発は進めています

なにやらPRGツクールVXAceなるものが十二月にでるらしいので、それまでに開発を終わらせて移行できるようにしたいなあと思いつつ、RGSS2のお話に移るとします

今ちょうど装備の部分を弄っているのでその当たりの話をするとします

装備のオプションに経験値二倍や消費MP半分という物がありますが、これはスクリプトの中では

@half_mp_cost = false
@double_exp_gain = false

と、こんな感じでインスタンス変数にフラグが立てられてるわけです

この部分をtrueに変えてあげることで、フラグが立ち、参照先で判別させることができます

なので、もしも入手資金二倍とかいう項目が作りたければ

@double_gold_gain = true

という項目をつくって、その部分を参照するメソッドをつくって判別させてあげれば実装させることができます

ちなみに経験値二倍の場合はこんな感じのメソッドになってます

#--------------------------------------------------------------------------
# ● 防具オプション [取得経験値 2 倍] の取得
#--------------------------------------------------------------------------
def double_exp_gain
for armor in armors.compact
return true if armor.double_exp_gain
end
return false
end

中身としては、装備している防具をすべて参照して、その中に一つでも@double_exp_gainがtrueになっている装備があれば、経験値を二倍取得できるという物です

もちろん、これはあくまで経験値が二倍になるというフラグであって、実際の処理ではないので、このメソッドだけでは経験値を二倍にすることはできません

ではどうするかというと、経験値の入手処理を見てみましょう

#--------------------------------------------------------------------------
# ● 経験値の獲得 (経験値 2 倍のオプションを考慮)
# exp : 経験値の増加量
# show : レベルアップ表示フラグ
#--------------------------------------------------------------------------
def gain_exp(exp, show)
if double_exp_gain
change_exp(@exp + exp * 2, show)
else
change_exp(@exp + exp, show)
end
end

と、こんなメソッドになってます

注目すべきはifの後に書いてあるdouble_exp_gain

これは同クラスのメソッドであるdouble_exp_gainの結果で判断されることになります

つまり経験値二倍フラグがたっていれば、change_expメソッドに入手した経験値の二倍が与えられ、そうでなければ入手した経験値がそのまま与えられるわけです

なので、入手資金二倍の場合も同じく、判定用のメソッドをつくって、資金を入手するタイミングでフラグを判定、フラグが立っていれば金額を二倍にする、という処理になるわけです

ちなみに、資金を入手するメソッドはGame_ActorではなくGame_Partyにあります

gain_gold(n)というメソッドを探してみれば良いかと思います

ここをちょこちょこ弄れば入手資金二倍の処理ができるでしょう

では今回はこの辺で

そして例によってスタッフ募集のページをおいていきますね


スタッフ募集

スクリプトのお話9

最近諸事情によりネットがつながってなかったので更新できてなかったという

そんなわけに久方ぶりに更新します

ゲームの方は例によって細かい部分に入ってしまっているので、見せられる部分がないのでまたスクリプトの話でも

さて、今回はダメージ計算式のお話でもしましょうか

ダメージ計算式がどこにあるかといいますとGame_Battlerのmake_attack_damage_value(attacker)というメソッド

これは通常攻撃のダメージ計算ですが、スキルのダメージ計算のメソッドも近くにあるので探してみたらいいでしょう

で、これはGame_ActorとGame_EnemyのスーパークラスにあたるGame_Battlerにあるので、ここを変更すれば、敵味方ともにダメージの計算式が反映されるわけですね

……ふと今気づいたんだけども、Game_ActorとGame_Enemyに同じメソッドオーバーライドしたら、敵と味方でダメージの計算式変えれるんじゃなかろうか……まあいいか

で、肝心の計算式ですが

damage = attacker.atk * 4 - self.def * 2 # 基本計算

まず始めにこんな感じになってます

attackerというのはメソッドの引数になってるオブジェクトで、攻撃をしてきた相手のデータが入ってます

つまりアクターやエネミーのデータが入ってるわけです

で、当然アクターやエネミーには攻撃力が設定されていますので、attacker.atkというのは、攻撃してきた相手の、攻撃力が入るわけですはい

じゃあ次のself.defって何なのかというと、これは攻撃を受けているバトラー、これもまた例によってアクターやエネミーなわけですが、そのバトラーの防御力を指しています

なので、一番初期のダメージ計算式は 攻撃者の攻撃力 * 4 - 攻撃対象者の防御力 * 2で算出されるわけです

まあ今手元でPC弄っている方はまだスクリプトが続いているかと思いますが、とりあえず今回はこの基本的な部分だけのお話と言うことで

なので、仮にでかいダメージを出したい、ということになれば attacker.atk * 8 - self.defという風にしておけば、ダメージが超増えます

もちろん味方の攻撃だけでなく敵の攻撃も増えるので全滅は必死ですね。まさにやるかやられるかみたいな

とりあえず計算式に自分の作ったステータスを反映したいという場合はここを弄ればいいんじゃないでしょうか

属性攻撃の倍率等もしたのelements_max_rateのメソッドで計算されております

さらに言うと命中と回避の計算もこのメソッドが呼ばれる前に存在するのですが、長くなるのでまた後日と言うことで

とりあえず久しぶりの更新はこんなところで終了ということで、次回の更新と次回作をお待ちください

最後に恒例にするだろうスタッフ募集のリンクを張りつつ終わりとします




スタッフ募集

スクリプトのお話7

さて、まただらだらと更新してみます

今回はウインドウの書き換えみたいな感じのお話をしたいと思います

以前の日記で、ステータスを増やしたかと思いますが、当然のごとくステータスを増やしたところで、ステータス画面や装備画面でステータス項目が増えてくれることはありません

全部こちらで指定して表示させるようにしなければなりません

では具体的にどうすればいいのか?

今回はステータス画面に関してお話ししますが、いじる部分はここ

Window_Status

スクリプトエディターをあけて探してもらえれば見つけられるかと思いますが、windowと並んでいる所にあります

文字通り、キャラクターのステータスを表示する部分ですはい

で、ステータスを描画しているのがどの部分なのかを探してみると、なんかそれっぽいメソッドが

draw_parameters(x, y)

これがステータスを描画するメソッドです

引数のxとyはそのままステータスの描画位置のx座標とy座標になります

で、中身を見ると更にこんなメソッドが、

draw_actor_parameter(@actor, x, y + WLH * 0, 0)

これがキャラクターのステータスを描画してくれるメソッドになるわけですが、こんなメソッドはWindow_Statusのどこを探しても見つかりません

机の中も鞄の中も探しても見つかりません

ではどこにあるかというと、Window_Statusの中身の一番上を見てみましょう

class Window_Status < Window_Base

まあこれがどういう意味かを説明するとオブジェクト指向が云々とか言う話になるのですっとばして、とりあえずこういう風に書いてあったら、Window_Baseのメソッドが使えるんだ、とでも思っていてください

なのでWindow_Baseの中を探してみると、draw_actor_parameterというメソッドが見つかるかと思います

で、その中身を見てみると、when文でなにやらわけられていますね

draw_actor_parameterの引数のうち、一番最後の数字によって処理が変わってるわけです

例えばこの数字が0の場合は攻撃力が、1の場合は防御力が描画されます

さて、細かいことはまた後日に回すとして、ここに追加したいパラメータを書きましょう

when 4
parameter_name="技巧値"
parameter_value=actor.dex
end

みたいな感じで付け足すと、draw_actor_parameterの最後の引数が4の時に技巧値の値が描画される事になります

しかしもちろん、ここを変えるだけではステータス項目は増えません

呼び出し元のメソッドも増やす必要があります

draw_parameters(x, y)

ここですね、はい

この辺りをいじっていると、新しい項目が追加できて幸せになるかもしれません

ウインドウの描画関係はまた後日補足することにします

では今日はこの辺で




ちなみに、うちのサークルはメンバー募集中ですので、興味を持った方がいたら是非ご一報を
詳しくはこちら

スクリプトのお話6

久しぶりの更新になりますが、またスクリプトの話でもしようかと

まあ実は作業を頼んでいた友人の分の作業を結局自分ですることになったので、更新する必要もなくなってたんですが、なんか検索のやつみてたらRGSSで検索してきてる方がいるみたいなので、ちょこちょこ更新していこうかと

とはいえ、特にさしあたってネタがないので、ちょっとずつ更新していくことになるかと

なんかネタを提供してくれたら、それを元に日記書けるかもですはい

さて、では今日のスクリプトのお話ですが、特にネタがないので、職業毎にステータス補正の付け方でも書いてみようかと

前のスクリプトの話書いた時に載せましたが、アクターの能力値を表してるのが

#--------------------------------------------------------------------------
# ● 基本攻撃力の取得
#--------------------------------------------------------------------------
def base_atk
n = actor.parameters[2, @level]
for item in equips.compact do n += item.atk end
return n
end

こんな感じになってます

で、職業はデータベースのIDで管理されてるわけですが、例えばデフォルトでは勇者のIDが1になってます

これはアクターのデータの中で、職業が勇者の時は@class_id=1になります

で、職業が勇者の時@class_id=1なので、

#--------------------------------------------------------------------------
# ● 基本攻撃力の取得
#--------------------------------------------------------------------------
def base_atk
n = actor.parameters[2, @level]
for item in equips.compact do n += item.atk end
n *= 120 /100 if @class_id == 1
return n
end

みたいな感じにすると、職業が勇者の時攻撃力が1.2倍になると言う風になるわけです

……が、だからといってbase_atkメソッドの中に延々とif文を並べるような書き方はまあありえないわけで

じゃあどうするかというと、モジュールを使います

モジュールが何かという解説はまた後日……というか、解説できるほど詳しくないのでとりあえず脇に置いておいて、とりあえずgame_actorの天辺にでも

module Class
HOSEI = [
[0],
[100,100,100,100,100,100]
]

みたいな感じで書きます

とりあえずモジュールの部分は置いておくとして、HOSEIの部分に関しては見ての通り配列です

更に言うと二次配列になってます

で、アクセスする時なんですが

Class::HOSEI

モジュール名を::でつないで、モジュールの中の項目も同じように::でつないであげるとアクセスできます

で、これをどう使うかと言いますと

#--------------------------------------------------------------------------
# ● 基本攻撃力の取得
#--------------------------------------------------------------------------
def base_atk
n = actor.parameters[2, @level]
for item in equips.compact do n += item.atk end
n = n * Class::HOSEI[@class_id][0]
return n
end

みたいな感じで書きます

HOSEIの中身は二次配列の1、配列は0から始まるので、配列の中身的には二番目のことを示します

Class::HOSEI[@class_id]というのは[100,100,100,100,100,100]と同じになります

さらに配列の中の配列のを指定すると

Class:HOSEI[@class_id][0]=100

ってな感じになるわけです

だから配列の中身の初めは0になってるわけです、はい

後は対応するステータスの数だけ配列の中身を増やして、かつ職業の数だけ配列を用意してあげれば、職業毎にステータスの補正値を決められるわけです

まあぶっちゃけモジュール使わなくても、初期化の時に二次配列用意してあげるだけで補正値は用意できますが、初期化のたびに配列が用意されるのは余りよろしくないので、モジュール用意するのが無難かと思われます

まあその辺はお好みでってことで、今日は終わりにしておきます

かなりわかりにくいかと思いますが、まあ何かの参考になれば幸いです

では

スクリプトの話その5

はい、というわけで昨日の続きです

昨日はキャラクターのレベルの上げ方というか、経験値の入り方とかテーブルの話とかしてましたが、もしこれがキャラクターではなく、例えば職業のレベルを上げたいだとか、武器の熟練度を上げたいという話になればどうすればいいのか

答えは簡単、同じように武器や職業の経験値テーブルを作ってあげて、同じように職業や武器の経験値の入手方法を作ってあげればいいわけですよ

各経験値テーブルとか、レベルとかは初期化の際に
@level = actor.initial_level
@exp_list = Array.new(101)
make_exp_list

この辺りを変更してあげればいいのですよ

@class_level = 1
@class_exp_list = Array.new(101)
class_make_exp_list

みたいな感じで

ちなみにmake_exp_listは昨日の日記に書いた経験値テーブルを用意するメソッドです

しかしこれ、注意しないといけないのは、職業が固定の場合はともかく、職業を変更した場合も、@class_levelが引き継がれてしまうことになります

例えば戦士Lv8が転職して魔法使いになった場合、魔法使いの職業レベルは戦士を引き継いでLv8になってしまいます

何故ってそれはアクターの中に職業Lvを管理する変数が一つしかないからです

厳密にはこれ、戦士職業Lv8じゃなくて、ただ単に職業レベルが8って処理されてしまうわけですよ

まあ転職ないならこれでもいいかと思います。何とかしたい場合は、何らかの管理方法を考えるしかないですね

一番単純なのは、クラスIDを使って、レベルを配列で管理するぐらいじゃないかなあ、というかアルカディア旅行記はそうしてました

武器の熟練度も同じく、装備している武器の属性から、配列で分けて管理してました

さて、ここまで説明してしまえば後はもうほとんど説明は必要ないかと思いますが、一応、ステータスの上げたかを書いておきましょうか

先程までと同じく、経験値テーブルを用意して、レベルアップの処理を行います

で、例えば一定以上経験値がたまった場合攻撃力が上がる、と言う処理にする場合はこんな感じに

 #--------------------------------------------------------------------------
# ●攻撃力 レベルアップ
#--------------------------------------------------------------------------
def atk_level_up
@atk_level += 1
end

@atk_levelというのはこれもまた攻撃力のレベルですね、これをbase_atkに足してあげれば攻撃力はあがるかと

ちなみに、
#--------------------------------------------------------------------------
# ●攻撃力 レベルアップ
#--------------------------------------------------------------------------
def atk_level_up
self.atk += 1
end

この計算式でも、以前の設定がちゃんとできているなら動くはずです

しかし、これをやると後からちょっとした問題が出てくることに、下の話書いてる時に気づきました

さて、ところで話は昨日の所まで戻りますが、もしも累計ではなく毎回毎回入手経験値を0に戻して、次のレベルの経験値を貯めさせたい場合の処理は、この辺りに入れればいいんじゃないでしょうか

計算式にするとこんな感じかな
@atk_exp -= @atk_exp_list[@atk_level - 1]

レベルが上がった時の経験値マイナス、現在のレベルよりも一低い経験値テーブルの分だけ経験値をマイナス

ー1は入れる場所によっては必要在りませんが、一応何故必要かと言いますと、この計算式を行う際に、すでにレベルが上がっていたら@atk_exp_list[@atk_level]、つまり次のレベルにあがるのに必要な分だけ経験値をマイナスにしてしまうわけです。まあ普通に考えたらまず0になるかと

逆に、条件式を超えてしまえば、とりあえずレベルは上がるので、レベルが上がる前に経験値を引く処理をするなら、-1は必要ないというわけです

さて、ここでお気づきいただけたかと思いますが、self.atk += 1だと攻撃力は上がるけど、経験値テーブルの管理ができないっていうね

まあスパロボみたいにレベルあがるために必要な経験値は500固定、とかだったらさっきの式でも問題ないはず

さて、この辺りで経験値に関する部分は終わりな感じです

よくよく考えてみると、経験値入手に関するメソッドを作ったのはいいけど、どこで使うんだよ、っていう部分が残ってるような気がしますが、まあ設定には関係なので今回はなしということで

どうしても気になる人は、SCENEBATTLを覗いてみればわかるかと思います

実際のゲームで、どのタイミングで経験値やお金を入手するかを考えれば、簡単に見つかるかと思います

ただその辺の話をすると、敵が職業経験値や、武器経験値を落とすようにするとか、トループの設定だとか色々でてくるので機会が在ればということで

それでは、今日はそろそろ失礼します。では
作品一覧
サークルプロフィール
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

最新コメント
twitter
  • RSS
  • Dlsite blog