GameMaker 日本語掲示板

自作の関数で問題が発生

1 コメント
views
17 フォロー

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のラベルが全ての要素に適用されているようでした。
配列の使い方が間違っているのでしょうか?
長文失礼しました。正しい値を返すには、どうすればいいでしょうか。教えていただけると幸いです。

すいか
作成: 2024/06/06 (木) 18:21:09
通報 ...
1
すいか 2024/06/07 (金) 07:53:07

_retを構造体の配列にすることで解決しました!