HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0408
ミント敵の配置の仕方について15解決


ミント

リンク

2012/4/8(Sun) 10:16:53|NO.45951

どうもこんにちは。そうでない方は始めまして。

とある作業にて「敵の配置の仕方」を見直すことになりました。
そこで色々試してみた結果、以下のスクリプトになりました(↓に書きます)


主はモジュール変数は理解出来てません(理解する努力はするけど)
ちなみにメインスクリプトは79匹の敵がいます。10匹とかだったら綺麗にできそうですが・・・
それにこれはまだ1面なので、2面3面...となってくれば、当然敵の数も増えますので、それに対応できたらしたいですね・・・

それでは「アドバイス、ここおかしいぞ!ごるぁ!」などありましたらお願いいたします。


 【処理の内容】
1:敵5匹を1グループとして動かします。
2:1グループごとにそれぞれ別の動きをさせます。

 【知りたいこと】
1:この敵の処理方法は危険なのか?(if cnt <= 4  if cnt <= 9 とか危ない気がする)
2:このスクリプトは見づらいので、何か言い方法はないものか (テキストとかがいいのだろうか?)



screen 0,640,480 ;敵の情報 TEK_MAX = 15 ;敵の最大数(15) dim TEK_f,TEK_MAX ;敵のフラグ dim TEK_x,TEK_MAX ;敵のX dim TEK_y,TEK_MAX ;敵のY ;*****************敵の配置************** ;敵のX座高 TEK_X(0) = 180 : TEK_X(1) = 180 : TEK_X(2) = 180 : TEK_X(3) = 180 : TEK_X(4) = 180 ;2グループ目 TEK_X(5) = 200 : TEK_X(6) = 200 : TEK_X(7) = 200 : TEK_X(8) = 200 : TEK_X(9) = 200 ;3グループ目 TEK_X(10) = 10 : TEK_X(11) = -30 : TEK_X(12) = -70 : TEK_X(13) = -110 : TEK_X(14) = -150 ;敵のY座高 TEK_Y(0) = 10 : TEK_Y(1) = -30 : TEK_Y(2) = -70 : TEK_Y(3) = -110 : TEK_Y(4) = -150 ;2グループ目 TEK_Y(5) = 10 : TEK_Y(6) = -30 : TEK_Y(7) = -70 : TEK_Y(8) = -110 : TEK_Y(9) = -150 ;2グループ目 TEK_Y(10) = 350 : TEK_Y(11) = 350 : TEK_Y(12) = 350 : TEK_Y(13) = 350 : TEK_Y(14) = 350 ;***************メインループ************ *メイン redraw 0 : color : boxf ;***************カウンター************** color 0,255 pos 0,0 : mes "敵が出るタイミング " + TK_TIM pos 0,30 : mes "【第一グループ】 " pos 0,50 : mes "敵Y(0) " + TEK_y(0) pos 0,70 : mes "敵Y(1) " + TEK_y(1) pos 0,90 : mes "敵Y(2) " + TEK_y(2) pos 0,110 : mes "敵Y(3) " + TEK_y(3) pos 0,130 : mes "敵Y(4) " + TEK_y(4) pos 0,160 : mes "【第二グループ】 " pos 0,180 : mes "敵Y(5) " + TEK_y(5) pos 0,200 : mes "敵Y(6) " + TEK_y(6) pos 0,220 : mes "敵Y(7) " + TEK_y(7) pos 0,240 : mes "敵Y(8) " + TEK_y(8) pos 0,260 : mes "敵Y(9) " + TEK_y(9) pos 0,290 : mes "【第三グループ】 " pos 0,310 : mes "敵X(10) " + TEK_x(10) pos 0,330 : mes "敵X(11) " + TEK_x(11) pos 0,350 : mes "敵X(12) " + TEK_x(12) pos 0,370 : mes "敵X(13) " + TEK_x(13) pos 0,390 : mes "敵X(14) " + TEK_x(14) ;*************************************** gosub *敵の処理 ;敵を表示 repeat TEK_MAX ;敵の最大数(15) if TEK_f(cnt) = 1 { ;敵のフラグ pos TEK_x(cnt), TEK_y(cnt) ;座標 color 255 : mes "敵" }loop redraw 1 : await 15 goto *メイン ;***************敵の処理**************** *敵の処理 ;敵のXスピード 左に曲がる TEK_s(0) = TEK_x(0) + 1 : TEK_s(1) = TEK_x(1) + 1 : TEK_s(2) = TEK_x(2) + 1 : TEK_s(3) = TEK_x(3) + 1 : TEK_s(4) = TEK_x(4) + 1 ;2グループ目 右に曲がる TEK_s(5) = TEK_x(5) - 1 : TEK_s(6) = TEK_x(6) - 1 : TEK_s(7) = TEK_x(7) - 1 : TEK_s(8) = TEK_x(8) - 1 : TEK_s(9) = TEK_x(9) - 1 ;3グループ目 左からくる TEK_s(10) = TEK_x(10) + 1 : TEK_s(11) = TEK_x(11) + 1 : TEK_s(12) = TEK_x(12) + 1 : TEK_s(13) = TEK_x(13) + 1 : TEK_s(14) = TEK_x(14) + 1 ;****************設置******************* TK_TIM++ ;敵が出るタイム TK_c = 0 ;敵の数 repeat TEK_MAX ;敵の最大数(15) if cnt <= 4 { ;cntが4以下なら = 実行 if TEK_f(cnt) = 0 { ;敵のフラグ TEK_x(cnt) = TEK_X(TK_c) ;敵のX TEK_y(cnt) = TEK_Y(TK_c) ;敵のY TEK_f(cnt) = 1 ;敵のフラグ } TEK_y(cnt) += 1 ;↓に移動 if TEK_y(cnt) >= 301 { ;ある場所に到着したら = 実行 TEK_x(cnt) = TEK_s(TK_c) ;敵を→に移動させる } } ;2グループ目 if cnt <= 9 AND TK_TIM >= 250 { ;cntが9以下なら & 時間がたったら = 実行 if TEK_f(cnt) = 0 { ;敵のフラグ TEK_x(cnt) = TEK_X(TK_c) ;敵のX TEK_y(cnt) = TEK_Y(TK_c) ;敵のY TEK_f(cnt) = 1 ;敵のフラグ } TEK_y(cnt) += 1 ;↓に移動 if cnt <= 4 : TEK_y(cnt) -= 1 ;1グループ目の敵の加速を止める if TEK_y(cnt) >= 301 { ;ある場所に到着したら = 実行 TEK_x(cnt) = TEK_s(TK_c) ;敵を←に移動させる TEK_y(cnt) -= 1 ;↓に移動しようとする力を消す } } ;3グループ目 if cnt <= 14 AND TK_TIM >= 700 { ;cntが14以下なら & 時間がたったら = 実行 if TEK_f(cnt) = 0 { ;敵のフラグ TEK_x(cnt) = TEK_X(TK_c) ;敵のX TEK_y(cnt) = TEK_Y(TK_c) ;敵のY TEK_f(cnt) = 1 ;敵のフラグ } TEK_x(cnt) = TEK_s(TK_c) ;→に移動 } TK_c++ ;敵の数 loop return



