Dear!くろうどぃあ!

このブログでは、私、くろうどの趣味に関する事を記述します。
当面は、「RPGツクールMV」をメインにします。

SUMOシステム

2020-03-07 13:44:53 | RPGツクールMV
Twitterの自分のTweetを引用。






フォントを変える方法(OSにインストールされている物を使う)

2020-01-01 20:10:36 | RPGツクールMV
↓RPGツクールMVのフォントについて、Tweetをしました。

RPGツクールMVはJavaScriptで記述され、ブラウザで動作します。
ブラウザはHTMLという物で書かれた内容を表示します。
HTMLの他に、レイアウトなどはCSSという物で記述します。

今回は、RPGツクールMVのプロジェクトデータ内にある、CSSファイルを書き換えました。



(↑)こんな感じで、「local」を追加する事で、OSにインストールされているフォントを使う事が出来ます。
ユーザー端末にそのフォントがインストールされている保証はないので、作者のこだわりフォントが必ず使えるわけではないですが、再配布しているわけではないのでフォントの利用規約を気にする必要はないと思います。たぶん。

「font-family」で名前を指定しているので、これを追加して、プラグインを用意すれば、ゲーム中でのフォント切替も可能です。
スイッチ1番を使って切り替える場合は(↓)こんな感じで。



今回は、Windowsにインストールされていた「Monsters Attack!」というフォントが面白そうだったので使ってみました。


(↓)こんなん驚くわ!!
(↓)スイッチ1番をONにして、フォント切替してみた。

今回は以上です。


強制移動プラグインを作りました。

2019-08-07 11:56:05 | RPGツクールMV
強制移動プラグインを作ったので、GitHubに置きました~。



RPGツクールMVで処理の流れを考えてみようの巻

2019-05-09 19:53:05 | RPGツクールMV
## はじめに

今回は、処理を作る時に考えておく事を簡単に説明します。
説明は、RPGツクールMVを使って行います。

## やりたい処理を考える

まず、やりたい処理を考えます。
今回は、戦闘に勝利した時に得られる経験値を「戦闘参加メンバーと控えメンバーで違いを付ける」処理を考えます。

RPGツクールMVで「控えメンバーも経験値を獲得」という設定をすると、戦闘参加メンバーも控えメンバーも「同じ」経験値を入手します。
これをなんとかして違いを付けるようにします。
今回は、プラグイン(JavaScript)は使いません。

## 処理をどうやって作るか考える

さて、RPGツクールMVの機能の中で経験値に関する物がありますね。
そうです。以下の3つですね。

1. 「敵キャラ」の「経験値」の設定
2. 「イベント」の「経験値の増減」コマンド
3. 「特徴」の「経験値獲得率」の設定

1つ目は、最もメインとなる経験値の設定ですね。
今回、ここは設定しますが、設定出来る値が1個なので違いを出す事は出来なさそうです。

2つ目は、イベントで経験値を与えるコマンドですね。
変数を使って増減値を指定出来るので、使おうと思えば使えそうですが、具体的な値をどうやって決めるのか、戦闘終了時にこのイベントを実行するにはどうするのか、といった点が難しそうです。

3つ目は、1つ目の敵キャラに設定する経験値の値を割合で変更する物です。
これを戦闘参加メンバーと控えメンバーで割合を変えれば、なんとか出来そうです。
今回は、この「経験値獲得率」を使います。

## 処理を作ってみる

では、「経験値獲得率」をどのように使うのか、処理を考えましょう。
やりたい事は

戦闘勝利時に得られる経験値を戦闘参加メンバーと控えメンバーで違いを付ける。

なので、戦闘参加メンバー全員に「経験値獲得率」を設定すれば良さそうですね。

ここで、RPGツクールMVの仕様の話になりますが、イベントコマンドで「パーティ全体」という処理を行った場合、マップ画面では控えメンバーも含みますが、戦闘中では戦闘参加メンバーのみが対象になります。
つまり、戦闘中であれば、『戦闘参加メンバー全員に「経験値獲得率」を設定』するには「パーティ全体」を指定すれば、簡単そうに見えます。

