装備変更スクリプト(質問掲示板

投稿: Material 204926 1 mini 井戸乃博士 投稿:2013/10/21 20:58:21(最新:2013/10/22 20:58:22)
現在、2D RPGを製作しておりまして、カスタムメニューでサブメニューを追加し、そこでプレーヤーキャラの装備だけを変更できるようにしようと考えています。
装備欄は「武器」「盾」「鎧」「兜」「装飾1」・・・というように分かれ、例えば「武器」を選ぶとアイテム欄から武器系統がピックアップされ、その中から選んで装備という、まあ某有名RPGの装備欄のような構成にするつもりです。

一応、スクリプトができたんですが、テスト中、エラーメッセージのようなものが表示されるので、気になっています。
スクリプトはこんな感じです。(例として武器の場合だけを表示します)。

setCustomParamMenuName("サブメニュー")
def onShowCustomParameter()
 case speakWithSelect(4,"装備","魔法","調合材料","もどる", 
    "")
  when 0 #ここから武器選択画面
    case speakWithSelect(6,"武器","盾","体防具","頭防具","装飾1","装飾2",
    "※装備の種類を選んでください。")
    when 0 
    wpn = createArray()
     if getEquipmentIdArray()[0] !=-1
        pushArray(wpn, getValueFromItemParam(getItemParamWithId(getEquipmentIdArray()[0]), getItemViewNameIndex()))
#現在装備している武器があれば、欄の一番上に表示する

    end
    i = 0
#↓問題の箇所1(29行目)
    while i <= getArrayLength(getItemIdArray())
     if getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemTypeIdIndex()) == 1

        pushArray(wpn, getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemViewNameIndex()))
    end
    i = i + 1
#アイテム欄から武器を抽出してリスト化
  end
  pushArray(wpn, "装備しない")
  pushArray(wpn,  "やめる")
#「装備しない」と「やめる」を追加

#ここから一覧の武器を選択したときの処理
 close = 0
 while close == 0
  k = speakWithSelectArray(wpn, "※装備する武器を選んでください。")
  i = 0
  while i <= getArrayLength(getItemIdArray())

#↓問題の箇所2(42行目)
   if wpn[k] ==  getValueFromItemParam(getItemParamWithId(getEquipmentIdArray()[0]), getItemViewNameIndex())

      close = 1
    elsif wpn[k] == "装備しない"
      if getEquipmentIdArray()[0] !=-1
         giveItem(getEquipmentIdArray()[0])
         removeEquipmentWithIndex(0)
      close = 1 
      end
#何も装備しない場合は、装備している武器を外してアイテム欄へ
    
    elsif wpn[k] == getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemViewNameIndex())
      if getEquipmentIdArray()[0] !=-1
         giveItem(getEquipmentIdArray()[0])
         removeEquipmentWithIndex(0)
#既存の装備を外してアイテム欄に移動
      end
         giveEquipment(getItemIdArray()[i])
         removeItemWithIndex(getItemIndexWithId(getItemIdArray()[i]))
#選択したアイテムを装備して、アイテム欄から消去
      else wpn[k] == "やめる"
       close = 1
      end
   i = i + 1
   end
  end

   when 1
#以下、「盾」、「鎧」・・・と同様に続きます。


一応、これで問題なく動作しているようなんですが、
サブメニューで「武器」を選んだときに、
『getValueFromItemParamの第1引数は配列でなければなりません。 line : 29』
さらに武器選択画面で何か選んだときにも、同様に
『getValueFromItemParamの第1引数は配列でなければなりません。 line : 42』が8行くらい表示されます。
どちらも、getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemTypeIdIndex()) というスクリプトを指しているようですが、第1引数は配ではないのか・・・

このメッセージが出ると、どのような不都合があるでしょうか?
また、もし対処方法がおわかりでしたら、ご教示お願いします。

コメントする

コメントするには、ログインする必要があります。

コメント一覧

User icon mini 退会したユーザー(投稿日:2013/10/22 15:58, 履歴)
こういう類の処理は、内部で何が起こっているのか
処理してる本人に吐かせるのが一番楽ですね。
 case speakWithSelect(4,"装備","魔法","調合材料","もどる", 
    "")
  when 0 #ここから武器選択画面
    case speakWithSelect(6,"武器","盾","体防具","頭防具","装飾1","装飾2",
    "※装備の種類を選んでください。")
    when 0 
    wpn = createArray()
     if getEquipmentIdArray()[0] !=-1
        pushArray(wpn, getValueFromItemParam(getItemParamWithId(getEquipmentIdArray()[0]), getItemViewNameIndex()))