この記事に返信する


たんす

リンク

2012/4/8(Sun) 11:55:10|NO.45953

すべての敵を連番で扱うと除外処理が手間になるので二次元配列を使ってみました。
そしてswitch〜case〜swendでグループごとの処理を分けましたので軌道修正も容易になるかと。
screen 0,640,480
;敵の情報 TEK_Gnum = 5 ;敵の最大数 TEK_Gmax = 3 ;グループ数 dim TEK_f,TEK_Gnum,TEK_Gmax ;敵のフラグ dim TEK_x,TEK_Gnum,TEK_Gmax ;敵のX:TEX_X(No,Group) dim TEK_y,TEK_Gnum,TEK_Gmax ;敵のY ;*****************敵の配置************** ;敵のX座標 TEK_X(0,0)=180,180,180,180,180 ;グループ1のX座標まとめて入力 TEK_X(0,1)=200,200,200,200,200 ;グループ2のX座標まとめて入力 TEK_X(0,2)=10,-30,-70,-110,-150;グループ3のX座標まとめて入力 ;敵のY座標 TEK_Y(0,0)=10,-30,-70,-110,-150;グループ1のY座標まとめて入力 TEK_Y(0,1)=10,-30,-70,-110,-150;グループ2のY座標まとめて入力 TEK_Y(0,2)=350,350,350,350,350 ;グループ3のY座標まとめて入力 ;***************メインループ************ *メイン redraw 0 : color : boxf ;***************カウンター************** color 0,255 pos 0,0 : mes "敵が出るタイミング " + TEK_TIM pos 0,30 : mes "【第一グループ】 " pos 0,50 : mes "敵Y(0,0):(" + TEK_x(0,0) + "," + TEK_y(0,0)+")" pos 0,70 : mes "敵Y(1,0):(" + TEK_x(1,0) + "," + TEK_y(1,0)+")" pos 0,90 : mes "敵Y(2,0):(" + TEK_x(2,0) + "," + TEK_y(2,0)+")" pos 0,110 : mes "敵Y(3,0):(" + TEK_x(3,0) + "," + TEK_y(3,0)+")" pos 0,130 : mes "敵Y(4,0):(" + TEK_x(4,0) + "," + TEK_y(4,0)+")" pos 0,160 : mes "【第二グループ】 " pos 0,180 : mes "敵Y(0,1):(" + TEK_x(0,1) + "," + TEK_y(0,1)+")" pos 0,200 : mes "敵Y(1,1):(" + TEK_x(1,1) + "," + TEK_y(1,1)+")" pos 0,220 : mes "敵Y(2,1):(" + TEK_x(2,1) + "," + TEK_y(2,1)+")" pos 0,240 : mes "敵Y(3,1):(" + TEK_x(3,1) + "," + TEK_y(3,1)+")" pos 0,260 : mes "敵Y(4,1):(" + TEK_x(4,1) + "," + TEK_y(4,1)+")" pos 0,290 : mes "【第三グループ】 " pos 0,310 : mes "敵X(10):(" + TEK_x(0,2) + "," + TEK_y(0,2)+")" pos 0,330 : mes "敵X(11):(" + TEK_x(1,2) + "," + TEK_y(1,2)+")" pos 0,350 : mes "敵X(12):(" + TEK_x(2,2) + "," + TEK_y(2,2)+")" pos 0,370 : mes "敵X(13):(" + TEK_x(3,2) + "," + TEK_y(3,2)+")" pos 0,390 : mes "敵X(14):(" + TEK_x(4,2) + "," + TEK_y(4,2)+")" ;*************************************** gosub *敵の処理 ;敵を表示 repeat TEK_gmax ;敵のグループ数 TEK_G=cnt repeat TEK_Gnum;グループ内の敵番号 if TEK_f(cnt,TEK_G) = 1 { ;敵のフラグ pos TEK_x(cnt,TEK_G), TEK_y(cnt,TEK_G) ;座標 color 255 : mes "敵" } loop loop redraw 1 : await 15 if TEK_TIM>1500 : stop ;終了条件 goto *メイン ;***************敵の処理**************** *敵の処理 ;****************設置******************* TEK_TIM++ ;敵が出るタイム repeat TEK_gmax ;敵のグループ数 TEK_G=cnt repeat TEK_Gnum ;グループ内の敵番号 switch TEK_G ;グループごとの処理を行う case 0;1グループ目 //フラグ管理 if TEK_f(cnt,0) = 0 { ;敵のフラグ TEK_f(cnt,0) = 1 ;敵のフラグon } //定期移動 TEK_y(cnt,0) += 1 ;↓に移動 TEK_x(cnt,0) += 0 ;横移動無し //変化条件 if TEK_y(cnt,0) >= 301 { ;ある場所に到着したら = 実行 TEK_x(cnt,0) += 1 ;敵を→に移動させる TEK_y(cnt,0) -= 1 ;↓に移動しようとする力を消す } swbreak case 1;2グループ目 if TEK_TIM >= 250 { ;時間がたったら = 実行 //フラグ管理 if TEK_f(cnt,1) = 0 { ;敵のフラグ#2 TEK_f(cnt,1) = 1 ;敵のフラグ } //定期移動 TEK_y(cnt,1) += 1 ;↓に移動 TEK_x(cnt,1) += 0 ;横移動無し //変化条件 if TEK_y(cnt,1) >= 301 { ;ある場所に到着したら = 実行 TEK_x(cnt,1) -= 1 ;敵を←に移動させる TEK_y(cnt,1) -= 1 ;↓に移動しようとする力を消す } } swbreak case 2;3グループ目 if TEK_TIM >= 700 { ;時間がたったら = 実行 //フラグ管理 if TEK_f(cnt,2) = 0 { ;敵のフラグ#3 TEK_f(cnt,2) = 1 ;敵のフラグ } //定期移動 TEK_y(cnt,2) += 0 ;↓に移動しない TEK_x(cnt,2) += 1 ;→に移動 //変化条件 ;なし } swbreak swend loop loop return
case内の変化条件を追加することで複雑な軌道も描けると思います。