そして、戦闘参加メンバーは戦闘ごとに変わる可能性があるので、「経験値獲得率」は付与・解除が簡単に出来るように「ステート」に「経験値獲得率アップ」として用意するのが良さそうです。



次に、処理の流れを考えます。
以下の図を描いてみました。



さあ、この図を元に実装してみましょう。

1. 戦闘開始時に経験値獲得率アップを付与します。
バトルイベントでターン0の時に、パーティ全体に経験値獲得率アップを付与します。
2. 戦闘終了時に経験値獲得率アップを解除します。
コモンイベントの並列処理で戦闘終了時の処理を行います。
(戦闘開始時に戦闘発生スイッチをONに、この処理の中でOFFにして管理します。この処理の記述は省略します)

戦闘に勝利したら経験値が得られるのは元々の処理なので、この2つを追加します。

尚、ステートの「戦闘終了時に解除」を使うと、戦闘終了時の経験値獲得の前にステートが解除されてしまうようなので、わざわざコモンイベントを使用しています。




## 例外処理を考える

ところで、この処理では考慮されていない物があります。
RPGツクールMVでは、戦闘不能になると「全てのステートが解除されてしまう」事です。
この解除には、プレイヤーに見えないステートも含まれます。

そこで、戦闘不能から復活する時(アイテムの効果など)に経験値獲得率アップを再付与します。

尚、戦闘不能のまま戦闘終了すると経験値が得られませんが、これは戦闘不能ステートに経験値獲得率があるためです。必要に応じて変更しましょう。



## おわりに

このように、処理の流れを考える時には図を描いたり、状態が変わる処理が別に存在しないかをチェックしましょう。

それではまた。


JavaScriptの基礎っぽい物【2のつづき】

2018-11-18 18:22:41 | RPGツクールMV

こんにちは。くろうどです。

前回のじゃんけん関数を実際にRPGツクールMVで使ってみました。

これをそのままプラグインとして登録しました。

(即時関数では囲っていないです)

 

マップイベントは以下のようになっています。

画像だと一部しか表示されていないので、テキストにしたのが以下です。

じゃんけん関数は、真ん中辺りの変数の操作(スクリプト)で、

「◆変数の操作:#0003 [じゃんけん結果] = janken($gameVariables.value(1), $gameVariables.value(2))」

こんな感じで使っています。


◆変数の操作:#0002 [対戦相手の手] = 乱数 0..2
◆条件分岐:[対戦相手の手] = 0
◆名前の変更:対戦相手の手, グー

:分岐終了
◆条件分岐:[対戦相手の手] = 1
◆名前の変更:対戦相手の手, チョキ

:分岐終了
◆条件分岐:[対戦相手の手] = 2
◆名前の変更:対戦相手の手, パー

