GameMaker 日本語掲示板

アイテムインベントリにて...

2 コメント
views
17 フォロー

アイテムインベントリを作成しています。
アイテムの選択&使用&使用したアイテムの削除までは出来たのですが、アイテムインベントリにアイテムが何も入ってない時に、Enterキーを押すと「インデックス範囲外」のエラーメッセージが出てしまうので、アイテムインベントリにアイテムが何も入ってない時に、Enterキーを押せないようにしたいのですがどうすればよいでしょうか?

プログラムコード↓
「作成」

function create_item(_name,_desc,_spr,_siyou)constructor
{
	name = _name;//アイテムの名前
	description = _desc;//アイテムの説明
	sprite = _spr;//アイテムの画像(いらなくてもいい)
	siyou = _siyou;//アイテムの使用効果
	
}

global.item_list =
{
	aitem_1 : new create_item("アイテム1","アイテム1だ",spr_aitem_1,	
	function(){test_player.move_speed = 30;
		       array_delete(inv,selected_item,1);
		}),

}

inv = array_create(0);

inv_max = 10;//インベントリ上限値の設定(アイテムが持てる上限値)

selected_item = 0;

「ステップ」


//上ボタン/////////////////////////////////////////////////////////////////////////////////////////
if(keyboard_check_pressed(vk_up)) {
	selected_item--;
if(selected_item < 0) {selected_item = 0}
 show_debug_message($"selected_item={selected_item},inv={inv}");
}

//下ボタン/////////////////////////////////////////////////////////////////////////////////////////
if(keyboard_check_pressed(vk_down)) {
    selected_item++;
if(selected_item >= array_length(inv)) {selected_item = array_length(inv)-1;}
	show_debug_message($"selected_item={selected_item},inv={inv}");
}

//もしアイテムを使用したら///////////////////////////////////////////////////////////////////////////

if keyboard_check_pressed(vk_enter){

	 inv[selected_item].siyou();
	 if selected_item != 0{selected_item -= 1;}//アイテムが消えたら手前のアイテムを選択する(もし一番手前の選択肢ならそのまま)

}

この方の動画を参考にしてプログラムコードを書きました。↓
この方はマウスを使ってアイテムを選択していますが、自分はキーボード操作でアイテムを選択している感じです↓
https://youtu.be/fa26B54JDDk?si=V9-0sJQsZx3A7zuD

ZUN is my dream(19)
作成: 2024/03/03 (日) 17:10:51
通報 ...
1
名前なし 2024/03/06 (水) 15:44:56 修正

エンターキーを押したときに、配列の変数「inv」内、現在のアイテム欄のカーソル位置ID(順番)を参照しようとしているが、配列が空だと参照しようがないのでエラーになっている状態です。

配列の範囲外を参照しないようにチェックするとエラーが出ないようにできます。

//もしアイテムを使用したら///////////////////////////////////////////////////////////////////////////

if keyboard_check_pressed(vk_enter){

	 inv[selected_item].siyou();

「inv[selected_item]」で配列の値を参照しているので、その前のif文で、配列が空だったら処理しないように条件文を追加します。

//もしアイテムを使用したら///////////////////////////////////////////////////////////////////////////

if( array_length(inv) > 0 && keyboard_check_pressed(vk_enter) ) {

配列変数invの配列要素数が0(アイテムがない状態)より大きい かつ キーボードのエンターキーが押されたら
という条件にすれば配列要素数1以上の時に、エンターキーの処理を実行する状態になります。

「&&」は&&で両方の条件を満たしたときにtrueになります。

試してみてください。

2
ZUN is my dream(19) 2024/03/22 (金) 03:30:36 >> 1

す、すごい...。&&については初めて使いました...。
解決しました。ありがとうございます。