cats

リンク

2012/4/8(Sun) 18:23:08|NO.45957

>テキストとかがいいのだろうか?
テキストを使い、グループ1の敵をテキストで1とします。
グループ2の敵は2、グループ3は3にします。
そして、プログラムでテキストの1を読み込んだらAの動きをし、
テキストの2を読み込んだらBの動きをする、という感じはどうでしょうか。



暇人

リンク

2012/4/9(Mon) 00:24:51|NO.45972

敵の種類とグループ(隊列)を別々に設定
グループの敵数は自由に設定できる
その他出現時間、出現座標(グループ座標は基本座標になる一つだけ)も同じタイムテーブルで設定


screen 0,640,480 //敵種類ID #enum 敵無=0 #enum 敵↓→移動 #enum 敵↓←移動 #enum 敵→移動 敵名="敵無","敵↓→移動","敵↓←移動","敵→移動","敵→移動"//表示用 //敵隊列ID #enum 隊列無=0 #enum 隊列↓縦 //下から上に並ぶ #enum 隊列→横 //右から左に並ぶ #enum 隊列↓縦V //下から上にV字に並ぶ 敵隊列名="隊列無","隊列↓縦","隊列→横","隊列↓縦V"//表示用 //敵タイムテーブルの各初期値の順番 #enum 敵発生時間=0 #enum 敵座標横 #enum 敵座標縦 #enum 敵種類 #enum 敵隊列 #enum 敵隊列数 #enum 敵データ終 ;敵の情報 TEK_MAX = 100 ;敵の最大数(画面上に出せる最大数) dim TEK_f,TEK_MAX ;敵のフラグ(敵の種類ID保存用) dim TEK_x,TEK_MAX ;敵のX dim TEK_y,TEK_MAX ;敵のY TK_c = 0 ;敵の数 dim 敵画面内,TEK_MAX //画面内になったら1 dim 敵隊列ID,TEK_MAX //敵隊列ID保存用(敵隊列名表示に使うだけ) ;*****************敵のタイムテーブル設定************** dim 敵タイムテーブル,敵データ終,1 敵登録最大数=0 敵タイムテーブルインデックス=0 // = 敵発生時間,敵座標横,敵座標縦,敵種類,敵隊列,敵隊列数 敵タイムテーブル(敵発生時間,敵設定数) = 0, 180, 10, 敵↓→移動, 隊列↓縦, 5 : 敵設定数++ 敵タイムテーブル(敵発生時間,敵設定数) = 150, 280, -20, 敵↓→移動, 隊列↓縦, 3 : 敵設定数++ //画面外に縦に並んで↓→ 敵タイムテーブル(敵発生時間,敵設定数) = 250, 200, 10, 敵↓←移動, 隊列↓縦, 5 : 敵設定数++ 敵タイムテーブル(敵発生時間,敵設定数) = 500, 200, 0, 敵↓→移動, 隊列→横, 4 : 敵設定数++ //横に並んで↓→ 敵タイムテーブル(敵発生時間,敵設定数) = 700, 10, 350, 敵→移動, 隊列→横, 5 : 敵設定数++ 敵タイムテーブル(敵発生時間,敵設定数) = 800, 300, -20, 敵↓←移動, 隊列↓縦V, 11 : 敵設定数++ //V字に並んで↓← ;***************メインループ************ *メイン redraw 0 : color : boxf ;***************カウンター************** color 0,255 pos 0,0 : mes "敵が出るタイミング " + TK_TIM pos 0,30 TK_c_copy=TK_c repeat TEK_MAX if TEK_f(cnt)>0{ mes strf("%s :%s :敵X(%d)%3d :敵Y(%d)%3d",敵名(TEK_f(cnt)),敵隊列名(敵隊列ID(cnt)),cnt,TEK_x(cnt),cnt,TEK_y(cnt)) TK_c_copy-- if TK_c_copy=0 {break}//全ての敵処理終了 } loop gosub *敵の処理 ;敵を表示 TK_c_copy=TK_c repeat TEK_MAX ;敵配列の最大数 if TEK_f(cnt) > 0 { ;敵のフラグ pos TEK_x(cnt), TEK_y(cnt) ;座標 color 255 : mes "敵" TK_c_copy-- } if TK_c_copy=0 {break}//全ての敵処理終了 loop title "敵数="+TK_c TK_TIM++ ;敵が出るタイム redraw 1 : await 15 goto *メイン ;***************敵の処理**************** *敵の処理 gosub *敵タイムテーブル処理 TK_c_copy=TK_c repeat TEK_MAX ;敵の配列最大数 if TEK_f(cnt) > 0{ if TEK_x(cnt)<-32 or TEK_x(cnt)>640 or TEK_y(cnt)<-32 or TEK_y(cnt)>480 {//画面外 if 敵画面内(cnt)=1 { //画面内から画面外にでたので削除 TEK_f(cnt)=0 TK_c-- } }else{//画面内 敵画面内(cnt)=1 //画面内フラグ } switch TEK_f(cnt) ;敵の種類ごとの処理 case 0 //削除されてる swbreak case 敵↓→移動 if TEK_y(cnt) >= 301 { ;ある場所に到着したら = 実行 TEK_x(cnt) += 1 ;敵を→に移動させる }else{//ある場所に到着してない TEK_y(cnt) += 1 ;↓に移動 } swbreak case 敵↓←移動 if TEK_y(cnt) >= 301 { ;ある場所に到着したら = 実行 TEK_x(cnt) -= 1 ;敵を←に移動させる }else{//ある場所に到着してない TEK_y(cnt) += 1 ;↓に移動 } swbreak case 敵→移動 TEK_x(cnt) += 1 ;→に移動 swbreak default swend TK_c_copy-- //敵一つ処理が終ったから減らす if TK_c_copy=0 {break}//全ての敵処理終了 } loop return ;*****************個別の敵配置************** *敵タイムテーブル処理 repeat (敵設定数 - 敵タイムテーブルインデックス),敵タイムテーブルインデックス dupptr データ,varptr(敵タイムテーブル(0,cnt)),4*敵データ終 //二次元配列をクローン命令を使って一次配列に if データ(敵発生時間) = TK_TIM {//設定時間が来たから敵を配置 敵タイムテーブルインデックス++ //タイムテーブルを一つ進める switch データ(敵隊列) ;グループごとの処理を行う case 隊列無 隊列座標x=0 隊列座標y=0 gosub *敵空き検索して配置 swbreak case 隊列↓縦 repeat データ(敵隊列数) 隊列座標x=0 隊列座標y=-cnt*40 gosub *敵空き検索して配置 loop swbreak case 隊列→横 repeat データ(敵隊列数) 隊列座標x=-cnt*40 隊列座標y=0 gosub *敵空き検索して配置 loop swbreak case 隊列↓縦V repeat データ(敵隊列数) 隊列座標x=10*((cnt+1)/2)*(1-(cnt\2)*2) 隊列座標y=-30*((cnt+1)/2) gosub *敵空き検索して配置 loop swbreak default swend }else{break} loop return *敵空き検索して配置 空=0 repeat TEK_MAX if TEK_f(cnt)=0 {break} 空++ loop if 空 < TEK_MAX { TEK_f(空) = データ(敵種類) TEK_x(空) = データ(敵座標横)+隊列座標x TEK_y(空) = データ(敵座標縦)+隊列座標y 敵画面内(空)=0 敵隊列ID(空)=データ(敵隊列) TK_c++ //敵数加算 }else{ //同時に出せる敵数を越えた } return

