fc2ブログ

2023-03

RGSS基本講座(8)

Numericクラス

数値は主に「整数」と「小数」の2つのクラスがあります。Numericクラスではそれらに共通するメソッドが定義されています。
RGSSリファレンス(ツクールのヘルプ)にはほとんどメソッドが載っていませんが、実際に使えるメソッドはもっとあります。とはいえ、普段使うメソッドはそんなにないので、RGSSリファレンスだけで十分かもしれません。

Numericクラスのメソッド

ゲーム作成中に使う可能性がありそうな2つのメソッドを紹介。

abs
絶対値を返すメソッドです。

num = -1
p(num.abs)          #=> 1

round
RGSSリファレンスでは「selfに最も近い整数を返します。」というめんどくさい表現をしていますが、要は四捨五入するメソッドってことです。

num1 = 4.5
p(num1.round)       #=> 5

num2 = 4.49
p(num2.round)       #=> 4

Integerクラス

整数のクラス。サブクラスが2つあって、大きい数はBignumクラス、小さい数はFixnumクラスになります。
これら2つのクラスは数値によって自動的に変換されるので、普段気にすることはありません。

掛け算・割り算

※足し算、引き算は省略。

*が掛け算の演算子です。×ではありません。

p(3 * 2)     #=> 6

/が割り算の演算子です。÷ではありません。
整数どうしの割り算では答えも整数になります

p(3 / 2)     #=> 1  (1.5ではない)

剰余・べき乗

%が剰余の演算子です。剰余とは割り算をしたときのあまりです。
ある数値が偶数か奇数かを確かめるときによく使います。

p 5 % 2     #=> 1  (あまりが1なので奇数)

**がべき乗の演算子です。

p(2 ** 10)   #=> 1024  (2の10乗)

比較演算子

==
ふたつのオブジェクトが等しいかを比較するときに使います。
プログラムでは=は代入の意味があるので比較の時は==を使います。

<
この辺は算数と一緒です。

>
上に同じく。

<=
=を含めるときは<や>を先に持ってきます。

>=
上に同じく。

<=>
左の方が大きい時に1を等しいときに0、小さいときに-1を返すメソッドです。

数え上げ

この辺は繰り返しの処理と一緒に説明するので、ここでは省略します。

変換

to_f
整数を浮動小数点に変換します。

p(1.to_f)         #=>  1.0

Floatクラス

Floatクラスは浮動小数点のクラスです。
基本的に使えるメソッドは整数のときと同じですが、数え上げのメソッドは使えません。

変換

to_i
浮動小数点を整数に変換します。

p(1.1.to_i)        #=>  1

整数と小数

整数と整数の演算は戻り値も整数です。
小数と小数の演算は戻り値も小数です。
整数と小数の演算は戻り値が小数になります。

p(3 / 2)          #=>  1
p(3.0 / 2.0)      #=>  1.5
p(3 / 2.0)        #=>  1.5

つまり、整数同士の演算で小数の戻り値がほしいときは意図的に片方を小数にすればいいのです。

Stringクラス

文字列のクラス。Rubyのリファレンスを見る限りではたくさんのメソッドが存在するが、ゲーム作成への用途がいまいち思い浮かばないものばかり。

作成

任意の文字をダブルクォーテーションやシングルクォーテーションでくくるとStringクラスのインスタンスと扱われます。

足し算・掛け算

Stringクラスでは足し算と掛け算ができます。
想像すれば結果はわかると思いますが、足し算では2つの文字列をくっつけた文字列が戻り値となり、掛け算ではかけた回数だけ文字列を繰り返した文字列が戻り値になります。

バックスラッシュ記法

ダブルクォーテーションでくくられた文字列にはバックスラッシュ記法が使えます。が、ゲームを作成するという面では基本的に利用できません。
これは文字列を画面に表示させるときは画像として扱うためです。

式展開

式展開を簡単に説明すると、イベントコマンドの「文章の表示」での制御文字の\v[n]とそっくりです。
ダブルクォーテーションでくくられた文字列中に#{変数}と書くと、変数内の値が文字列として表示されます。

name = "太郎"
p("わたしの名前は#{name}です")
#=>"わたしの名前は太郎です"
スポンサーサイト



«  RGSS基本講座(7)  | HOME |    »

コメント

べき乗の命令方法が分かってよかったです(^で出来なくて困ってました)。
ちなみに私は命中率のところで用いました。以下の式です。

hit = 80 * ( 2 ** ((attacker.dex - self.agi) / 50.0) ) - self.eva

攻撃側のDEX - 攻撃対象のAGIが、
 16:99.87%命中(17以上で100%命中)
  0:80%命中
-50:40%命中
-100:20%命中
-150:10%命中
-200:5%命中

初期設定ではDEXとAGIの比率により回避率が決まっており、
100%の回避率を出すにはDEXの12.5倍のAGIが必要で、
たとえば回避の得意なキャラクターをつくりたい場合などには
数値インフレが必要不可欠でした。(完全回避を足せば平気でしたが、
それだとどんな達人からも一定割合で攻撃をかわせてしまう不具合があります)
これを差分式にすることにより改善できます。

しかし、単なる差分にしてしまうと、
i )0~100%回避のDEX-AGI幅が狭い場合
  DEX及びAGIの上昇・減少に関して命中率が大きく変わってくれる半面、
  少しの差で簡単に命中率0%に行き着いてしまう。
  敵への命中率が0%ではプレイヤーに不快感を与えるし、逆もつまらないだろう。
ii )0~100%回避のDEX-AGI幅が狭い場合
  多少のDEX-AGIの差があっても、命中率がなかなか0%まで届かないため、
  ある程度安定した戦闘が期待できる。
  その反面、DEXやAGIが少し成長した程度では、命中率はほとんど変化しない。

単なる差分には上記の二律背反問題があるわけですが、
2をこの差分乗することにより、AGI=DEXとなる付近では感度を良くし、
(基本値の80付近では1の差につき約1%程度の変化があります)
さらに簡単には回避0%に行き着かないよう修正することができました。

ただし、この方法も万能ではなく、
AGIやDEXを上昇させるステート変化に弱いのが問題ですが。

上のステート変化に弱い問題は、Game_Battler_1の、
n *= $data_states[i].agi_rate / 100.0
および、
n *= $data_states[i].dex_rate / 100.0
を、
n += $data_states[i].agi_rate - 100.0
n += $data_states[i].dex_rate - 100.0
と変更することにより解決しました。
(器用さ%-100)の値が加算されるように変更した例です。
場合によっては全体を*2などすると良いかもしれません。

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

コメントの投稿


管理者にだけ表示を許可する

トラックバック

http://rgss.blog26.fc2.com/tb.php/11-a72a093b
この記事にトラックバックする(FC2ブログユーザー)

«  RGSS基本講座(7)  | HOME |    »

プロフィール

目次

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

 

カウンター