忍者ブログ

へぷたなすくろーる

RPGツクールのブログです。イベント講座とRGSS3スクリプト配布をやってます♪

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

このブログについて

「へぷたなすくろーる」へようこそ!
このブログでは管理人の奈々(なな)が作成した
RPGツクールVXAce用のスクリプト素材(RGSS3)を配布しています。
またRPGツクール共通の製作テクニックなどの情報も紹介しています。
皆様のゲーム製作に少しでも役立てば幸いです。

※重要1
スパムコメントが本当に酷いので、認証ワードを設定しました。
コメントを投稿する際には、文章の中に「す。」を入れて下さい。
またURLの直貼りも禁止中です。hを抜くなりして下さい。



更新履歴・拍手 / 非公開コメントへのお返事

利用規約 

スクリプトの一覧
  (スクリプト素材の導入方法)

制作テクニックの一覧

拍手[264回]

PR

更新履歴

管理人のつぶやき

長らく返信が滞ってしまい、申し訳ありませんでした。
わんこそばみたいなタスクに溺れていますが何とか元気?です。

ご利用報告を拍手の方で対応して頂いたり、暖かい言葉を頂いたりと
サイト開設以来、ご利用者ご訪問者の皆さまに恵まれていることを感謝する日々です。
ありがとうございます。

拍手 / 非公開コメントへのお返事は続きにあります。(最終更新、5/16)
これ以前の更新やお返事は「その他」カテゴリーから見れます。
更新履歴(素材)
2021
8/10
「エネミー戦闘行動のAI化」  Ver.1.2に更新(仕様変更)

6/13
「攻撃を受けてから反撃」  Ver.1.4に更新(仕様を整理)

6/11
「攻撃を受けてから反撃」  Ver.1.3に更新(仕様変更・機能追加)

6/6
「隊列操作」  新規公開
「隊列固定」  新規公開
「文末ポーズサイン」  新規公開

5/7
「オリジナルメニューコマンド」  Ver.2.0に更新(バグ修正)

5/4
「アイテム選択拡張」  Ver.1.1に更新(バグ修正)


拍手[68回]

利用者のためのスクリプト講座(3)

とても間が空いてしまった3回目です。
今回は第1回と第2回の内容を補完しながら、その繋がりを説明します。


1. オブジェクトとクラス
第1回でスクリプトの構成として「クラス」と「メソッド」があることを
第2回でコードの一例として変数の代入を紹介し
「変数」と「オブジェクト」があることを説明しました。

ではこれらの関係はどうなっているのか、と言いますと
クラスというのは設計図で、それを元に生成されるのがオブジェクトです。
スクリプトのコードを書いているときは主にクラスの定義をしているわけですが
ゲームの実行中は、そこから作られたオブジェクトが動いているイメージです。

また、このクラスから生成されるものをインスタンスと言い
正確には「オブジェクト = クラスのインスタンス」という定義となりますが
とりあえずはオブジェクトとインスタンスは同じものを指していると理解しましょう。

専門用語が増えてややこしい限りですが、何となく気分で使い分け
単体で見たときはオブジェクトという言い方をして
元のクラスとの関係性で見たときはインスタンスという言い方をします。


2. pコマンドとコンソール
さて座学が続いて退屈だと思いますので、そろそろ具体的に手を動かしてみましょう。
まず色々試すために新規プロジェクトを作成して下さい。
スクリプトの触り方は2つあります。

新規のイベントを作って、イベントコマンド「スクリプト」を作成します。
以下のコードを入力して、テストプレイで実行して下さい。
a = 10 #変数aに10を入れる
b = a * 10 #変数bに変数a*10を入れる
p b #コンソールに変数bを表示
コンソールウィンドウ(テストプレイ時に出てくる黒いウィンドウ)の方に
100が表示されたかと思います。
p オブジェクト
でそのオブジェクトをコンソールに表示するコマンドになります。

次にスクリプトエディタを開き
Game_Actor の30行目にある setup メソッドの最後の行に
p @name
を追加します。第1回のパッチ形式で出来ればなお良し。

テストプレイでゲームを起動すると、やはりコンソールに
"エリック"
と表示されるはずです。初期パーティを増やすと名前も増えます。

このpコマンドは最重要です。
・この変数に入っているオブジェクトは何か(整数か小数か文字列か)
・この処理はどのタイミングで実行されているのか
etc.デバッグにも調査にも必須となりますので、使い倒しましょう。