隊列だけ変えるとか種類増やすとか敵配置増やすとか楽に出来るようにしたつもり
元からある変数配列で変更したのはTEK_f()のみ
存在フラグ兼敵種類IDにしただけだけど



暇人

リンク

2012/4/10(Tue) 01:45:09|NO.45994

なんか間違いって言うか変数名変えたの忘れて使ってない変数初期化してた・・・

> 敵登録最大数=0
これは使用してない(敵設定数に変えたの忘れてた・・・)
>敵名="敵無","敵↓→移動","敵↓←移動","敵→移動","敵→移動"//表示用
"敵→移動"が二つある・・・意味無し



ミント

リンク

2012/4/10(Tue) 10:57:51|NO.45996

>>たんすさん
参考になるソースとさりげないアドバイスありがとうございます!

>>すべての敵を連番で扱うと除外処理が手間になるので二次元配列を使ってみました。
そうそう、除外処理が大変だからいつも苦労してます。
除外処理をやらないと、どんどん溜まっていって処理落ちする原因になるから
私は、壁の外(ゲーム画面の外)に行ったら消すようにしてます(処理方法変えると思うけど)

っと関係ないこと話ですねw



今回は「switch」のやつ使えるのかな〜?とか疑問に思いながら試行錯誤してました。
やっぱ覚えたてのせいか、いまいち有効活用の方法が編み出せませんでした。
けどたんさんのスクリプトを見て「こういう作り方もあるんだ」と理解することができました。

っていうか今まで二次元配列を使ってなかったので、その使うメリットから探すハメになるとは・・・
初めてに近い二次配列だから「(0.1)(1.0)」どっちが先だっけ?とか思ったけど、
処理内容によって変えた方がよさそうですね。


今回の場合は「1グループを5回繰り返したい」ので、先に「(1.0)→(2.0)」左側から増えていくんですね。
そうそう敵の配置と言えば・・・
>>TEK_X(0,0) = 180,180,180,180,180 ;グループ1のX座標まとめて入力
まとめておけるんですね・・・初めて知りました。
っていうか昔やってたはずなんですよね(C3級取得する際に)・・・いや〜やっぱ継続的にやらないとダメだわ。

んで、なんで二次元配列を使うのかわかりました。



>>TEK_X(0,0)
・・・・ん?・・・( ゚д゚ )
同じ名前がない!・・・どこだー!

HSP内で検索する → けど同じ名前(変数名)がない。
そして・・・あ、「X」だろうと「x」だろうと同じ扱いなの忘れてた (忘れちゃだめでしょ)



ちなみに本スクリプトの方では10グループ、最後特殊敵が一緒の変数で管理されているんだよね。
「switch」の置き方だとグループごとに「case 0」「case 1」「case 2」....
っとまぁなるが、見やすいし、管理しやすいし、変化させやすいし、これでいいと思う。

2面になったらもっと増えて大変だろうけど、それは2面に入って数が増えまくってから考えよう。
さてこれを本ソースにぶち込む作業が待っているんだが・・・骨が折れそうだぜ。
敵の構造ほぼ作りなおしだからね (特殊敵の考え方、消し方 などなど)


解決ボタンはしばらーくお待ちください。
@他の回答してくれた方のお返事も時間がかかると思います!



ミント

リンク

2012/4/10(Tue) 11:04:40|NO.45997

