GameMaker初心者です。しばらく詰まったので質問します。
問題箇所は以下です。
get_labels = function(_str)
{
var _labels = string_internal_all(_str, "<", ">");
var _ret = array_create(array_length(_labels), array_create(3, ""));
var _i = 0;
repeat (array_length(_labels))
{
//1: show_debug_message($"{_i} : 0 : {_ret}");
_ret[_i][0] = _labels[_i];
var _internal_text = string_range(_labels[_i], 2, string_length(_labels[_i]) - 1);
var _splited = string_split(_internal_text, ":");
_ret[_i][1] = _splited[0];
_ret[_i][2] = _splited[1];
//2: show_debug_message($"{_i} : 1 : {_ret}");
++_i;
}
//3: show_debug_message($"last : {_ret}");
return _ret;
}
問題はないと思われますが、自作の関数で、_startの文字から_endの文字までを全て返すstring_internal_allと、_start_iから_end_iまでの範囲の文字を返すstring_rangeも以下に置いておきます。
function string_internal_all(_str, _start, _end)
{
var _ret = array_create(string_count("<", _str), "");
var _ret_i = 0;
var _reading = false;
var _is_first = true;
var _loop_i = 1;
repeat (string_length(_str))
{
var _c = string_char_at(_str, _loop_i);
if (_c == _start)
{
_reading = true;
if (_is_first)
{
_is_first = false;
}
else
{
++_ret_i;
}
}
if (_reading) _ret[_ret_i] = string_concat(_ret[_ret_i], _c);
if (_c == _end)
{
_reading = false;
}
++_loop_i;
}
return _ret;
}
function string_range(_str, _start_i, _end_i)
{
var _i = 0;
var _ret = "";
repeat (_end_i - _start_i + 1)
{
_ret = string_concat(_ret, string_char_at(_str, _start_i + _i));
_i++;
}
return _ret;
}
問題箇所のget_labelsメソッドは、"<名前:値>"のような形をラベルとして、"<"から">"までの全体、":"より左の部分、":"より右の部分を全てのラベルに対して配列_retに格納して返します。
get_labels("<選択肢:6>望遠鏡 : <パラ:view_x><パラ:view_y> コマンド?")
などとして実行すると、
[ [ "<選択肢:6>","選択肢","6" ],[ "<パラ:view_x>","パラ","view_x" ],[ "<パラ:view_y>","パラ","view_y" ] ]
のような値が返ってくると思われるのですが、実際は
[ [ "<パラ:view_y>","パラ","view_y" ],[ "<パラ:view_y>","パラ","view_y" ],[ "<パラ:view_y>","パラ","view_y" ] ]
のような値が帰ってきてしまいます。
問題箇所の//2:のところのコメントを外して実行してみると、ループ1回目は選択肢のラベルが、2回目はview_xのラベルが、3回目はview_yのラベルが全ての要素に適用されているようでした。
配列の使い方が間違っているのでしょうか?
長文失礼しました。正しい値を返すには、どうすればいいでしょうか。教えていただけると幸いです。
_retを構造体の配列にすることで解決しました!