3. オブジェクトのクラス
というわけで、オブジェクト = インスタンスは必ず元となるクラスを持っています。

例えば文字列は String というクラスです。
配列だと Array というクラスになります。
数値は少し複雑で細分化されています。(スーパークラスも絡むので説明は次回で)

これらは最も基本的なクラスなので、決められた書き方をすることで
そのインスタンスを直接生成できます。これをリテラルと言います。※第2回参照
a = 10  # Integer クラスのインスタンス 10 を生成して、変数aに代入
b = "あ"  # String クラスのインスタンス あ を生成して、変数bに代入

ではリテラルが使えない普通のクラスはどうするかというと
クラスからインスタンスを生成する、全クラス共通の方法を使います。
a = xxx.new  # xxx クラスのインスタンスを生成して、変数aに代入

一方、そのオブジェクトがどのクラスのインスタンスなのか調べるには
p オブジェクト.class
というのを使います。これでクラス名が判別できます。


4. 変数の参照に慣れよう
ここまで散々「オブジェクト」と書いてきましたが
例の通り、コード上で実際に指定するのはオブジェクトの入った変数名です。

実際の運用としてもインスタンス生成時に変数に入れて(=名前を付けて)
その変数名=そのオブジェクトとして取り扱う感じになります。

実行時にはその変数の中身のオブジェクトが参照される、置き換わるイメージです。
例えばこんな感じです。
ダメージ = 攻撃力 * 2 #攻撃力の中身は100
 →    100 * 2
 →    200   #ダメージには200が入る
HP = HP - ダメージ   #HPの中身は1000
 → 1000 - 200
 → 800       #HPには800が入る(自己代入)
エラーの多くは、この置き換えた結果で、コードが破綻して起こります。
ダメージ = 攻撃力 * 2 #攻撃力の中身は"強い"(文字列)
 →    "強い" * 2  #ここで破綻……は実はしない
 →    "強い強い"   #ダメージには"強い強い"が入る
HP = HP - ダメージ   #HPの中身は1000
 → 1000 - "強い強い" #ここで破綻する
 → *error*
上記の例のように、コード自体は同じでも変数の中身によって破綻します。
またその場では成立してしまい、後で破綻してエラー箇所がずれることもあります。
この例だと全然別の、攻撃力に"強い"なんて代入する処理に問題がありますね。

p オブジェクトや p オブジェクト.class を使い
変数の中身のオブジェクトを理解する必要があるのはこのためです。


5. メソッドの呼び出しとself
オブジェクトの取り扱いに慣れてきたところで、もう1つだけ覚えてしまいましょう。
クラスでは一連の処理である「メソッド」を定義していました。※第1回参照
オブジェクト.メソッド名
とすることで、そのオブジェクトのメソッドを呼び出すことができます。

気付きましたかね。実はさっきの オブジェクト.class もメソッドの呼び出しでした。
これによって異なるオブジェクト間で処理のやり取りをすることができます。
例えばアクター、エネミー、スキル、ウィンドウは全部別のクラス=オブジェクトですが
こんな感じでお互いに参照し合ってゲームの流れが形作られています。

一方で、自身のメソッドを呼び出す場合は
self.メソッド名
とします。self は「そのオブジェクト自身」を意味します。
なお self は省略可能です。つまりメソッド名だけ書けば自身のメソッド呼び出しになります。

最後に、 + や & などの「演算子」というのも
実は特殊な形をしているメソッド呼び出しとなっています。
例えば "あいう" + "えお" とすると2つが繋がった文字列"あいうえお"になりますが
これはStringクラスで +メソッドがその様に定義されているためです。


6. スクリプトの処理でやっていること
お疲れ様でした。ここまで多くの用語や考え方が出てきて大変だったと思います。
ですが以上を理解した上でスクリプトのコードを眺めてみれば
実はやっていることは以下の4パターンくらいだと分かります。

 書いていること      やっていること
・変数への代入     = 変数を定義
・(self.)メソッド名    = 自身のメソッド呼び出し
・変数名(.メソッド名)  = 他オブジェクトのメソッド呼び出し
・その他        = 制御構文(クラス、メソッドの定義や条件分岐など)

次回からは実例を交えて、より具体的・実践的な内容に行きたいと思います。

まとめ
・クラス → インスタンス=オブジェクト
・まずはとにかくpコマンドを使って確認する
・実行時に参照先に置き換わるというイメージに慣れる