>>catsさん
>>テキストを使い、グループ1の敵をテキストで1とします。
>>グループ2の敵は2、グループ3は3にします。
>>そして、プログラムでテキストの1を読み込んだらAの動きをし、
>>テキストの2を読み込んだらBの動きをする、という感じはどうでしょうか。
なるほど、それなら他の敵の動きに影響されないですみそうな気がする。
ん〜、時間があったらテキストの方をいじくってみようかな。
っていうかテキストに扱いに関して、ほぼ始めても同然だからうまく行くかわからないけど、
出来る限りやってみますね。


アドバイスありがとうございます!





_・)チラ
暇人さんのスクリプト解析は時間がかかりそうなのでちょっと待っててほしい。
#enumとか初めて見るし!っていうかまずたんすさんのソースを本ソースにぶち込んで色々(ry



暇人

リンク

2012/4/10(Tue) 22:53:18|NO.46017

>#enumとか初めて見るし!
並べて定義するだけで自動的に加算されてく便利なマクロ
#enum 敵NO=0
#enum 敵座標X
#enum 敵座標Y
これで敵座標Yは自動的に2に置き換わる
敵データ(敵座標Y)で敵データ(2)となり配列変数の要素2がy座標でなどと考えなくて済む
その代わり敵座標Yが何の数値に置き換わるかはぱっと見分からない


NO.45972の#enumの部分をコピペすれば配置エディター作る時に楽できる
と、作り出したら一通りの機能付けてしまった・・・(固定画面用だけど)

