[解決済み]同名の別アクターを仲間にする方法

andead04/総督
記事: 9
登録日時: 2018年10月09日(火) 18:42

[解決済み]同名の別アクターを仲間にする方法

投稿記事by andead04/総督 » 2018年11月15日(木) 21:31

こんばんは。お世話になります。

今回、モンスターを仲間にして戦うドラクエのようなゲームを制作しているのですが、この際、同じ名前の別の個体を仲間にする方法についてお伺いいたします。

 具体的には、あるモンスター、今回はスライムとしますが、スライムを仲間にした際アクターの名前と画像と職業をスライムのモノに差し替えることでそれを達成したいのですが、この差し替えるアクターのIDを「まだ使っていないID」に指定したいのです。

001:スライム
002:ドラキー
003:未使用←まだ使っていないので、このアクターの名前、ピクチャ、職業を差し替えるように指定したい。

これによって、999体(登録できるアクターIDの最大)まで仲間が増やせることになります。
また、特定のモンスターを「逃がした」場合、次に仲間にしたモンスターを登録するIDをその逃がしたモンスターが使用していたIDに指定することは可能でしょうか。

解決につながる方法、またスクリプト等、ご存じでしたらお教え願います。
最後に編集したユーザー andead04/総督 on 2018年11月19日(月) 19:22 [ 編集 1 回目 ]

アバター
ベルファーレ長田(゜∀゜)
記事: 26
登録日時: 2017年9月08日(金) 13:22
お住まい: VIPツクールスレ
連絡を取る:

Re: 同名の別アクターを仲間にする方法

投稿記事by ベルファーレ長田(゜∀゜) » 2018年11月16日(金) 07:47

> andead04さん

どうも。
空きアクターIDを管理する配列を用いて実現できると思います。
下記のスクリプトを組んでみました。
スクリプト内の下記文字を、下記の通りに変数番号を設定して利用してください。
●:空きアクターID一覧配列 格納用 変数番号
▲:空きアクターID 取り出し先 変数番号
■:空きアクターID一覧追加 変数番号

コード: 全て選択

// 空きアクターID 一覧初期化
var array = new Array();
for( var i = 1; i <= 999; i++ ) {
    array.push( i );
}
$gameVariables.setValue( ●, array );

コード: 全て選択

// 空きアクターID 取り出し
var array = $gameVariables.value( ● );
if( array == null || array.length == 0 ) {
    $gameVariables.setValue( ▲, 0 );
} else {
    $gameVariables.setValue( ▲, array[0] );
    array.shift();
}

コード: 全て選択

// 空きアクターID 一覧追加
var array = $gameVariables.value( ● );
var target = $gameVariables.value( ■ );
for( var i = 0; i < array.length; i++ ) {
    if( target == array[i])
        break;
    if( target < array[i] ) {
        array.splice( i, 0, target );
        break;
    }
}


ゲーム開始時に一覧初期化スクリプトを実行しておきます。

モンスターを仲間にする際に、空きアクターID 取り出しスクリプトを実行し、アクターの名前等を変更します。
なお、アクターIDに空きが無い場合は0が返却されるので、条件分岐等で対応してください。

モンスターと別れる際には、対象のアクターIDを変数■に格納して、空きアクターID 一覧追加スクリプトを実行します。

という感じでとりあえず実現できそうな気がします。
----------------------------------------------------------------
◆名前
ベルファーレ長田(゜∀゜)◆AHYA/HaiA.
◆肩書
スーパーツクラー
◆Twitter
https://twitter.com/velfare_nagata
----------------------------------------------------------------
faida
記事: 210
登録日時: 2015年12月17日(木) 16:44

Re: 同名の別アクターを仲間にする方法

投稿記事by faida » 2018年11月16日(金) 08:48

ウサギマスクの隠れ家様の「アクター量産システム」はどうでしょう?

>ベルファーレ長田(゜∀゜)様
お見受けしたところMV用のスクリプトのようですが。
VXAce風に翻訳するとこんな感じですかね。

コード: 全て選択

// 空きアクターID 一覧初期化
array = []
for i in 1..999
 array.push(i) if $data_actors[i].name.empty?
end
$game_variables[●] = array

コード: 全て選択

// 空きアクターID 取り出し
array = $game_variables[●]
if !array || array.size == 0
 $game_variables[▲] = 0
else
 $game_variables[▲] = array.shift
end

コード: 全て選択

// 空きアクターID 一覧追加
array = $game_variables[●]
target = $game_variables[■]
array.push(target)
$game_variables[●] = array.uniq.sort
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
アバター
ベルファーレ長田(゜∀゜)
記事: 26
登録日時: 2017年9月08日(金) 13:22
お住まい: VIPツクールスレ
連絡を取る:

Re: 同名の別アクターを仲間にする方法

投稿記事by ベルファーレ長田(゜∀゜) » 2018年11月16日(金) 09:16

大変失礼いたしました!
YXACEのトピックでしたね、私が提示したのはMVのスクリプトでした。

> faida さん
どうも、指摘&翻訳ありがとうございます!
----------------------------------------------------------------
◆名前
ベルファーレ長田(゜∀゜)◆AHYA/HaiA.
◆肩書
スーパーツクラー
◆Twitter
https://twitter.com/velfare_nagata
----------------------------------------------------------------
奈々(なな)
記事: 68
登録日時: 2016年11月06日(日) 16:57

Re: 同名の別アクターを仲間にする方法

投稿記事by 奈々(なな) » 2018年11月16日(金) 10:22