拍手[2回]

利用者のためのスクリプト講座(2)

※素人が分かりやすさを優先して書いているため、
定義や用語としては不正確な表現があるかもしれません。ご了承下さい。

第2回です。
今回からは具体的にスクリプトの中身を見ていきましょう。
まず、繰り返しますがコードは基本的には1行で1つの処理です。

文字が書いてあったり、数式が書いてあったり様々ですが、ある程度パターンがあります。
今回は「=」に注目して下さい。
◯◯ = △△
と書いてあるものがあります。これが「変数への代入」です。
(=の使い方が、数学の式とは全くの別物なので、注意して下さい)


1. 「オブジェクト」と「変数」について
変数とは箱のイメージで例えられます。ツクールの場合は数値が入っていましたが
RGSS3での「変数」はより広い範囲で、何かしらの「オブジェクト」が入ります。
◯◯ = △△
先程のパターンは
〇〇(左辺)の変数に、△△(右辺)のオブジェクトを代入するという処理になります。

ではオブジェクトとは何か。
ここでオブジェクトの定義や説明から入ると良く分からないと思いますので
先に分かりやすい、基本的なオブジェクトの具体例を見ていきましょう。

まずは「数値」です。リテラル(書き方)はシンプルで、そのまま数値を書きます。
後述しますが、計算の方もシンプルに書けるため、四則計算ができれば概ね扱えます。

次に「文字列」です。こちらのリテラルは""(ダブルクオーテーション)で囲みます。
例えば 10 なら数値、 "10" なら文字列として扱われます。

最後に「真偽値」です。リテラルはtrue / false / nilとそれぞれ書きます。
これはツクールでいうスイッチのことです。
条件分岐とセットで扱う概念なので、その時に詳しく説明します。

どうでしょう。箱の中に何が入っているのか、イメージが掴めましたか。
a = 10  変数aの中に10という数値を代入
b = "10"  変数bの中に10という文字列を代入

2. 計算式について
さて、コードの中には
◯◯ = □□ + □□
というようなパターンもあるかと思います。
結論から言うと、これは先程の「変数への代入」処理
◯◯ = △△
の△△(右辺)が計算式になっているよ、という扱いです。

コード上での計算式は、その場で計算されて結果の「オブジェクト」を返します。
例えば
a = 3 + 7
というのは、3 + 7 がその場で計算されて 10 となり
a = 10
として処理される。つまり変数aに数値の10が代入されます。

先述したように= の扱いが異なることと、一部書き方に違いはありますが
計算式の使い方や計算順序は、一般的な四則計算と概ね一緒です。
+ 加算
- 減算
* 乗算
/ 除算
% 余り
() 括弧内を優先して計算

3. 変数の操作
ここまでは変数の代入、つまり箱の中に何を入れるかという操作でした。
一方で、変数の中身に対して、足したり引いたりという操作もできます。
◯◯ += △△
◯◯ -= △△
◯◯ *= △△
◯◯ /= △△

4. 変数の参照
右辺・計算式の中には、変数を使うことも出来ます。
代入以外で変数が記述されている場合は、その変数の中身が使われます。
a = 7
b = 3
c = a + b
この場合、最後の行は
c = 7 + 3 → c = 10
となり、変数cには数値の10が代入されます。

因みに、先程の
◯◯ -= △△
というのは
◯◯ = ◯◯ + △△
というのものの省略形という扱いです。
この様に代入内容に自身を含むものを、自己代入と言います。

実際のところ、数値そのものより変数を参照する方が多いです。
多数の変数が代入と参照を繰り返して、プログラムは成り立っています。


5. クラス・メソッドとの関わり
例えば、ダメージを与える処理はこういうイメージです。
atk = ◯◯(攻撃力の入った変数)
def = △△(防御力の入った変数)
hp = □□(HPの入った変数)
damage = atk * 4 - def * 2 #攻撃力から防御力を引いてダメージを計算
hp -= damege
この例だと◯◯、△△、□□は、それぞれ別のところから持ってきた変数です。

このような「ダメージを与える処理(計算)」だけをひとかたまりにして
前回説明した「メソッド」にしておくわけですね。
他にも攻撃力や防御力を決めるメソッドがあり
変数を介して、メソッド間で結果をバトンパスしながら処理を進めます。