//敵種類ID #enum 敵無=0 #enum 敵↓→移動 #enum 敵↓←移動 #enum 敵→移動 敵名="敵無","敵↓→移動","敵↓←移動","敵→移動"//表示用 //敵隊列ID #enum 隊列無=0 #enum 隊列↓縦 //下から上に並ぶ #enum 隊列→横 //右から左に並ぶ #enum 隊列↓縦V //下から上にV字に並ぶ 敵隊列名="隊列無","隊列↓縦","隊列→横","隊列↓縦V"//表示用 //敵タイムテーブルの各初期値の順番 #enum 敵発生時間=0 #enum 敵座標横 #enum 敵座標縦 #enum 敵種類 #enum 敵隊列 #enum 敵隊列数 #enum 敵データ終 msx=320 //配置スクリーンの原点 msy=60 screen 0,1024,600,0,100,100 objsize 32,18,20 pos 150,4 :button gosub "複製" , *複製 pos 200,4 :button gosub "削除" , *削除 pos 4,24 objsize 238,18,20 タイムテーブル="" listbox 敵タイムテーブルインデックス , 400 , タイムテーブル //敵タイムテーブル表示用listbox listbox_id=stat button gosub "ファイルを読込" , *読込 button gosub "ファイルに保存" , *保存 //********敵タイムテーブルに関係する物の初期設定 dim 敵タイムテーブル,敵データ終,1 敵設定数=0//敵タイムテーブルに設定した総数 敵タイムテーブルインデックス=-1 //0以上なら敵タイムテーブルlistbox選択中 データ=0,mousex-msx,mousey-msy,敵↓→移動,隊列↓縦,5 //敵タイムテーブル設定用 gosub *設定ウィンドウ初期化 //*********メインループ repeat gsel 0 stick st,$fff redraw 0 //メインウィンドウ再描画 color 0,40,40 : boxf color 180,180,180 : boxf msx,msy,640+msx,480+msy : line 250,0,250,600 pos 8,4 : mes "敵タイムテーブル" pos 32,480 : mes " 現在の設定値\n" mes strf("%d%4d %3d",データ(敵発生時間),データ(敵座標横),データ(敵座標縦)) mes strf("%s %s",敵名(データ(敵種類)),敵隊列名(データ(敵隊列))) mes strf("%d",データ(敵隊列数)) color 255,50,50 repeat 敵設定数 //既に設定されたタイムテーブルを基にNoをその座標に表示 dupptr データ_dup,varptr(敵タイムテーブル(0,cnt)),4*敵データ終 pos データ_dup(敵座標横)+msx,データ_dup(敵座標縦)+msy :mes cnt //設定された座標をエディタ上の座標にしてpos設定 loop color 120,255,50 :pos データ(敵座標横)+msx-8,データ(敵座標縦)+msy-8 :mes "●" //現在の設定値をエディタ上の座標にしてpos設定(-8は見た目上の微調整) if 250<(ginfo(0)-ginfo(4)) {//マウスカーソルが配置用スクリーン内なら(縦線より右側) if st=256 {//左クリック(追加準備) if 設定ウィンドウ表示中=0 {//表示されてない 複製フラグ=0 //複製か追加の判定用フラグ(0=追加 1=複製) インデックス_No=敵設定数 //暫定的に最後尾+1を選択(インデックスは0からだから総数は必然的に+1になる) sx=ginfo(0)+8:sy=ginfo(1)-8 //設定ウィンドウの座標にマウスのデスクトップ上の座標を使用(+8は見た目上の微調整) //データ配列に現在のマウス座標を配置スクリーン座標にして代入 //敵発生時間、敵種類、敵隊列、敵隊列数は現在の設定値が使われる データ(敵座標横)=mousex-msx,mousey-msy //設定ウィンドウ内の各種データ用 色=120,120,250//設定ウィンドウの背景色 gosub *設定ウィンドウ //設定ウィンドウ表示 }else{//表示中 if ginfo(2)=0 {//メインウィンドウがアクティブ データ(敵座標横)=mousex-msx,mousey-msy //設定座標をマウスカーソル座標を利用 gosub *設定ウィンドウオブジェクト内容更新 } } } }else{//マウスカーソルが配置用スクリーン外 if 敵タイムテーブルインデックス_copy ! 敵タイムテーブルインデックス and 設定ウィンドウ表示中=0 {//リストボックスの選択位置が変った if 敵タイムテーブルインデックス>=0 {//選択中の設定、敵発生時間以外を現在の設定値にする dupptr データ_dup,varptr(敵タイムテーブル(0,敵タイムテーブルインデックス)),4*敵データ終 データ(敵座標横)=データ_dup(敵座標横),データ_dup(敵座標縦),データ_dup(敵種類),データ_dup(敵隊列),データ_dup(敵隊列数) } } 敵タイムテーブルインデックス_copy=敵タイムテーブルインデックス } gsel 0 :redraw :await 15 if (cnt\10)=0 {title "敵タイムテーブルインデックス="+敵タイムテーブルインデックス} loop *決定 //配置決定 gsel 100,-1 敵タイムテーブルインデックス=敵設定数 //インデックスを最後尾+1に仮設定 敵タイムテーブル(0,敵タイムテーブルインデックス)=データ(0),データ(1),データ(2),データ(3),データ(4),データ(5) //仮追加 repeat 敵設定数 //敵発生時間に合わせて追加処理 if データ(敵発生時間) < 敵タイムテーブル(敵発生時間,cnt) {//追加予定のデータのが発生時間が小さい 敵タイムテーブルインデックス=cnt //最初に超えた位置を敵タイムテーブルインデックスに dim 敵タイムテーブル_copy,敵データ終,敵設定数 //copy用に配列確保 memcpy 敵タイムテーブル_copy,敵タイムテーブル,敵設定数*敵データ終*4 //一時的に敵タイムテーブルをコピー memcpy 敵タイムテーブル(0,cnt),データ,敵データ終*4 //超えた位置のタイムテーブルに追加データ上書き memcpy 敵タイムテーブル(0,cnt+1),敵タイムテーブル_copy(0,cnt),(敵設定数-cnt)*敵データ終*4 //追加された位置+1からcopyしといたデータの超えた位置から戻す break } loop 敵設定数++ *listbox表示 //listbox内容更新 gsel 0,1 タイムテーブル="" repeat 敵設定数 dupptr データ_dup,varptr(敵タイムテーブル(0,cnt)),4*敵データ終 タイムテーブル+strf("No.(%2d)%3d %3d, %3d %s:%s:%2d",cnt,データ_dup(0),データ_dup(1),データ_dup(2),敵名(データ_dup(3)),敵隊列名(データ_dup(4)),データ_dup(5))+"\n" loop objprm listbox_id,タイムテーブル objprm listbox_id,敵タイムテーブルインデックス 設定ウィンドウ表示中=0 return *取り消し gsel 100,-1 設定ウィンドウ表示中=0 if 複製フラグ=0 {敵タイムテーブルインデックス=-1}else{memcpy データ,敵タイムテーブル(0,敵タイムテーブルインデックス),敵データ終*4} 複製フラグ=0 gosub *listbox表示 return *複製 //選択中の物と同じデータで設定ウィンドウを表示 if 敵タイムテーブルインデックス>=0 { 複製フラグ=1 インデックス_No=敵タイムテーブルインデックス memcpy データ,敵タイムテーブル(0,敵タイムテーブルインデックス),敵データ終*4 sx=ginfo(4)+データ(敵座標横)+10+msx :sy=ginfo(5)+データ(敵座標縦)+msy+20-8 色=250,120,120//設定ウィンドウの背景色 gosub *設定ウィンドウ } return *設定ウィンドウ //設定ウィンドウ表示 設定ウィンドウ表示中=1 gsel 100 //設定ウィンドウアクティブ選択 width -1 , -1 ,sx , sy color 色,色(1),色(2) :boxf color 255,255,255 :pos 113,1 :mes "No."+インデックス_No gsel 100,2 //設定ウィンドウ最全面で表示 *設定ウィンドウオブジェクト内容更新 gsel 100 repeat 敵データ終 objprm obj_id(cnt) , データ(cnt) loop gsel 0 return *削除 if 敵タイムテーブルインデックス>=0 and 敵設定数>0 { gsel 100,-1 設定ウィンドウ表示中=0 memcpy 敵タイムテーブル(0,敵タイムテーブルインデックス),敵タイムテーブル(0,敵タイムテーブルインデックス+1),(敵設定数-(敵タイムテーブルインデックス+1))*敵データ終*4 敵設定数-- if 敵タイムテーブルインデックス >= 敵設定数 {敵タイムテーブルインデックス=敵設定数-1} gosub *listbox表示 } return *読込 gosub *取り消し dialog "TTlist.dat を読み込みます",3 if stat=6 { exist "TTlist.dat" if strsize>0{ 敵設定数=strsize/(敵データ終*4) dim 敵タイムテーブル,敵データ終,strsize/(敵データ終*4) bload "TTlist.dat",敵タイムテーブル,strsize if strsize>0{ 敵タイムテーブルインデックス=-1 gosub *listbox表示 dialog "読み込みました",0 } }else{ dialog "ファイルが存在しません",0 } } return *保存 if 敵設定数>0{ gosub *取り消し dialog dir_cur+"\\ に\n TTlist.dat を保存します\n(既に存在する場合上書きされます)",2 if stat=6 { bsave "TTlist.dat",敵タイムテーブル,敵設定数*敵データ終*4 if strsize>0 {dialog "保存しました",0} } }else{dialog "登録データがありません",0} return *設定ウィンドウ初期化 bgscr 100,162,60,2,sx,sy //縁無しウィンドウ //各種input、combox、button設置 pos 1,1 :input データ(敵発生時間) , 40 , 18 :obj_id(敵発生時間)=stat//オブジェクトIDを 各初期値の順番を要素にobj_id()へ保存 pos ginfo_cx+48,1 :input データ(敵座標横) , 32 , 18 :obj_id(敵座標横)=stat pos ginfo_cx+32,1 :input データ(敵座標縦) , 32 , 18 :obj_id(敵座標縦)=stat sdim 敵名combox :repeat length(敵名) :敵名combox+敵名(cnt)+"\n" :loop //comboxで使える文字列にする sdim 敵隊列名combox :repeat length(敵隊列名) :敵隊列名combox+敵隊列名(cnt)+"\n" :loop //comboxで使える文字列にする objsize 80,18,20 pos 1 :combox データ(敵種類), 100 , 敵名combox :obj_id(敵種類)=stat pos ginfo_cx+80,ginfo_cy-20 :combox データ(敵隊列), 100 , 敵隊列名combox :obj_id(敵隊列)=stat pos 1 :input データ(敵隊列数) , 32 , 18 :obj_id(敵隊列数)=stat objsize 48,18,20 pos 48,ginfo_cy-17 :button gosub "決定" , *決定 pos ginfo_cx+52,ginfo_cy-20:button gosub "取り消し" , *取り消し objsize 8,8,10 pos 41,1 :button gosub "+" , *加算減算 :加算obj_id=stat button gosub "-" , *加算減算 gsel 0,1 return *加算減算 //敵発生時間時間の加算減算 if 加算obj_id=stat { データ(敵発生時間)+60 //60フレーム(1秒)加算 }else{ データ(敵発生時間)-10 //10フレーム減算 } gsel 100 objprm obj_id(敵発生時間) , データ(敵発生時間) //敵発生時間input内容更新 gsel 0 return

