アイテム管理(装備)
アイテム管理(装備)
TGは古いのでtyrano.pluginに置換してください。
レイヤーが9になっています。
追記
このスクリプトをはじめる前に ティラノスクリプト の基本のタグ、配列、二次元配列についておよそ学習を終えている事が条件です。
↓このスクリプトの意味がわかることが前提です↓
詳細をみる
@layopt layer=0 visible=true
[eval exp="f.hairetu=[]"]
[eval exp="f.hairetu=['主人公名',5,20,3,'あ','い','う','え','お'] "]
[eval exp="tf.i = 0"]
[eval exp="tf.y=200"]
[eval exp="tf.y_px=0"]
* repeat
[ptext layer=0 text="&f.hairetu[tf.i]" y="&tf.y + 50 * tf.y_px" x="200" visible=true coler=snow]
[eval exp="tf.i += 1"]
[eval exp="tf.y_px +=1"]
;三行まで描きます
@jump target=repeat cond ="tf.i < 4"
;y位置を初期化
[eval exp="tf.y_px=0"]
* repeat2
[ptext layer=0 text="&f.hairetu[tf.i]" y="&tf.y + 50 * tf.y_px" x="300" visible=true coler=snow]
[eval exp="tf.i += 1"]
[eval exp="tf.y_px +=1"]
;4行目から8行目まで描きます
@jump target=repeat2 cond ="tf.i < 9"
tyrano.plugin.kag.ftag.startTag はタグをjsで表記したものです。{}内はパラメータです。
}
1.装備中アイテムの表示例
配列を2種類(装備品:武器の[名前、値段、効果値]などを扱う配列と、装備中のアイテムを扱う配列)設定し、エンティティを利用して装備中のアイテムを表示する方法です。
スクリプトサンプル
;◆◆変数・配列設定◆◆
[iscript]
//配列f.list_bukiを設定["0名前","1値段","2効果値"];
f.list_buki = [];
f.list_buki[0] = ["なし",0,0]; //各設定。[]内数字が武器IDを兼ねます
f.list_buki[1] = ["はりせん",10,1];
f.chara_soubi = [1]; //装備中のアイテム配列を設定。[武器ID]を変えるとそのIDの武器を装備できます
[endscript]
;◆◆動作◆◆
;↓メッセージレイヤが被らないように、位置を下部に変更
[position left=1 width=640 height=150 top=330 page=fore]
;↓装備表示に使うレイヤーをアクティブに
[layopt layer=7 visible=true]
[layopt layer=8 visible=true]
;↓"装備"と装備箇所名を表示
[ptext text="装備" layer=7 size=15 x=50 y=10 color=white bold=bold]
[ptext text="右手:" layer=7 size=15 x=50 y=40 color=white bold=bold]
;↓装備品名を表示
[ptext text=&f.list_buki[f.chara_soubi[0]][0] layer=8 size=15 x=100 y=40 color=white bold=bold]
■ 実行結果画面(動作確認:ティラノスクリプトVer3.30)
2.所持品リストを開き、アイテムを選んで装備する例(武器のみ)
装備品の名前や性質、装備中アイテム、所持品それぞれに配列を設定し、装備表示マクロを作成し、装備を変更したり外す部分はサブルーチンを利用する方法です。
配列要素の削除にはspliceメソッド、配列要素の重複チェックにはjQueryの$.inArrayメソッドを利用しています。
スクリプトサンプル
※ 装備時のステータス変化などの処理は省略しています。ご利用の際は必要に応じて追加してください。
※ このコードには改善したい点があります。
具体的には特に「1.ループ中のリンクタグからカウンタ変数を利用した処理」「2.配列要素の重複チェック周辺の処理」をもっとスッキリ書く方法を募集します。
分かる方は追記やワンダーコレクション内「テイラノスクリプト 制作テクニックwikiコミュニティ」などでお知らせいただけると嬉しいです。
;◆◆変数・配列設定◆◆
[iscript]
//配列f.list_bukiを設定["0名前","1値段","2効果値"];
f.list_buki = [];
f.list_buki[0] = ["なし",0,0]; //各設定。[]内数字が武器IDを兼ねます
f.list_buki[1] = ["めん棒",10,1];
f.list_buki[2] = ["果物ナイフ",50,3];
f.list_buki[3] = ["ソード",200,5];
f.chara_soubi = [0]; //装備中のアイテム配列を設定。[武器ID]を変えるとそのIDの武器を装備できます
f.chara_shoji_buki = []; //f.chara_shoji_bukiは配列である旨を宣言
f.chara_shoji_buki[0] = [1,1]; //武器ID,個数
f.chara_shoji_buki[1] = [2,2]; //武器ID,個数
f.chara_shoji_buki[2] = [3,1]; //武器ID,個数
[endscript]
;◆◆マクロ設定◆◆
;◆↓装備表示:固定表示部分をレイヤー7に表示するマクロ
[macro name=draw_fixed_part_soubi]
;↓装備表示に使うレイヤーをアクティブに
[layopt layer=7 visible=true]
[layopt layer=8 visible=true]
;↓"装備"と装備箇所名を表示
[ptext text="装備" layer=7 size=15 x=50 y=10 color=white bold=bold]
[ptext text="右手:" layer=7 size=15 x=50 y=40 color=white bold=bold]
[glink target=*open_shojihin text="変更" exp="f.shojihin_type='buki'" size=13 x=200 y=35 color=blue]
[if exp="f.chara_soubi[0]!=0"]
[glink target=*off_soubi text="外す" exp="f.soubi_type='buki'" size=13 x=300 y=35 color=gray]
[endif]
[endmacro]
;◆↓装備表示:可変表示部分をレイヤー8に表示するマクロ
[macro name=draw_variable_part_soubi]
[freeimage layer = 8]
[ptext text=&f.list_buki[f.chara_soubi[0]][0] layer=8 size=15 x=100 y=40 color=white bold=bold]
[endmacro]
;◆◆動作◆◆
;↓メッセージレイヤが被らないように、位置を下部に変更
[position left=1 width=640 height=150 top=330 page=fore]
*open_soubi
[freeimage layer = 9]
;↓"装備"など固定表示部分を表示するマクロを呼び出します
[draw_fixed_part_soubi]
;↓装備品名称など可変部分を表示するマクロを呼び出します
[draw_variable_part_soubi]
[s]
;◆◆サブルーチン◆◆
;◆↓装備の「変更」ボタンが押されたら、所持品一覧をレイヤー9に表示します
*open_shojihin
[layopt layer=9 visible=true]
[iscript]
l = f.chara_shoji_buki.length; //所持武器の種類数計算
TG.kag.ftag.startTag("ptext",{text:"所持品一覧:武器",layer:9,size:15,x:100,y:150,color:"white",bold:"bold"});
for(var i = 0; i < l ; i++){ //所持武器の種類数分繰り返して表示します
//↓所持品(武器)表示
TG.kag.ftag.startTag("ptext",{text:f.list_buki[f.chara_shoji_buki[i][0]][0],layer:9,size:15,x:100,y:200+50*i,color:"white",bold:"bold"});
TG.kag.ftag.startTag("ptext",{text:f.chara_shoji_buki[i][1]+"個",layer:9,size:15,x:200,y:200+50*i,color:"white",bold:"bold"});
f.target_select_soubi = "*select_soubi" + i; //↓の「装備する」ボタンのジャンプ先を設定
TG.kag.ftag.startTag("glink",{text:"装備する",target:f.target_select_soubi,exp:"f.soubi_type='buki'",size:13,x:250,y:190+50*i,color:"blue"});
}
[endscript]
[glink target=*open_soubi text="閉" size=12 x=250 y=143 color=gray]
[s]
;◆↓「装備する」ボタンが押されたら、所持品リストの何番目の装備を選択したかを変数に代入(所持品の最大種類数がN個になれば*select_soubiNまで増減が必要)
;(種類数が多い場合にコードが長々してしまうのを解決したい。分かる方は追記やワンダーコレクション内「テイラノスクリプト 制作テクニックwikiコミュニティ」などでお知らせいただけると嬉しいです)
*select_soubi0
[eval exp="f.selected_soubi = 0"]
@jump target=*select_soubi
*select_soubi1
[eval exp="f.selected_soubi = 1"]
@jump target=*select_soubi
*select_soubi2
[eval exp="f.selected_soubi = 2"]
@jump target=*select_soubi
;◆↓装備中のアイテムを所持品に戻す処理(重複チェック含む)・選択した装備を装備する処理など
;(この処理もスッキリ書きたい!分かる方は追記やワンダーコレクション内「テイラノスクリプト 制作テクニックwikiコミュニティ」などでお知らせいただけると嬉しいです)
*select_soubi
[iscript]
f.off_soubi = f.chara_soubi[0]; //装備していたアイテムIDを変数f.off_soubiにコピー
f.chara_soubi[0]=f.chara_shoji_buki[f.selected_soubi][0]; //選択した装備IDを装備中のアイテム配列に代入
f.chara_shoji_buki[f.selected_soubi][1] = f.chara_shoji_buki[f.selected_soubi][1] - 1; //選択した装備の個数を所持品リストから一つ減らす
if (f.chara_shoji_buki[f.selected_soubi][1] == 0){ //選択した装備が所持品リストで0個になれば
f.chara_shoji_buki.splice(f.selected_soubi, 1);//選択した装備を所持品リストから削除
}
if (f.off_soubi != 0){ //装備を外したアイテムが「なし」以外なら
tf.shoji_buki_id = [];
for (i = 0, l = f.chara_shoji_buki.length; i < l ; i++){
tf.shoji_buki_id[i] = f.chara_shoji_buki[i][0]; //所持品リストのアイテムIDだけを一時変数(配列)に格納
}
if($.inArray(f.off_soubi, tf.shoji_buki_id) >= 0){ ///装備を外したアイテムが所持品リストにあるかどうか調査
f.chara_shoji_buki[$.inArray(f.off_soubi, tf.shoji_buki_id)][1]++; //所持品リストにあれば個数を1加算
}else{f.chara_shoji_buki.push([f.off_soubi,1]);} //なければ装備を外したアイテムを所持品リストに追加
}
[endscript]
@jump target=*open_soubi
//↓◆装備を「外す」ボタンが押されたら、装備「なし」の装備IDを代入
*off_soubi
[iscript]
f.off_soubi = f.chara_soubi[0]; //装備していたアイテムIDを変数f.off_soubiにコピー
tf.shoji_buki_id = [];
for (i = 0, l = f.chara_shoji_buki.length; i < l ; i++){
tf.shoji_buki_id[i] = f.chara_shoji_buki[i][0]; //所持品リストのアイテムIDだけを一時変数(配列)に格納
}
if($.inArray(f.off_soubi, tf.shoji_buki_id) >= 0){ ///装備を外したアイテムが所持品リストにあるかどうか調査
f.chara_shoji_buki[$.inArray(f.off_soubi, tf.shoji_buki_id)][1]++; //所持品リストにあれば個数を1加算
}else{f.chara_shoji_buki.push([f.off_soubi,1]);} //なければ装備を外したアイテムを所持品リストに追加
f.chara_soubi[0] = 0; //装備中アイテムIDに「なし」のIDを代入
[endscript]
@jump target=*open_soubi
■ 実行結果画面(動作確認:ティラノスクリプトVer3.30)
↓「変更」を押すと「所持品一覧」が表示される
↓「果物ナイフ」横の「装備する」を押すと、装備される
↓「めん棒」に装備を変更すると、果物ナイフは所持品一覧に戻る
3.所持品リストを開き、アイテムを選んで装備する例(武器と盾)
2.に盾の処理を追加した例です。鎧など他の装備も同様に追加できます。
スクリプトサンプル
※ 装備時のステータス変化などの処理は省略しています。ご利用の際は必要に応じて追加してください。
※ このコードには改善したい点があります。
具体的には特に「1.ループ中のリンクタグからカウンタ変数を利用した処理」「2.配列要素の重複チェック周辺の処理」をもっとスッキリ書く方法を募集します。
分かる方は追記やワンダーコレクション内「テイラノスクリプト 制作テクニックwikiコミュニティ」などでお知らせいただけると嬉しいです。
;◆◆変数・配列設定◆◆
[iscript]
//配列f.list_bukiを設定["0名前","1値段","2効果値"];
f.list_buki = [];
f.list_buki[0] = ["なし",0,0]; //各設定。[]内数字が武器IDを兼ねます
f.list_buki[1] = ["めん棒",10,1];
f.list_buki[2] = ["果物ナイフ",50,3];
f.list_buki[3] = ["ソード",200,5];
//配列f.list_tateを設定["0名前","1値段","2効果値"];
f.list_tate = [];
f.list_tate[0] = ["なし",0,0]; //各設定。[]内数字が盾IDを兼ねます
f.list_tate[1] = ["鍋のフタ",1,1];
f.list_tate[2] = ["木の盾",50,3];
f.list_tate[3] = ["ブリキの盾",100,4];
f.chara_soubi = [0,0]; //装備中のアイテム配列を設定。[]内の数字[武器ID,盾ID]を変えるとそれぞれ装備できます
f.chara_shoji_buki = []; //f.chara_shoji_bukiは配列である旨を宣言
f.chara_shoji_buki[0] = [1,1]; //武器ID,個数
f.chara_shoji_buki[1] = [2,2]; //武器ID,個数
f.chara_shoji_buki[2] = [3,1]; //武器ID,個数
f.chara_shoji_tate = []; //f.chara_shoji_tateは配列である旨を宣言
f.chara_shoji_tate[0] = [1,2]; //盾ID,個数
f.chara_shoji_tate[1] = [3,1]; //盾ID,個数
f.chara_shoji_tate[2] = [2,1]; //盾ID,個数
[endscript]
;◆◆マクロ設定◆◆
;◆↓装備表示:固定表示部分をレイヤー7に表示するマクロ
[macro name=draw_fixed_part_soubi]
;↓装備表示に使うレイヤーをアクティブに
[layopt layer=7 visible=true]
[layopt layer=8 visible=true]
;↓"装備"と装備箇所名を表示
[ptext text="装備" layer=7 size=15 x=50 y=10 color=white bold=bold]
[ptext text="右手:" layer=7 size=15 x=50 y=40 color=white bold=bold]
[glink target=*open_shojihin text="変更" exp="f.shojihin_type='buki'" size=13 x=200 y=35 color=blue]
[if exp="f.chara_soubi[0]!=0"]
[glink target=*off_soubi text="外す" exp="f.soubi_type='buki'" size=13 x=300 y=35 color=gray]
[endif]
[ptext text="左手:" layer=7 size=15 x=50 y=80 color=white bold=bold]
[glink target=*open_shojihin text="変更" exp="f.shojihin_type='tate'" size=13 x=200 y=75 color=blue]
[if exp="f.chara_soubi[1]!=0"]
[glink target=*off_soubi text="外す" exp="f.soubi_type='tate'" size=13 x=300 y=75 color=gray]
[endif]
[endmacro]
;◆↓装備表示:可変表示部分をレイヤー8に表示するマクロ
[macro name=draw_variable_part_soubi]
[freeimage layer = 8]
[ptext text=&f.list_buki[f.chara_soubi[0]][0] layer=8 size=15 x=100 y=40 color=white bold=bold]
[ptext text=&f.list_tate[f.chara_soubi[1]][0] layer=8 size=15 x=100 y=80 color=white bold=bold]
[endmacro]
;◆◆動作◆◆
;↓メッセージレイヤが被らないように、位置を下部に変更
[position left=1 width=640 height=150 top=330 page=fore]
*open_soubi
[freeimage layer = 9]
;↓"装備"など固定表示部分を表示するマクロを呼び出します
[draw_fixed_part_soubi]
;↓装備品名称など可変部分を表示するマクロを呼び出します
[draw_variable_part_soubi]
[s]
;◆◆サブルーチン◆◆
;◆↓装備の「変更」ボタンが押されたら、所持品一覧をレイヤー9に表示します
*open_shojihin
[layopt layer=9 visible=true]
[iscript]
switch (f.shojihin_type){
case 'buki':
l = f.chara_shoji_buki.length; //所持武器の種類数計算
TG.kag.ftag.startTag("ptext",{text:"所持品一覧:武器",layer:9,size:15,x:100,y:150,color:"white",bold:"bold"});
for(var i = 0; i < l ; i++){ //所持武器の種類数分繰り返して表示します
//↓所持品(武器)表示
TG.kag.ftag.startTag("ptext",{text:f.list_buki[f.chara_shoji_buki[i][0]][0],layer:9,size:15,x:100,y:200+50*i,color:"white",bold:"bold"});
TG.kag.ftag.startTag("ptext",{text:f.chara_shoji_buki[i][1]+"個",layer:9,size:15,x:200,y:200+50*i,color:"white",bold:"bold"});
f.target_select_soubi = "*select_soubi" + i; //↓の「装備する」ボタンのジャンプ先を設定
TG.kag.ftag.startTag("glink",{text:"装備する",target:f.target_select_soubi,exp:"f.soubi_type='buki'",size:13,x:250,y:190+50*i,color:"blue"});
}
break;
case 'tate': //鎧など他の装備は必要ならcase文で追加します
l = f.chara_shoji_tate.length; //所持盾の種類数計算
TG.kag.ftag.startTag("ptext",{text:"所持品一覧:盾",layer:9,size:15,x:100,y:150,color:"white",bold:"bold"});
for(var i = 0; i < l ; i++){ //所持盾の種類数分繰り返して表示します
//↓所持品(盾)表示
TG.kag.ftag.startTag("ptext",{text:f.list_tate[f.chara_shoji_tate[i][0]][0],layer:9,size:15,x:100,y:200+50*i,color:"white",bold:"bold"});
TG.kag.ftag.startTag("ptext",{text:f.chara_shoji_tate[i][1]+"個",layer:9,size:15,x:200,y:200+50*i,color:"white",bold:"bold"});
f.target_select_soubi = "*select_soubi" + i; //↓の「装備する」ボタンのジャンプ先を設定
TG.kag.ftag.startTag("glink",{text:"装備する",target:f.target_select_soubi,exp:"f.soubi_type='tate'",size:13,x:250,y:190+50*i,color:"blue"});
}
break;
}
[endscript]
[glink target=*open_soubi text="閉" size=12 x=250 y=143 color=gray]
[s]
;◆↓「装備する」ボタンが押されたら、所持品リストの何番目の装備を選択したかを変数に代入(所持品の最大種類数がN個になれば*select_soubiNまで増減が必要)
;(種類数が多い場合にコードが長々してしまうのを解決したい。分かる方は追記やワンダーコレクション内Wikiコミュなどでお知らせいただけると嬉しいです)
*select_soubi0
[eval exp="f.selected_soubi = 0"]
@jump target=*select_soubi
*select_soubi1
[eval exp="f.selected_soubi = 1"]
@jump target=*select_soubi
*select_soubi2
[eval exp="f.selected_soubi = 2"]
@jump target=*select_soubi
;◆↓装備中のアイテムを所持品に戻す処理(重複チェック含む)・選択した装備を装備する処理など
;(この処理もスッキリ書きたい!分かる方は追記やワンダーコレクション内Wikiコミュなどでお知らせいただけると嬉しいです)
*select_soubi
[iscript]
switch (f.soubi_type){
case 'buki':
f.off_soubi = f.chara_soubi[0]; //装備していたアイテムIDを変数f.off_soubiにコピー
f.chara_soubi[0]=f.chara_shoji_buki[f.selected_soubi][0]; //選択した装備IDを装備中のアイテム配列に代入
f.chara_shoji_buki[f.selected_soubi][1] = f.chara_shoji_buki[f.selected_soubi][1] - 1; //選択した装備の個数を所持品リストから一つ減らす
if (f.chara_shoji_buki[f.selected_soubi][1] == 0){ //選択した装備が所持品リストで0個になれば
f.chara_shoji_buki.splice(f.selected_soubi, 1);//選択した装備を所持品リストから削除
}
if (f.off_soubi != 0){ //装備を外したアイテムが「なし」以外なら
tf.shoji_buki_id = [];
for (i = 0, l = f.chara_shoji_buki.length; i < l ; i++){
tf.shoji_buki_id[i] = f.chara_shoji_buki[i][0]; //所持品リストのアイテムIDだけを一時変数(配列)に格納
}
if($.inArray(f.off_soubi, tf.shoji_buki_id) >= 0){ ///装備を外したアイテムが所持品リストにあるかどうか調査
f.chara_shoji_buki[$.inArray(f.off_soubi, tf.shoji_buki_id)][1]++; //所持品リストにあれば個数を1加算
}else{f.chara_shoji_buki.push([f.off_soubi,1]);} //なければ装備を外したアイテムを所持品リストに追加
}
break;
case 'tate':
f.off_soubi = f.chara_soubi[1]; //装備していたアイテムIDを変数f.off_soubiにコピー
f.chara_soubi[1]=f.chara_shoji_tate[f.selected_soubi][0]; //選択した装備IDを装備中のアイテム配列に代入
f.chara_shoji_tate[f.selected_soubi][1] = f.chara_shoji_tate[f.selected_soubi][1] - 1; //選択した装備の個数を所持品リストから一つ減らす
if (f.chara_shoji_tate[f.selected_soubi][1] == 0){ //選択した装備が所持品リストで0個になれば
f.chara_shoji_tate.splice(f.selected_soubi, 1);//選択した装備を所持品リストから削除
}
if (f.off_soubi != 0){ //装備を外したアイテムが「なし」以外なら
tf.shoji_tate_id = [];
for (i = 0, l = f.chara_shoji_tate.length; i < l ; i++){
tf.shoji_tate_id[i] = f.chara_shoji_tate[i][0]; //所持品リストのアイテムIDだけを一時変数(配列)に格納
}
if($.inArray(f.off_soubi, tf.shoji_tate_id) >= 0){ ///装備を外したアイテムが所持品リストにあるかどうか調査
f.chara_shoji_tate[$.inArray(f.off_soubi, tf.shoji_tate_id)][1]++; //所持品リストにあれば個数を1加算
}else{f.chara_shoji_tate.push([f.off_soubi,1]);} //なければ装備を外したアイテムを所持品リストに追加
}
}
[endscript]
@jump target=*open_soubi
//↓◆装備を「外す」ボタンが押されたら、装備「なし」の装備IDを代入
*off_soubi
[iscript]
switch (f.soubi_type){
case 'buki':
f.off_soubi = f.chara_soubi[0]; //装備していたアイテムIDを変数f.off_soubiにコピー
tf.shoji_buki_id = [];
for (i = 0, l = f.chara_shoji_buki.length; i < l ; i++){
tf.shoji_buki_id[i] = f.chara_shoji_buki[i][0]; //所持品リストのアイテムIDだけを一時変数(配列)に格納
}
if($.inArray(f.off_soubi, tf.shoji_buki_id) >= 0){ ///装備を外したアイテムが所持品リストにあるかどうか調査
f.chara_shoji_buki[$.inArray(f.off_soubi, tf.shoji_buki_id)][1]++; //所持品リストにあれば個数を1加算
}else{f.chara_shoji_buki.push([f.off_soubi,1]);} //なければ装備を外したアイテムを所持品リストに追加
f.chara_soubi[0] = 0; //装備中アイテムIDに「なし」のIDを代入
break;
case 'tate': //鎧など他の装備は必要ならcase文で追加します
f.off_soubi = f.chara_soubi[1]; //装備していたアイテムIDを変数f.off_soubiにコピー
tf.shoji_tate_id = [];
for (i = 0, l = f.chara_shoji_tate.length; i < l ; i++){
tf.shoji_tate_id[i] = f.chara_shoji_tate[i][0]; //所持品リストのアイテムIDだけを一時変数(配列)に格納
}
if($.inArray(f.off_soubi, tf.shoji_tate_id) >= 0){ ///装備を外したアイテムが所持品リストにあるかどうか調査
f.chara_shoji_tate[$.inArray(f.off_soubi, tf.shoji_tate_id)][1]++; //所持品リストにあれば個数を1加算
}else{f.chara_shoji_tate.push([f.off_soubi,1]);} //なければ装備を外したアイテムを所持品リストに追加
f.chara_soubi[1] = 0;
break;
}
[endscript]
@jump target=*open_soubi
■ 実行結果画面(動作確認:ティラノスクリプトVer3.30)
↓左手横の「変更」を押すと「所持品一覧:盾」が表示される
↓「鍋のフタ」横の「装備する」を押すと、左手に装備される
↓「木の盾」に装備を変更すると、鍋のフタは所持品一覧に戻る
この記事についての引用元
ゲーム画像は記事作者制作ゲームのものです。
ティラノスクリプトは© Copyright ShikemokuMK All Rights Reserved.のものです。
- 最終更新:2020-12-24 10:05:53