#現在装備している武器があれば、欄の一番上に表示する

    end
    i = 0
#↓問題の箇所1(29行目)
    while i < getArrayLength(getItemIdArray()) #変更前: <=
      #テスト用
      test_1 = getItemIdArray()[i]; speak("getItemIdArray()[" + i + "] = " + test_1)
      test_2 = getItemParamWithId(test_1); speak("getItemParamWithId(getItemIdArray()[" + i + "]) = " + test_2)
      test_3 = getValueFromItemParam(test_2, getItemTypeIdIndex())
      speak("getValueFromItemParam(getItemParamWithId(getItemIdArray()[" + i + "]), getItemTypeIdIndex()) = " + test_3)
      #テスト用終わり
     if getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemTypeIdIndex()) == 1

        pushArray(wpn, getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemViewNameIndex()))
    end
    i = i + 1
#アイテム欄から武器を抽出してリスト化
  end
  pushArray(wpn, "装備しない")
  pushArray(wpn,  "やめる")
#「装備しない」と「やめる」を追加

#ここから一覧の武器を選択したときの処理
 close = 0
 while close == 0
  k = speakWithSelectArray(wpn, "※装備する武器を選んでください。")
  i = 0
  while i <= getArrayLength(getItemIdArray())

#↓問題の箇所2(42行目)
   #テスト用
   test_1 = getEquipmentIdArray()[0]; speak("getEquipmentIdArray()[0] = " + test_1)
   test_2 = getItemParamWithId(test_1); speak("getItemParamWithId(getItemIdArray()[0]) = " + test_2)
   test_3 = getValueFromItemParam(test_2, getItemViewNameIndex())
   speak("getValueFromItemParam(getItemParamWithId(getItemIdArray()[0]), getItemViewNameIndex()) = " + test_3)
   #テスト用終わり
   if wpn[k] ==  getValueFromItemParam(getItemParamWithId(getEquipmentIdArray()[0]), getItemViewNameIndex())

      close = 1
    elsif wpn[k] == "装備しない"
      if getEquipmentIdArray()[0] !=-1
         giveItem(getEquipmentIdArray()[0])
         removeEquipmentWithIndex(0)
      close = 1 
      end
#何も装備しない場合は、装備している武器を外してアイテム欄へ
    
    elsif wpn[k] == getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemViewNameIndex())
      if getEquipmentIdArray()[0] !=-1
         giveItem(getEquipmentIdArray()[0])
         removeEquipmentWithIndex(0)
#既存の装備を外してアイテム欄に移動
      end
         giveEquipment(getItemIdArray()[i])
         removeItemWithIndex(getItemIndexWithId(getItemIdArray()[i]))
#選択したアイテムを装備して、アイテム欄から消去
      else wpn[k] == "やめる"
       close = 1
      end
   i = i + 1
   end
  end
 end
end
#コピペ分だけで動かすためにend2つ追加してます

  • 29行目
既に修正してますが元の条件式だと所持数より1回多く処理してしまいます

  • 42行目