テストプレイの追加は

button gosub "テストプレイ" , *テストプレイ
これを適当な所に設置して

*テストプレイ bgscr 1 TEK_MAX = 100 ;敵の最大数(画面上に出せる最大数) dim TEK_f,TEK_MAX ;敵のフラグ(敵の種類ID) dim TEK_x,TEK_MAX ;敵のX dim TEK_y,TEK_MAX ;敵のY TK_c = 0 ;敵の数 dim 敵画面内,TEK_MAX //画面内になったら1 dim 敵隊列ID,TEK_MAX //敵隊列ID保存用(敵隊列名表示に使うだけ) 敵タイムテーブルインデックス=0 TK_TIM=0 *メイン stick st if st=128{gsel 1,-1:gsel 0,1:return}//Escでテスト終了
これを貼り付けてからこの下に
NO.45972の*メインより下をコピペ



暇人

リンク

2012/4/10(Tue) 23:00:37|NO.46019

NO.45972のにNO.46017で作って保存したファイルを読み込ませる

*メインのすぐ上に

dialog "TTlist.dat を読み込みます",3 if stat=6 { exist "TTlist.dat" if strsize>0{ 敵設定数=strsize/(敵データ終*4) dim 敵タイムテーブル,敵データ終,strsize/(敵データ終*4) bload "TTlist.dat",敵タイムテーブル,strsize }else{ dialog "ファイルが存在しません",0 } }
これをコピペ



暇人

リンク

2012/4/11(Wed) 00:06:46|NO.46020

あ、コピペでテストプレイ追加するのは問題あった
dupptrで使ってる変数名をエディター側でも使ってた

NO.45972の*メインより下をコピペしたら
*敵タイムテーブル処理、*敵空き検索して配置のサブルーチン内で使われてる
データ って名前を何か別の名前に変えると問題なくなる
置き換えは9個かな



ミント

リンク

2012/4/14(Sat) 22:21:59|NO.46080

どうもこんにちは。
ちょびっと時間かかってしまいました。
なんでこんなに時間かかったかと言うと・・・


1:敵VS自機弾(当たり判定)
2:敵撃破後のアイテム判定
3:アイテムVS自機(当たり判定)
4:特殊敵のバリア管理
5:敵VS低速ショット(当たり判定)
6:ボムVS敵当たり判定)