質問の「未使用のアクターIDを検出する」に関してだけ言えば
そんなに複雑に考えなくて良いのではないですかね。

最初に、アクターの名前を全て「未使用」にします。
また逃した場合も名前を「未使用」に変更します。
後はイベントなりスクリプトなりで
名前が未使用のアクターを探せば良いかと思います。

(別に名前に限らず、二つ名でもクラスを変更でも良いです。
名前を自由につけられるようにするなら、名前以外にした方が安全です)

コードについてはうろ覚えで申し訳ないですが
(多分)以下のスクリプトをイベントに貼れば
変数1に未使用の最も小さいアクターIDを取得できるかと思います。

$game_actors.each{|actor|
if actor.name == "未使用"
$game_variables[1] = actor.id
break
end
}
------------------------------------------------------------------------------------
へぷたなすくろーる
http://heptanas.mamagoto.com/

VXAceのスクリプト素材及びイベント講座などをやっています。
------------------------------------------------------------------------------------
andead04/総督
記事: 9
登録日時: 2018年10月09日(火) 18:42

Re: 同名の別アクターを仲間にする方法

投稿記事by andead04/総督 » 2018年11月16日(金) 11:09

> faida 様
> 奈々様
> ベルファーレ長田(゜∀゜)様

 お返事いただけて幸いです。ありがとうございます。
お三方とも、恐らく未使用のアクターIDを変数に代入して、その変数のアクターの名前などを変更して仲間にするというアプローチを目指しているものと理解しているのですが(スクリプトに疎いうえツク―ルの初心者でもあるので的外れでしたら申し訳ありません)、お恥ずかしながら「変数で指定されたアクターIDを持つアクターを仲間にする」方法がわかりません。
 重ねてお願いしますが、この方法についてもご教授頂ければと思います。
faida
記事: 210
登録日時: 2015年12月17日(木) 16:44

Re: 同名の別アクターを仲間にする方法

投稿記事by faida » 2018年11月16日(金) 22:39

指定した変数のアクターを加えるのは

コード: 全て選択

$game_party.add_actor($game_variables[n]) # nは変数ID
ですね。同様に名前変更は

コード: 全て選択

$game_actors[$game_variables[n]].name = "名前"
となります。
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
andead04/総督
記事: 9
登録日時: 2018年10月09日(火) 18:42

Re: 同名の別アクターを仲間にする方法

投稿記事by andead04/総督 » 2018年11月19日(月) 19:21

>faida様

大変ありがとうございます。返信遅れまして申し訳ありません。
これにより想定していた動作が完璧に再現されましたので解決済みとさせていただきます。
しかし、もしこの返信にお気づきであれば最後に「指定した変数のアクターの顔グラフィック変更」「指定した変数のアクターの職業を変更」の方法をお願いいたします。もしくは、私が自力でそのようなコードを書けるように勉強するための教材となりうるサイトでも構いません。
どうかよろしくお願いいたします。
faida
記事: 210
登録日時: 2015年12月17日(木) 16:44

Re: [解決済み]同名の別アクターを仲間にする方法

投稿記事by faida » 2018年11月20日(火) 19:56

イベントコマンドでよく使うスクリプトは、基本的には「何/誰の(に)」「何をどうする」という二つから
成り立っています。
andead04/総督さんの「指定した変数のIDのアクターの顔グラフィック変更/職業を変更」も、
「指定した変数のIDのアクターの」「顔グラフィック変更/職業を変更」という二つから成り立っていますよね。

で、一個前の返信で「指定した変数のIDのアクターの」という部分は既に書いています。

コード: 全て選択

$game_actors[$game_variables[n]]
ですね。IDではなく、パーティ内の順序でアクセスする方法もあり、それは

コード: 全て選択

$game_party.members[$game_variables[n]] # ただし1番目を0とする
となります。

そして、後半の「何をどうする」なんですが、
基本的にイベントコマンドにある処理というのは、スクリプトエディタの「Game_Interpreter」というところに
入っています。
イベントコマンド名でGame_Interpreterを検索すると、大抵のイベントコマンドは「スクリプト」で書いたら
どうなるかというのが分かります。(一部例外があります)
「アクターのグラフィック変更」を見ると、グラフィックを変更するコマンドというのが

コード: 全て選択

.set_graphic(@params[1], @params[2], @params[3], @params[4])
これっぽいな、というのが分かります。
そこで、「set_graphic」を全体検索(ctrl+shift+F)してみると、これが前から順に
「歩行グラフィックファイル名、歩行グラフィックインデックス、顔グラフィックファイル名、顔グラインデックス」
であることが分かります。
なんと、顔グラフィックを単体で変える方法は(上級者向けの方法を除けば)用意されていません。
なので、歩行グラフィックをそのままに、顔グラフィックを変えるコマンドを書きます。

コード: 全て選択

actor = $game_actors[$game_variables[n]]
character_name = actor.character_name
character_index = actor.character_index
face_name = "ファイル名"
face_index = インデックス(0~)
actor.set_graphic(character_name, character_index, face_name, face_index)
なんとなくつかめたでしょうか。

一方の「職業の変更」ですが、これは簡単です。

コード: 全て選択

actor = $game_actors[$game_variables[n]]
actor.change_class(クラスID)
VXAceでは職業ごとにレベルが管理されていますが、まあ用途的に特に問題ないでしょうから何もしません。

こんな感じでどうでしょうか。
残念ながら参考サイト様は分かりません。何分スクリプトエディタを見て勉強したもので……。
何か不明点等ありましたら遠慮なくどうぞ。
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。

“VX / Ace:質問” へ戻る