武器未装備状態で処理を行うとtest_1の段階でnullが発生してます。
"装備しない"選択時と同じように場合分けしましょー。
Material 204926 1 mini 井戸乃博士(投稿日:2013/10/22 20:26, 履歴)
takumi2310さん、対応してくださって、ありがとうございます!
あーなるほど!ゼロから始まるから、1個減らさないとだめなわけですね・・・納得しました・・・orz
42行目も理解しました。やはり手抜きしてはだめですな(^^;)
早速直してみます!m(_ _)m
Material 204926 1 mini 井戸乃博士(投稿日:2013/10/22 20:58, 履歴)
解決しました!
takumi2310さん、丁寧な対応ありがとうございました!
勉強になりました。m(_ _)m
コメントをくださった、池ちゃんさん、最弱くんさんもありがとうございました。
一応、エラーの解消したスクリプトを載せておきます。
def onShowCustomParameter()
 case speakWithSelect(4,"博士の装備","博士の魔法","調合材料","もどる", 
    "")
  when 0
    case speakWithSelect(6,"武器","盾","体防具","頭防具","装飾1","装飾2",
    "※装備の種類を選んでください。")
    when 0
    wpn = createArray()
     if getEquipmentIdArray()[0] !=-1
         pushArray(wpn, getValueFromItemParam(getItemParamWithId(getEquipmentIdArray()[0]), getItemViewNameIndex()))
    end
    i = 0
    while i < getArrayLength(getItemIdArray())
     if getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemTypeIdIndex()) == 1
        pushArray(wpn, getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemViewNameIndex()))
    end
    i = i + 1
  end
  pushArray(wpn, "装備しない")
  pushArray(wpn,  "やめる")

 close = 0
 while close == 0
  k = speakWithSelectArray(wpn, "※装備する武器を選んでください。")
  i = 0
  while i < getArrayLength(getItemIdArray())
   if getEquipmentIdArray()[0] !=-1
    if wpn[k] ==  getValueFromItemParam(getItemParamWithId(getEquipmentIdArray()[0]), getItemViewNameIndex())
      close = 1
    elsif wpn[k] == "装備しない"
         giveItem(getEquipmentIdArray()[0])
         removeEquipmentWithIndex(0)
      close = 1     
    elsif wpn[k] == getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemViewNameIndex())
         giveItem(getEquipmentIdArray()[0])
         removeEquipmentWithIndex(0)
         giveEquipment(getItemIdArray()[i])
         removeItemWithIndex(getItemIndexWithId(getItemIdArray()[i]))
      else wpn[k] == "やめる"
       close = 1
      end

  else
     if wpn[k] == "装備しない"
      close = 1     
    elsif wpn[k] == getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemViewNameIndex())
         giveEquipment(getItemIdArray()[i])
         removeItemWithIndex(getItemIndexWithId(getItemIdArray()[i]))
    else wpn[k] == "やめる"
       close = 1 
    end
   end
   
   i = i + 1
   end

  end
Human icon mini クソザコ(投稿日:2013/10/21 22:40, 履歴)
問題なく利用できているならそのまま放置でいいと思いますよ。
実際自分のとこでも、エラーガンガンですけど問題はないのでそのままですw

途中で不具合が発見されてもそのときに修復すればいいだけですし。
Material 204926 1 mini 井戸乃博士(投稿日:2013/10/21 23:02, 履歴)
コメントどうもです。
確かに、"end"が多い時のエラーとか放置しても問題ないですしねw
様子見ながら考えます。
       256 mini 池ちゃん(翡翠ヶ池)(投稿日:2013/10/21 21:47, 履歴)
エラー文はここで調べれますよ~あ、今回のは関係なかった。
今回の場合は関数リファレンスを見てどういう関数なのかを見ると改善策が分かるかも。

ちょっと待ってくださいねー今からじっくりスクリプトを見ます~
       256 mini 池ちゃん(翡翠ヶ池)(投稿日:2013/10/21 22:17, 履歴)
ふむふむ

『getValueFromItemParamの第1引数は配列でなければなりません。 line : 29』の意味はそのまんまで第1引数は配列じゃないといけないんです。
ただこの配列はgetItemParamWithId関数で取得する、
アイテムのパラメーターの配列なのです。
・・・ってちゃんとアイテムのパラメーターの配列でしたね・・・。

うーんどういうことなのでしょう?

ちょっとテストをしてみたのですがどれもエラー文が出てきませんでした。
giveItem(431) #風神の剣です(http://rmake.jp/published_items/2160)

ido = getValueFromItemParam(getItemParamWithId(getItemIdArray()[0]), getItemTypeIdIndex())
speak(ido)

haka = getValueFromItemParam(getItemParamWithId(getItemIdArray()[0]), getItemTypeIdIndex()) == 1
speak(haka)

san = getItemParamWithId(getItemIdArray()[0])
speak(san)

うむ、もうちょい考えさせてください。
Material 204926 1 mini 井戸乃博士(投稿日:2013/10/21 23:01, 履歴)
わざわざ調べていただいてかたじけないです。別に急いでおりませんので、何か判明した場合に教えていただければ結構ですよ。
最悪、放置して様子を見ますので・・・