とか色々やってたせいです (´・ω・`)
うん・・・まぁなんだ、二次配列だと当たり判定も二次配列じゃないといけないのね(あたりまえ)
そんなことで少し手こずってしまいました・・・orz

そして部分チェック用のソースが12個もあるとか・・・やべぇ・・・
けどあれですね、二次配列だったら二次配列の当たり判定をしないといけないことにすぐに気がつけたのはよかったです。
アイテムの置き方は最初dgdgだったけどまとめられた。満足した(何が)



っと脱線しましたね。

そんなわけで無事解決しました!本当にありがとうございました!
いや〜ほんと長かったよ・・・不具合直したら不具合増えるとかさ・・・心折れそうになったよ・・・
けど、そこはチマチマやって切り抜けられました。次回こそ1面完成のことをお知らせするスレッドを立てたい。

まぁきっと1〜2回はお世話になりそうな目処たっちゃっているけど!(殴


>>暇人さんのスクリプト解析は時間がかかりそうなのでちょっと待っててほしい。
さて今からとりかかるぞ・・・きっと折れるがな!(NO.46017からスタート)



ミント

リンク

2012/4/17(Tue) 10:23:28|NO.46121

よく見たら「NO.45972」だった。


・・・
・・・・・
まぁなんだ、見てのとおりだ。心が・・・っというより私にはまだ早かったようだ。
すまねぇ・・・今の私にはこのソースを有効活用できそうもない・・・
が、そんだけすごいことをやっていることは確定的に明らか。なので詳しいソースをありがとう。

かなり時間かかりそうなのでとりあえず保留。
時間があるときにチマチマやってみます。一応次のソースとかもやってみるよー(NO.46017)



  〜〜余談〜〜
 【戦ってきた内容】
>>#enum 敵無 = 0
>>#enum 敵↓→移動 ;1
>>#enum 敵↓←移動 ;2

>>//敵隊列ID
>>#enum 隊列無 = 0 ;enumの初期化
>>#enum 隊列↓縦 //下から上に並ぶ(1)
ほうほう数字が増えていくのか。
「 = 0」で0からになるのか、初期化だと思えば私にとってわかりやすいかな。

Q:何で数字が増えていくんだ?
A(笑:きっとそういう機能だろう。(cnt)みたいと思えば抵抗ないかも。

Q:数字が増えてくる意味は?
A(笑:0番はフラグ、1番はX座高 みたいに管理するためだと思う。


ん?日本語!!平気なのか!日本語!?
変数の変わりにできるのか?なんてこった・・・
>>mes strf("%s : %s : 敵X(%d)%3d : 敵Y(%d)%3d" , 敵名(TEK_f(cnt)),敵隊列名(敵隊列ID(cnt)), cnt,TEK_x(cnt),cnt,TEK_y(cnt))
>>;(引数パラメーターをスタックに積む : : 敵(10進)10進実数桁数指定付き : , 敵名(フラグ),
うぉ、これは見づらい・・・

よし!一回日本語から変数にするか!
 ↓
心折れた。



暇人

リンク

2012/4/17(Tue) 22:02:33|NO.46132

NO.45972の利点を見て必要になったらもう一回考えてみたらいい
二次元配列が分かってるなら難しい事は何もしてない

敵タイムテーブルに敵配置設定追加しても他の変更が一切必要ない
敵配置設定追加していっても処理時間が増える事は無い
グループ内の敵数を固定にする必要がない
敵の種類グループの種類追加が容易
敵Aの動きをしてから敵Bの動きに変えるのがTEK_f()の内容を変えるだけで出来る
敵から敵をだすのが容易

if TEK_y(cnt) = 200 { 敵追加=0,TEK_x(cnt),TEK_y(cnt),敵→移動,隊列無,0 dupptr データ,varptr(敵追加),4*敵データ終 //*敵空き検索して配置でクローン変数名で「データ」を使ってるから追加用配列のクローンを作る 隊列座標x=0 隊列座標y=0 gosub *敵空き検索して配置 } //これをNO.45972の case 敵↓→移動 の下に入れるだけで敵↓→移動の敵がTEK_y=200になったときに敵→移動の敵を出せる

ステージ追加が容易(ステージ別の敵タイムテーブルインデックスを用意すれば良い)

Stage1_index=0 敵タイムテーブル(敵発生時間,敵設定数) = 0, 180, 10, 敵↓→移動, 隊列↓縦, 5 : 敵設定数++ 敵タイムテーブル(敵発生時間,敵設定数) = 150, 280, -20, 敵↓→移動, 隊列↓縦, 3 : 敵設定数++ 敵タイムテーブル(敵発生時間,敵設定数) = 250, 200, 10, 敵↓←移動, 隊列↓縦, 5 : 敵設定数++ Stage2_index=敵設定数 敵タイムテーブル(敵発生時間,敵設定数) = 0, 200, 0, 敵↓→移動, 隊列→横, 4 : 敵設定数++ 敵タイムテーブル(敵発生時間,敵設定数) = 100, 10, 350, 敵→移動, 隊列→横, 5 : 敵設定数++ 敵タイムテーブル(敵発生時間,敵設定数) = 200, 300, -20, 敵↓←移動, 隊列↓縦V, 11 : 敵設定数++ //でステージ2を開始する時に 敵タイムテーブルインデックス = Stage2_index TK_TIM = 0 //とすれば良い

>よし!一回日本語から変数にするか!
置き換え使えば直ぐだけど
文字列が多いのから置き返してけば誤変換も起し難い
全角の名前使ってるのは全部新しく追加した名前で
本ソース側で使ってる名前とかぶらないように全角を使ってる



ミント

リンク

2012/4/21(Sat) 08:36:07|NO.46196

_・)チラ

結局「NO.46017」のソースもよくわからなかった。
まぁ、簡単なほう?(NO.45972)で理解できなかったんだから仕方がないか・・・


>>NO.45972の利点を見て必要になったらもう一回考えてみたらいい
>>二次元配列が分かってるなら難しい事は何もしてない
そうですねー。気になったときに振り返ってみます。
難しいことはあんまりないはずなんだけど、時間がかかりそうなのでお礼だけを述べときます。
っていうか先に進みたい気持ちがどうしてもあr(殴


>>敵Aの動きをしてから敵Bの動きに変えるのがTEK_f()の内容を変えるだけで出来る
ある意味テキストのような感覚かな?
違う敵グループを追加するだけで変化することは理解できた。

>>ステージ追加が容易(ステージ別の敵タイムテーブルインデックスを用意すれば良い)
ほほーこれはいい考え方ですねー。
2面以降どうするかまだ決めてないので参考になりそうです。

今のところ・・・処理が終わった「gosub」とかに行かないように条件式を設ける予定。
でも、そうなると新しく「gosub」作って、敵の配置作って・・・っとバカみたいなので考え方を変えないとね。
そのときに(2面)なったらまた質問するかと思いますが、そのときはまたよろしくなのです。

まぁ、2面行く前に1面の問題が山積みなので先にそっちですけどね。
先のことを考えるのもいいんだけど、考えすぎて進まないのもよくない。
とくかく今は、1面を集中的にがんばって製作したいと思います。〆



たんす

リンク

2012/4/26(Thu) 01:11:05|NO.46272

「グループ1の敵情報(TEK_XやTEK_Y)を登録」という考え方から、
「敵を登録、動きはグループ1、初期位置は(x,y)」という考え方にしてみれば
敵タイムテーブルの仕様が理解しやすいかと思います。

グループ1専用の変数を用意しなくていいことから、
同じ軌道を持つ敵を量産できるのもいいですね。



ミント

リンク

2012/4/26(Thu) 22:09:28|NO.46278

>たんすさん
はわわわ。いつのまにコメントががががあ!


>>「敵を登録、動きはグループ1、初期位置は(x,y)」という考え方にしてみれば
>>敵タイムテーブルの仕様が理解しやすいかと思います。
敵のグループを登録して、初期位置さえ決めれば、後は動く・・・ってな感じかな。
(ちなみに、ロボットのパーツを交換的なイメージです)

>>グループ1専用の変数を用意しなくていいことから、
変数の管理もこれからどうするか考えないとなー・・・
2面以降になったら間違いなく膨れ上がるし。使いまわしでうまくいくか謎だし。
けど、やっぱそこは・・・

>>とくかく今は、1面を集中的にがんばって製作したいと思います。
と、決めたので今は止まるまで先に進むことにしました。
そんで迷子になったら思い出してソース使ってみるよ。
それでもだめだったらまた聞きにきます。

なるべく次のスレッドは「1面できました!」にしたいんだけど、
それはまだまだ先であり問題もまだまだ出てくるんだろうね!がんばるよ(´・ω・`)



ONION software Copyright 1997-2023(c) All rights reserved.