装備変更スクリプト(質問掲示板)
投稿:
井戸乃博士
投稿:2013/10/21 20:58:21(最新:2013/10/22 20:58:22)
井戸乃博士
投稿:2013/10/21 20:58:21(最新:2013/10/22 20:58:22)
現在、2D RPGを製作しておりまして、カスタムメニューでサブメニューを追加し、そこでプレーヤーキャラの装備だけを変更できるようにしようと考えています。
装備欄は「武器」「盾」「鎧」「兜」「装飾1」・・・というように分かれ、例えば「武器」を選ぶとアイテム欄から武器系統がピックアップされ、その中から選んで装備という、まあ某有名RPGの装備欄のような構成にするつもりです。
一応、スクリプトができたんですが、テスト中、エラーメッセージのようなものが表示されるので、気になっています。
スクリプトはこんな感じです。(例として武器の場合だけを表示します)。
一応、これで問題なく動作しているようなんですが、
サブメニューで「武器」を選んだときに、
『getValueFromItemParamの第1引数は配列でなければなりません。 line : 29』
さらに武器選択画面で何か選んだときにも、同様に
『getValueFromItemParamの第1引数は配列でなければなりません。 line : 42』が8行くらい表示されます。
どちらも、getValueFromItemParam(getItemParamWithId(getItemIdArray()[i]), getItemTypeIdIndex()) というスクリプトを指しているようですが、第1引数は配ではないのか・・・
このメッセージが出ると、どのような不都合があるでしょうか?
また、もし対処方法がおわかりでしたら、ご教示お願いします。
ツイート
装備欄は「武器」「盾」「鎧」「兜」「装飾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引数は配ではないのか・・・
このメッセージが出ると、どのような不都合があるでしょうか?
また、もし対処方法がおわかりでしたら、ご教示お願いします。
コメントする
コメントするには、ログインする必要があります。
コメント一覧
エラー文はここで調べれますよ~あ、今回のは関係なかった。
今回の場合は関数リファレンスを見てどういう関数なのかを見ると改善策が分かるかも。
ちょっと待ってくださいねー今からじっくりスクリプトを見ます~
今回の場合は関数リファレンスを見てどういう関数なのかを見ると改善策が分かるかも。
ちょっと待ってくださいねー今からじっくりスクリプトを見ます~
ふむふむ
『getValueFromItemParamの第1引数は配列でなければなりません。 line : 29』の意味はそのまんまで第1引数は配列じゃないといけないんです。
ただこの配列はgetItemParamWithId関数で取得する、
アイテムのパラメーターの配列なのです。
・・・ってちゃんとアイテムのパラメーターの配列でしたね・・・。
うーんどういうことなのでしょう?
ちょっとテストをしてみたのですがどれもエラー文が出てきませんでした。
うむ、もうちょい考えさせてください。
『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)
うむ、もうちょい考えさせてください。
処理してる本人に吐かせるのが一番楽ですね。
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が発生してます。"装備しない"選択時と同じように場合分けしましょー。
あーなるほど!ゼロから始まるから、1個減らさないとだめなわけですね・・・納得しました・・・orz
42行目も理解しました。やはり手抜きしてはだめですな(^^;)
早速直してみます!m(_ _)m
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