:分岐終了
◆文章:Package1(0), ウィンドウ, 上
:  :\>僕とじゃんけんをしよう。
:  :\>
:  :\>君の手を選んでね。
◆選択肢の表示:グー, チョキ, パー (ウィンドウ, 中, #1, -)
:グーのとき
◆変数の操作:#0001 [あなたの手] = 0
◆名前の変更:あなたの手, グー

:チョキのとき
◆変数の操作:#0001 [あなたの手] = 1
◆名前の変更:あなたの手, チョキ

:パーのとき
◆変数の操作:#0001 [あなたの手] = 2
◆名前の変更:あなたの手, パー

:分岐終了
◆変数の操作:#0003 [じゃんけん結果] = janken($gameVariables.value(1), $gameVariables.value(2))
◆条件分岐:[じゃんけん結果] > 0
◆文章:Package1(0), ウィンドウ, 上
:  :\>君:\N[1] VS \N[2]:僕
:  :\>
:  :\>君の勝ちだよ。

:分岐終了
◆条件分岐:[じゃんけん結果] = 0
◆文章:Package1(0), ウィンドウ, 上
:  :\>君:\N[1] VS \N[2]:僕
:  :\>
:  :\>あいこだね。

:分岐終了
◆条件分岐:[じゃんけん結果] < 0
◆文章:Package1(0), ウィンドウ, 上
:  :\>君:\N[1] VS \N[2]:僕
:  :\>
:  :\>僕の勝ちだよ。
:  :\>つまり、君の負けって事さ。

:分岐終了


これを実行すると以下のようになります。

 それでは~。


JavaScriptの基礎っぽい物【2】

2018-11-18 08:01:23 | RPGツクールMV

こんにちは。くろうどです。

今回は、RPGツクールMVをやってる人向けに JavaScript の基礎っぽいソースコードをお見せする第2弾を書きたいと思います。

今回紹介する関数は「じゃんけん」です。

 

①まず、このじゃんけん関数の仕様をコメント部分(/* と */ の間)に書いていますが、書ききれていないですね……。

今回は前提として、2人でじゃんけんします。

「あなた」と「対戦相手」の2つのじゃんけんの手を引数として与えます。

「0:グー、1:チョキ、2:パー」としました。

※今回、配列を使うので0からの連番としました。

そして、じゃんけんの対戦結果が戻り値として戻ってきます。

「-1:あなたの負け、0:引き分け、1:あなたの勝ち」としました。

※0を基準に大小比較する方がソースコードが分かりやすくなると思い、こうしました。


②「janken = function(you, opponent)」の部分は、関数の宣言です。

引数を2つ受け取ります。


③「var game =」の部分は、じゃんけんの入力と結果を二次元配列を使用して表現しています。

配列は1列だけではなく、表として使う二次元配列という使い方が出来ます。

(三次元以上の配列は分かりにくいので使わない方がイイかと思います)

今回は、あなたと対戦相手の2人のじゃんけんなので、表で表すことが出来ます。

表を使う事で、if文を使わずにじゃんけんの結果を出す事が出来ます。


④「return game[you][opponent];」の部分でじゃんけん結果を戻します。

配列gameに引数で得た値をそのまま与え、配列gameに設定されている「-1、0、1」の値をもらい、そのまま return で戻します。


⑤この「じゃんけん関数」を使う時は、「あなた」の手を入力してもらい、「相手」の手をランダム等で決定し、その値を関数に与えます。

そして戻り値を判定し「勝ち、負け、あいこ」等のメッセージを出す事になります。

つまり、この関数ではプレイヤーの入力や、メッセージの表示は行わないという事です。


↓↓画像じゃないソースコード


/*
* じゃんけん関数
*
* 引数に0~2の値を入れる。
* 0:グー
* 1:チョキ
* 2:パー
*
* 戻り値
* -1:あなたの負け
* 0:あいこ
* 1:あなたの勝ち
*/
janken = function(you, opponent) {
// ↓you / opp→ rock scissors paper
// rock draw win lose
// scissors lose draw win
// paper win lose draw
var game = [[ 0, 1, -1],
[-1, 0, 1],
[ 1, -1, 0]];

return game[you][opponent];
};

// テスト実行
console.log(janken(0, 0));
console.log(janken(1, 0));
console.log(janken(2, 0));
console.log(janken(0, 1));
console.log(janken(1, 1));
console.log(janken(2, 1));
console.log(janken(0, 2));
console.log(janken(1, 2));
console.log(janken(2, 2));

それでは~。


JavaScriptの基礎っぽい物

2018-08-24 13:48:20 | RPGツクールMV
こんにちは。
くろうどです。

今回は、RPGツクールMVをやってる人向けに JavaScript の基礎っぽいソースコードを書いたので、解説したいと思います。


下の横線で囲まれた部分をVScodeにコピペして、拡張子「.js」で保存し、デバッグ実行すると、true や false が何個か表示されると思います。

それでは、解説です。

①/*  */ で囲まれた部分はコメントです。実行されません。

②// の行はコメントです。実行されません。
 
③isShortMonth は関数名です。自由に付けられますが分かりやすくしましょう。
この関数では、引数(ひきすう)で受け取った月(1~12)が短い月(31日ない月)かどうかチェックします。
 
④function(month) は、関数である事を宣言しています。month はこの関数の引数として設定しています。
 
⑤引数とは、関数を呼び出す時に、与える事が出来るデータです。
 
⑥配列とは、連続した変数です。
array[2] のように番号を指定してデータを出し入れ出来ます。
番号は、0 から始まります。
 
変数はツクールにもあるので、説明を省きます。
 
⑦indexOfは配列からデータを検索する関数です。
配列名.indexOf(探す値);
という記述で指定しています。
今回は、array配列に、「2、4、6、9、11」が入っているので、引数monthがそれらの値であれば、それぞれ、「0、1、2、3、4」がresult変数に入ります。
引数monthが他の値であれば、検索しても見つからないので、-1 がresult変数に入ります。
 
⑧if文を使用して、result変数の中身をチェックします。
今回、result変数の中身は「-1、0、1、2、3、4」のどれかが入っています。
単純に、検索で見つかっていたら true 、見つからなかったら false とします。
return でこの関数の終了して、戻り値(もどりち)を返します。
 
⑨テスト実行部分では、test配列にテストしたい値を設定しています。
len変数は、test配列の長さです。今回は、8 (0~7の8個)になります。
 
⑩テストは、for文で実行します。ループさせる処理です。
変数 i (ループカウンタ)が、0~7 の間、{  } 内の処理が実行されます。
 
⑪isShortMonth(test[i]) は、作成したisShortMonth関数を実行しています。
console.log() により、コンソールに結果が表示されます。
今回は、true か false が計8個表示されます。
 
⑫test[i] は、テストに使うtest配列からデータを取り出しています。
変数 i はループカウンタと同じ値を使用します。
 
⑬行末のセミコロン「;」は行末を表すものです。
 
以下がソースコードです。

/*
* これは短い月(31日ない月)かどうかを判断する関数です。
* 引数 month をチェックします。
* 短い月の場合、trueを返します。
* 長い月(31日ある月)の場合、falseを返します。
*/
isShortMonth = function(month) {
    // 短い月は決まっているので配列にデータを入れておきます。
    var array = [2, 4, 6, 9, 11];

    // 配列を indexOf で検索して、結果を変数に入れます。
    // indexOf では見つかった時に、その配列の番号を返します。
    // indexOf では見つからなかった時に、-1 を返します。
    var result = array.indexOf(month);

    // if を使い indexOf の結果をチェックします。
    // チェックして、true または false を返します。
    if (result >= 0) { // 成立する場合
        return true;
    } else { // 成立しない場合
        return false;
    }
};

// テスト実行
// for を使い test配列の中身を1つずつチェックを繰り返します。
// test.length は配列の長さを取得しています。
// for の括弧内の var i=0 は変数 i を宣言し初期値 0 を入れています。
// i < len の条件が成立する間ループします。配列の長さ回数ループします。</span>
// for の { } 内を1回処理すると、i++ が実行されます。i の値が 1増えます。
var test = [5, 2, 1, 11, 13, 0, 'moji', 9];
var len = test.length;
for (var i=0; i < len; i++) {
    // コンソールにテスト結果を表示します。
    console.log(isShortMonth(test[i]));
}

 
ちなみに、今回のソースコードを短く書こうと思ったら、こういう書き方も出来ます。
 
それでは~。
 

ツクツク動画の8番目

2018-06-21 19:37:32 | RPGツクールMV

Twitterで投稿したうちの動画を紹介。

……って、思ったけど、あれから1個しか増えてなかった。

 

 


うちがTwitterに投稿した動画をまとめてみた。

2018-02-18 17:49:22 | RPGツクールMV

Twitterに動画を投稿してみた。

 

 

 

 

 

 

 

 

 

 

 

 

 

今はココまで。

 


バグを減らすために考えておくこと

2017-12-06 11:50:01 | RPGツクールMV
  • はじめに

さて皆さん。
この記事は、「ツクール Advent Calendar 2017 ( https://adventar.org/calendars/2748 )」の12月6日の記事です。
創作関連アドベントカレンダーとの事らしいです。

この記事では、創作ツールとしてRPGツクールMVを取り上げて、その中でもテストについて書きます。

ちなみに、RPGツクールMVのアドベントカレンダーに関しては、( https://adventar.org/calendars/2288 )もありますので、見てください。



  • バグとは?

さて、バグとは何でしょうか?
ココでは、「作者の想定する動作と異なる動作をする事」としておきましょう。
つまり、理想と現実が異なるわけですから、「問題」なわけですね。
「問題」であれば「解決」しましょう。

「問題」とは、理想と現実のギャップの事です。
※ちなみに、某所ではバグの事を「故障」って呼んだりしますね。

それから、この記事では、RPGツクールMVに関しての内容になりますので、コンピュータゲームにおけるバグという事になります。

そして、バグを見つける作業を「テスト」と呼ぶ事にしておきます。

※当然ですが、「想定する動作(理想)」がどういう物なのか、つまり「仕様」は、把握または決めておいてください。

 

  • テスト手法

前述の通り、バグが発生するという事は、ゲームの故障であり問題であるわけですから、なるべく発見して解決しておきたいものです。

バグを発見するためには、多くの場合、ゲームのテストプレイをする事になるでしょう。

では、どのようにテストプレイすれば良いのでしょうか?

闇雲にテストプレイしても時間だけが過ぎて行き、バグが見つけられない可能性があります。
そこで、テスト項目(どのようにテストプレイするのか)という物を考えます。

テスト項目を考える上で押さえておきたいのが、「同値分割」「境界値分析」という考え方です。

例えば、「変数A > 0」かつ「変数A < 5」という条件があるとします。
同値分割だと、「0以下、1以上5未満、5以上」の3つに分かれ、それぞれのグループに含まれる値をテストするという考え方です。
境界値分析だと、条件の境界値である「0、1、4、5」の4つの値をテストするという考え方です。
これを組合せてテスト項目を作ります。


とは言え、これは一番細かい部分のテスト手法なので、ゲームのテストプレイでどこまでやるのか……というのはあります。
ですがまぁ、この記事では、このテスト手法を元に話をします。


  • バグを発見するためのテストプレイ

それでは、実際にゲームを見てみましょう。

村人5人に話しかけてから村長に話しかけたらクリアになるゲームです。

RPGツクールMVの初心者講座に「複数の人から情報を聞かないと先に進まないイベントを作る」というページがあるので、それを元に説明します。
https://tkool.jp/mv/guide/006_005e.html

 



テスト項目は以下です。

  1. ゲーム開始時(話しかけた村人の数→0人)
  2. 村人1人に話しかけた(1人)
  3. 同じ村人に5回話しかけた(増えない)
  4. 村人4人に話しかけた(4人)
  5. 村人5人に話しかけた(5人)
  6. 村人が6人以上いるなら6人に話しかけた(6人)

※上記のそれぞれで村長に話す(5人以上ならクリア)

この場合、村長に話しかけるテストプレイを6回する事になります。

※テスト項目の2番は省略してもいいかもしれません。


  • ゲーム作成段階でバグを減らす

さて、ゲーム作成やプログラミングに慣れてくると、どういう所にバグが潜んでいるかが分かるようになってきます。

前述の村人5人のゲームで考えてみましょう。

このゲームのイベントは、村長と、村人5人以上で作られます。
この時、村人はセリフこそ違えど、話しかけた数のカウント処理は同じです。
それぞれの処理を見てみましょう。

    • 村長

村長に必要なのは、変数(話しかけた村人の数)が 5 以上であるかどうかの条件分岐イベントです。



    • 村人

村人に必要なのは、変数(話しかけた村人の数)を 1 加算する処理です。
同じ村人に話しかけた時には加算しないようにする必要があります。



慣れてくると、これらのイベントを作る時に、前述の6個のテスト項目が頭に浮かびます。
例えば、「同じ村人に2回話しかけたらどうなるんだろうか?」という疑問が浮かぶわけです。
その疑問を元にして、イベントコマンドを見た時に、「同じ村人に2回以上話しかけた時には加算しないようにする」処理を加える事が出来れば、バグを事前に減らせた事になります。

 

  • おわりに

テストは地味で面倒くさい作業ですが、品質を向上させるために必要な作業です。
この記事で書いたように、テストにもやり方があります。
上手にテストをする事で、効率よくバグを発見し、やがては、作成時にバグを減らす事も出来ます。
テストを意識する、つまり、どのようにゲームを動かしたいのかをイメージして作成しましょう。

それでは~。