まとめ
一旦まとめます。
・変数にはオブジェクトが入る
・オブジェクトは本当に色々あるが、まずは数値で考えると楽
・変数は参照されて、中のオブジェクトを返す
・計算式も計算されて、オブジェクトを返す

第1回と第2回は、それぞれ前提となるルールの説明が中心となりましたが
第3回ではそれらを踏まえて、いよいよその2つが具体的にどう繋がっているのか
より具体的な内容にフォーカスする予定です。
最後に、余談的な内容で終わります。

拍手[2回]

利用者のためのスクリプト講座(1)

このブログに来られる方は、RGSS3・VXAceユーザーが大半のはずで
今や既存の素材を組み合わせて(或いは改造して)使うことが主になるかと思います。

なのでブログの更新を兼ねて、詳しくない人がスクリプトを弄れるような
あくまで簡単かつ不定期の記事を書いてみることにしました。
需要があるかは分かりませんが、宜しくお願いします。


1. スクリプトの構造

まずRGSS3のスクリプトは、1行で1つのことを行います。

これを機能毎にまとめて、一連の処理として使いやすくしたのが「メソッド」です。
def aaa と end で挟まれているものが、aaaメソッドという指定になります。

複数のメソッドを入れる箱が、「クラス」または「モジュール」です。
class xxx と endで挟まれているものが、xxxクラス
module yyy と endで挟まれているものが、yyyモジュールになります。

外側から見ると、クラスの中にメソッドがあり、その中に具体的な処理が入っているわけです。
実際には以下のように、インデントを入れる人が多いので、言葉よりは分かりやすいはずです。
class xxx
 def aaa
  ◯◯◯◯◯
  ◯◯◯◯◯
 end
 def bbb
  ◯◯◯◯◯
  ◯◯◯◯◯
 end
end
入れ子構造になるため、どのendと対応しているかに要注意です。
改造の過程で「endの数が合わないよエラー」が出た場合は
落ち着いてインデントや1行スペースを入れて整理していくと良いです。

なおxxxクラスのaaaメソッドと、zzzクラスのaaaメソッドは別物です。
改造する際には取り違えないよう、どのクラスのメソッドなのか確認しましょう。


2. メソッドの上書き(パッチ)

スクリプトは上から順に読み込まれていきます。
もし「xxxクラスのaaaメソッド」が複数あると、後から読み込まれた方で上書きされます。

そこで、下の方に新しいスクリプトを作り
あるメソッドを(クラス指定と一緒に)コピーしてから改造すると
元のスクリプトに手を加えることなく改造することができます。
↓これでxxxクラスのaaaメソッドだけを上書きできる。
class xxx
 def aaa
  ◯◯◯◯◯
  △△△△△
 end
end
元の素材を更新したり、自分が手を入れた場所が分かりやすかったりと
可能な限りパッチ形式で改造したほうが良いです。
言うまでもなくスクリプト素材自体が、この仕様を使って
ベーススクリプトを改造したパッチになっています。

そしてこの仕様で予期せぬ上書きが起きてしまうのが
いわゆるスクリプト素材同士の競合ということになります。
(過去のマージについての記事も参照)


3. aliasに注意

alias という命令は、上書き前のメソッドを利用できる機能があり
非常に便利なためスクリプト素材の方で多用されていますが
これをコピーしてしまうと無限ループに入るという欠点を抱えています。

基本的にはメソッドの上に書いてあることが多いですが
パッチを作る際にまとめてコピーしないように注意しましょう。


まとめ

これで安全にスクリプトを改造する準備が整いました。心置きなくトライアンドエラーして下さい。
次回はメソッドの中身について、具体的に見ていきます。

気付いたかもしれませんが、スクリプト素材の改造と、スクリプトの作成はほぼ同じです。
ただ新規作成や、大型素材の改造は、改造箇所の特定が難しいため、まずは小規模素材の改造から入るのがオススメです。ところで簡単とは

拍手[4回]

ブログ内検索

アーカイブ

最新コメント

[10/18 ヒヨラー]
[10/06 シキ]
[10/13 深海樹]
[08/02 ダイ二ホケンシツ]
[07/29 ダイ二ホケンシツ]

プロフィール

バナー

HN:奈々(なな)
RPGツクールVXAceを中心に製作を行っています。 スクリプト、イラスト、ドット絵など広くちょこちょこ手を出していますので、 できる範囲で他のツクーラーさんのお手伝いができたらなと思っています。