|
 |
|
2019/8/8(Thu) 21:27:53|NO.88021
少しお久しぶりです。
hspdxfix.asプラグインを使って複数種類のアイテムを出すことができたのですが、
種類ごとに判断をスマートに変える方法が思い浮かばなかったので質問します。
独特な作り方と、マイナーだと思われるプラグインなので、2週間ほど返答なかったら削除します。
今回、敵処理内にあるアイテム準備は処理が難しいので①~⑥まで番号を振ってみました。
初の試みなので逆に見づらかったらすいません。
■仕様■
・敵から出現するアイテムは合計で4個
・アイテム4個の内、2個はパワーアイテム、2個は点数
・パワーアイテム:自機強化、点数アイテム:点数増加
・点アイテムはわかりやすく縦に長くしています(本来はパワーアイテムと同じ大きさ)
☆やりたいこと☆
アイテムはスプライトで処理しているので、スプライトNoで個々に判断したい。
(この作り方だと、細かく判断するしか無いと思われるので、他の作り方がいいよっていうアドバイスでも可)
▲プラグイン仕様上やりにくいこと▲
・パワーアイテム、点数アイテムを別々に処理して、点数アイテムのtypeを16とかにする。
→typeは「1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768」の16種類しか使えないのであまり増やしたくない
(「ボム増加、1アップ」なども入れるので、typeが膨らむと大変なことに)
●やったこと●
/**/でコメントアウトしていることがやったことになります。
・増加してずらしてみる
アイテムスプライトの開始が150なので、「AI_no_c = 150」で代入する。
「アイテムの検索開始ナンバ-」と一致していれば、パワーアイテムを増加する。
そして、代入してた変数を+1増加させて・・・
そもそもアイテムと当たったときは、一瞬しか判断されないので足し算を行っても「AI_no_c = 150」でリセットされる。
・グループ分け
判断したいスプライトNoを「or」でまとめて、条件に達していればフラグを立てて、フラグが立っていればパワーアイテムを増加。
これだとフラグで判断してしまうため、どれをとっても「パワーアイテム」と判断されてしまう。
#include "hspdxfix.as" ;DXライブラリ使用
width ,,130,200 ;ウィンドウの位置
es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1
es_window 30,-30, 412,460 ;スプライト表示エリア設定
es_area 10,-30, 432,480 ;スプライト有効エリア設定
;---パワーアイテム---
es_size 12,12, 100
es_pat 150, 1,80
;---点アイテム---
es_size 12,20, 100
es_pat 180, 14,80
;---自機---
es_size 28,42, 100
es_pat 400, 0, 0
JIKI_x = 206 : JIKI_y = 390 ;座標
;---自機弾---
es_size 11,11, 100
es_pat 51, 1,43
;---敵---
es_size 50,38, 100
es_pat 70, 19,0
;敵配置
TEKI_MAX = 5 ;敵の最大数
dim TEKI_f,TEKI_MAX
dim TEKI_x,TEKI_MAX
dim TEKI_y,TEKI_MAX
;敵アイテム
TEKI_AI_MAX = 20 ;アイテムの最大数
dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ
dim P_AI_x,TEKI_AI_MAX
dim P_AI_y,TEKI_AI_MAX
;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼
TEKI_x = 80,150,220,290,360
TEKI_y = 300,300,300,300,300
;************メインループ***************
*メイン
es_cls
es_draw
pos 420,10 : es_mes "AI_HIT " + AI_HIT
pos 420,30 : es_mes "TN_HIT " + TN_HIT
pos 420,80 : es_mes "TEKI_DS_AI_f(0) " + TEKI_DS_AI_f(0)
pos 420,100 : es_mes "TEKI_DS_AI_f(1) " + TEKI_DS_AI_f(1)
pos 420,120 : es_mes "TEKI_DS_AI_f(2) " + TEKI_DS_AI_f(2)
pos 420,140 : es_mes "TEKI_DS_AI_f(3) " + TEKI_DS_AI_f(3)
pos 420,160 : es_mes "TEKI_DS_AI_f(4) " + TEKI_DS_AI_f(4)
pos 420,190 : es_mes "TEKI_DS_AI_f(5) " + TEKI_DS_AI_f(5)
pos 420,210 : es_mes "TEKI_DS_AI_f(6) " + TEKI_DS_AI_f(6)
pos 420,230 : es_mes "TEKI_DS_AI_f(7) " + TEKI_DS_AI_f(7)
pos 420,250 : es_mes "TEKI_DS_AI_f(8) " + TEKI_DS_AI_f(8)
pos 420,270 : es_mes "TEKI_DS_AI_f(9) " + TEKI_DS_AI_f(9)
;*************カウンター****************
gosub *自機の移動
gosub *自機弾移動
gosub *敵
gosub *敵アイテム
es_set 400, JIKI_x,JIKI_y, 400 ;自機表示
es_sync ;画面更新
await 16
goto *メイン
;**************自機の移動***************
*自機の移動
stick key,15 ;キー取得
if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動
if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動
if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動
if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動
return
;*************自機弾移動****************
*自機弾移動
JK_TAMA_G_kazu = 0
getkey keyZ,90 ;Zキー
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
JK_TAMA_dai_Kz = JK_TAMA_c \ 2
if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1
JK_TAMA_c++ ;ループ内カウンター
if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側
if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側
JKSO_y = JIKI_y
es_set JK_TAMA, JKSO_x,JKSO_y, 51 ;スプライトNo, X,Y座標 ,キャラNo
es_apos JK_TAMA, 0,-15 ,100 ;↑に移動
RENSA = 2 ;弾の間隔
es_type JK_TAMA,2 ;type値
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする
return
;*************敵****************
*敵
repeat TEKI_MAX ;敵の最大数(5)
if TEKI_f(cnt) = 0 {
TEKI_f(cnt) = 1
es_exnew TEKI, 80,84 ;新規スプライトNo
es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 70 ;スプライトNo, X,Y座標 ,キャラNo
es_type TEKI,4096
}
loop
;自機弾VS敵 当たり判定
TEKI_no = 80 ;敵の検索開始ナンバ-
AI_c = 0 ;①「アイテムフラグをオンにした回数」
AI_KZ = 4 ;②「アイテム数」
repeat TEKI_MAX ;敵の最大数(5)
es_find TEKI_D, 4096, TEKI_no,84 ;③「敵スプライト80~84の間を探す」
es_check TEKI_VS_TAMA ,TEKI_D,2 ;④「敵が自機弾と当たったら変数に-1を代入」
;アイテムスイッチ
TEKI_AI_DI_cnt = 0 ;⑤「アイテム配置変更」
TEKI_AI_no = 80 ;⑥「アイテム配置開始ナンバ-」
repeat TEKI_MAX ;敵の最大数(5)
;③「80~84の間を探した結果」、⑥「アイテム配置開始ナンバ-」が一致したら実行 (80 = 80,81 = 81...)
if TEKI_D = TEKI_AI_no {
TEKI_AI_cnt = TEKI_AI_DI_cnt ;⑥「アイテム配置変更」の結果を⑦に代入する (0,4...)
}
TEKI_AI_DI_cnt += AI_KZ ;⑤「アイテム配置変更」 + ②「アイテム数」(0,4...)
TEKI_AI_no += 1 ;⑥「アイテム配置開始ナンバ-」を「増加」
loop
;あたったら実行
if TEKI_VS_TAMA != -1 { ;④
es_kill TEKI_D ;自機弾「削除」
es_kill TEKI_VS_TAMA ;敵「削除」
;アイテムループ開始地点を変更することによって、好きな数づつずらすことができます
repeat TEKI_AI_MAX, TEKI_AI_cnt ;敵アイテム数(10),⑦ (0,4...)
TEKI_DS_AI_f(cnt) = 1 ;アイテムを出すフラグを「立てる」
AI_c++
if AI_c == AI_KZ : break ;①「アイテムフラグをオンにした回数」と ②「アイテム数」が一致したらループから抜ける
loop
}TEKI_no++
loop
return
;************敵アイテム*****************
*敵アイテム
TKTM_no = 80 ;敵の検索ナンバ-
AI_no = 150 ;アイテムの検索開始ナンバ-
repeat TEKI_MAX * AI_KZ ;敵の最大数 * ②「アイテム数」 (5 * 4 = 20)
if TEKI_DS_AI_f(cnt) = 1 { ;アイテムを出すフラグ
es_get P_AI_x(cnt),TKTM_no,3 ;スプライトX座標
es_get P_AI_y(cnt),TKTM_no,5 ;スプライトY座標
;キャラ番号をパワーから点数に変える
if AI_TUGI <= 1 : AI_HN = 150
if AI_TUGI >= 2 : AI_HN = 180
es_set AI_no, P_AI_x(cnt) + AI_TUGI*15, P_AI_y(cnt),AI_HN ;スプライトNo, X,Y座標 ,キャラNo
es_apos AI_no, 0,-1 ,100 ;↑に移動
es_type AI_no,8 ;アイテムtype値(8)
}
;アイテムを出す位置調整
AI_TUGI_c++ ;⑧アイテム送り
AI_TUGI = AI_TUGI_c \ AI_KZ ;⑧アイテム送り \ ②「アイテム数」 (1 \ 4 = 1,2 \ 4 = 2)
if AI_TUGI = 0 : TKTM_no++ ;余りが0だったら、敵の検索ナンバ-を「増加」
if AI_TUGI_c >= AI_KZ : AI_TUGI_c = 0 ;敵の検索ナンバ-
AI_no++ ;敵の検索ナンバ-
loop
;当たり判定
; 400(自機),8(アイテム)
es_check JIKI_VS_TEKI_AI ,400,8
if JIKI_VS_TEKI_AI != -1 {
es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」
AI_no = 150 ;アイテムの検索開始ナンバ-
repeat TEKI_AI_MAX ;敵のアイテム数(10)
if JIKI_VS_TEKI_AI = AI_no { ;取ったアイテムとアイテムの検索開始ナンバ-が一致したら「実行」
/*
;増加してずらしてみる → あたった瞬間のみ増加するので一瞬で通り過ぎてしまい、2つめ以降は認識されない
AI_no_c = 150
if AI_no = AI_no_c : AI_HIT++ : AI_no_c += 1;点アイテム増加
if AI_no = AI_no_c : AI_HIT++ : AI_no_c += 3;点アイテム増加
*/
/*
;グループ分け → フラグが立っちゃっているので、どっち取得しても判断される
if AI_no = 150 or AI_no = 151 or AI_no = 154 or AI_no = 155 : AI_TN = 1
if AI_TN = 1 : AI_HIT++ ;パワーアイテム増加
*/
;個々にアイテムを判断する
;パワーアイテム増加
if AI_no = 150 or AI_no = 151 or AI_no = 154 or AI_no = 155 : AI_HIT++
if AI_no = 158 or AI_no = 159 or AI_no = 162 or AI_no = 163 : AI_HIT++
if AI_no = 166 or AI_no = 167 or AI_no = 170 or AI_no = 171 : AI_HIT++
if AI_no = 174 or AI_no = 175 or AI_no = 178 or AI_no = 189 : AI_HIT++
if AI_no = 182 or AI_no = 183 or AI_no = 186 or AI_no = 197 : AI_HIT++
;点アイテム増加
if AI_no = 152 or AI_no = 153 or AI_no = 156 or AI_no = 157 : TN_HIT++
if AI_no = 160 or AI_no = 161 or AI_no = 164 or AI_no = 165 : TN_HIT++
if AI_no = 168 or AI_no = 169 or AI_no = 172 or AI_no = 173 : TN_HIT++
if AI_no = 176 or AI_no = 177 or AI_no = 180 or AI_no = 181 : TN_HIT++
if AI_no = 184 or AI_no = 185 or AI_no = 188 or AI_no = 189 : TN_HIT++
TEKI_DS_AI_f(cnt) = 2 ;アイテムを出すフラグを2にする
}
AI_no++ ;アイテムの検索開始ナンバ-
loop
}
return

| |
|
2019/8/14(Wed) 22:10:56|NO.88045
itemtypes という配列を用意して
そこに パワーアップ とか 得点 の種別を格納するような方法でやってみました。
#include "hspdxfix.as" ;DXライブラリ使用
#const BIT_MYSHOT 2
#const BIT_ITEM 8
#const BIT_TEKI 4096
// アイテム種別
#enum ITEM_NONE = 0
#enum ITEM_POWER
#enum ITEM_PTS
#enum ITEM_BOMB
#enum ITEM_ONEUP
// アイテムに割り振るスプライトnoの開始と個数
#const ITEM_SPR_HEAD 150
#const ITEM_SPR_NUM 20
#const ITEM_SPR_TAIL (ITEM_SPR_HEAD+ITEM_SPR_NUM-1)
#const TEKI_SPR_HEAD 80
#const TEKI_SPR_NUM 5
#const TEKI_SPR_TAIL (TEKI_SPR_HEAD+TEKI_SPR_NUM-1)
// 自機スプライトno
#const MY_SPR 511
// キャラクタno
#const CHR_POWER 150
#const CHR_PTS 180
#const CHR_MY 400
width ,,130,200 ;ウィンドウの位置
es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1
es_window 30,-30, 412,460 ;スプライト表示エリア設定
es_area 10,-30, 432,480 ;スプライト有効エリア設定
;---パワーアイテム---
es_size 12,12, 100
es_pat CHR_POWER, 1,80
;---点アイテム---
es_size 12,20, 100
es_pat CHR_PTS, 14,80
;---自機---
es_size 28,42, 100
es_pat CHR_MY, 0, 0
JIKI_x = 206 : JIKI_y = 390 ;座標
;---自機弾---
es_size 11,11, 100
es_pat 51, 1,43
;---敵---
es_size 50,38, 100
es_pat 70, 19,0
;敵配置
TEKI_MAX = 5 ;敵の最大数
dim TEKI_f,TEKI_MAX
dim TEKI_x,TEKI_MAX
dim TEKI_y,TEKI_MAX
;敵アイテム
TEKI_AI_MAX = 20 ;アイテムの最大数
dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ
// 追加
dim itemtypes, TEKI_AI_MAX
dim itemtekiindices, TEKI_AI_MAX
foreach itemtekiindices
itemtekiindices(cnt) = -1
loop
;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼
TEKI_x = 80,150,220,290,360
TEKI_y = 300,300,300,300,300
;************メインループ***************
*メイン
es_cls
es_draw
pos 420,10 : es_mes "AI_HIT " + AI_HIT
pos 420,30 : es_mes "TN_HIT " + TN_HIT
/*
pos 420,80 : es_mes "TEKI_DS_AI_f(0) " + TEKI_DS_AI_f(0)
pos 420,100 : es_mes "TEKI_DS_AI_f(1) " + TEKI_DS_AI_f(1)
pos 420,120 : es_mes "TEKI_DS_AI_f(2) " + TEKI_DS_AI_f(2)
pos 420,140 : es_mes "TEKI_DS_AI_f(3) " + TEKI_DS_AI_f(3)
pos 420,160 : es_mes "TEKI_DS_AI_f(4) " + TEKI_DS_AI_f(4)
pos 420,190 : es_mes "TEKI_DS_AI_f(5) " + TEKI_DS_AI_f(5)
pos 420,210 : es_mes "TEKI_DS_AI_f(6) " + TEKI_DS_AI_f(6)
pos 420,230 : es_mes "TEKI_DS_AI_f(7) " + TEKI_DS_AI_f(7)
pos 420,250 : es_mes "TEKI_DS_AI_f(8) " + TEKI_DS_AI_f(8)
pos 420,270 : es_mes "TEKI_DS_AI_f(9) " + TEKI_DS_AI_f(9) */
;*************カウンター****************
gosub *自機の移動
gosub *自機弾移動
gosub *敵
gosub *当たり判定
es_set MY_SPR, JIKI_x,JIKI_y, CHR_MY ;自機表示
es_sync ;画面更新
await 16
goto *メイン
;**************自機の移動***************
*自機の移動
stick key,15 ;キー取得
if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動
if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動
if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動
if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動
return
;*************自機弾移動****************
*自機弾移動
JK_TAMA_G_kazu = 0
getkey keyZ,90 ;Zキー
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
JK_TAMA_dai_Kz = JK_TAMA_c \ 2
if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1
JK_TAMA_c++ ;ループ内カウンター
if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側
if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側
JKSO_y = JIKI_y
es_set JK_TAMA, JKSO_x,JKSO_y, 51 ;スプライトNo, X,Y座標 ,キャラNo
es_apos JK_TAMA, 0,-15 ,100 ;↑に移動
RENSA = 2 ;弾の間隔
es_type JK_TAMA, BIT_MYSHOT ;type値
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする
return
;*************敵****************
*敵
repeat TEKI_MAX ;敵の最大数(5)
if TEKI_f(cnt) = 0 {
TEKI_f(cnt) = 1
es_exnew TEKI, TEKI_SPR_HEAD, TEKI_SPR_TAIL ;新規スプライトNo
es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 70 ;スプライトNo, X,Y座標 ,キャラNo
es_type TEKI, BIT_TEKI
}
loop
;自機弾VS敵 当たり判定
TEKI_no = TEKI_SPR_HEAD ;敵の検索開始ナンバ-
AI_KZ = 4 ;②「アイテム数」
repeat
es_find TEKI_D, BIT_TEKI, TEKI_no, TEKI_SPR_TAIL ;③「敵スプライト80~84の間を探す」
if TEKI_D == -1 {
break
}
es_check TEKI_VS_TAMA ,TEKI_D, BIT_MYSHOT ;④「敵が自機弾と当たったら変数に not -1を代入」
;あたったら実行
if TEKI_VS_TAMA != -1 {
TKTM_no = TEKI_D
gosub *敵アイテム
es_kill TEKI_D ;敵「削除」
es_kill TEKI_VS_TAMA ;自弾「削除」
}
TEKI_no++
loop
return
;************敵アイテム*****************
*敵アイテム
es_get x,TKTM_no,3 ;スプライトX座標
es_get y,TKTM_no,5 ;スプライトY座標
repeat AI_KZ
AI_TUGI = cnt
es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL
if AI_no == -1 {
break
}
index = AI_no - ITEM_SPR_HEAD
;キャラ番号をパワーから点数に変える
if AI_TUGI <= 1 {
AI_HN = CHR_POWER
itemtypes(index) = ITEM_POWER
}
if AI_TUGI >= 2 {
AI_HN = CHR_PTS
itemtypes(index) = ITEM_PTS
}
es_set AI_no, x + AI_TUGI*15, y, AI_HN ;スプライトNo, X,Y座標 ,キャラNo
es_apos AI_no, 0,-1 ,100 ;↑に移動
es_type AI_no, BIT_ITEM ;アイテムtype値(8)
itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD
loop
return
*当たり判定
repeat
; 400(自機),8(アイテム)
es_check JIKI_VS_TEKI_AI, MY_SPR, BIT_ITEM
if JIKI_VS_TEKI_AI == -1 {
break
}
es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」
index = JIKI_VS_TEKI_AI - ITEM_SPR_HEAD
if (index >= 0) & (index < ITEM_SPR_NUM) {
itemtype = itemtypes(index)
// 0 ~ TEKI_MAX-1 でインデックスが得られる
tekiindex = itemtekiindices(index)
if (itemtype == ITEM_POWER) {
AI_HIT++
}
if (itemtype == ITEM_PTS) {
TN_HIT++
}
itemtypes(index) = ITEM_NONE
//TEKI_DS_AI_f(tekiindex) = 2 ;アイテムを出すフラグを2にする
}
loop
return
TEKI_DS_AI_f 配列の更新(0→1→2)はオミットしてあります。

| |
|
2019/8/15(Thu) 23:07:35|NO.88063
砂時 計さんソースありがとうございます!
ちょっと解読にお時間かかります(≡ω≡.) マクロとか使ってないもんで・・・
内容を理解したらお返事しますね~
|
|
2019/8/18(Sun) 16:34:43|NO.88123
理解できました。
すごくスマートなソースでびっくりしています。
過去にやったことが色んなことに応用できそうです。
171:index = AI_no - ITEM_SPR_HEAD
4個づつ配列を作っているんですね。cntだと0からスタートしてしまうため、この方法がいいっていうことがわかりました。
疑問に思ったところがあります。
187:itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD
204:tekiindex = itemtekiindices(index)
上記は、「214:TEKI_DS_AI_f(tekiindex) = 2」のために用意した物なのでしょうか。
後、「201:if (index >= 0) & (index < ITEM_SPR_NUM) {」は保険の為に入れてある条件式になるのでしょうか。
|
|
2019/8/19(Mon) 21:06:16|NO.88144
> 187:itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD
> 204:tekiindex = itemtekiindices(index)
>
> 上記は、「214:TEKI_DS_AI_f(tekiindex) = 2」のために用意した物なのでしょうか。
はい。
元の TEKI_DS_AI_f 配列は1アイテムごとの配列で
tekiindex は1敵機ごとの配列と対象が違ったのでコメントアウトしましたが
仮にどのインデックスの敵機から出現したアイテムかを後から
参照したい場合でも参照可能です、という意図です。
アイテム出現時にアイテムの性質(種別)が決まれば十分な場合は
itemtekiindices 配列は不要です。
> 後、「201:if (index >= 0) & (index < ITEM_SPR_NUM) {」は保険の為に入れてある条件式になるのでしょうか。
はい。
当たり判定で存在しない場合は -1 で先にループを抜けています。
当たる対象が常に HEAD ~ TAIL の範囲内と決まっている場合は不要となります。
|
|
2019/8/19(Mon) 23:12:13|NO.88150
砂時 計さんお返事ありがとうございます。
やはりそうだったんですね。これでスッキリしました!
ただ、新しい疑問が出てしまいました・・・orz
>>当たる対象が常に HEAD ~ TAIL の範囲内と決まっている場合は不要となります。
HEAD ~ TAILとはどのような物なのでしょうか。検索してもいまいちしっくりこなくって・・・
(初めて聞く単語なのです)
そういえばアイテムの上下を入れてたので、せっかくなので途中から下に移動する処理を入れました
この方法だと・・・連続でアイテムを出すとアウトになるので修正します。
こんなに素敵なヒントが沢山あるんだ出来るはずなんだ!
先に↑↑のお返事を書きたくってレスをしました。
上下はなんとか自力でがんばります。ひぃひぃいったら聞きます。
#include "hspdxfix.as" ;DXライブラリ使用
#const BIT_MYSHOT 2
#const BIT_ITEM 8
#const BIT_TEKI 4096
// アイテム種別
#enum ITEM_NONE = 0
#enum ITEM_POWER
#enum ITEM_PTS
#enum ITEM_BOMB
#enum ITEM_ONEUP
// アイテムに割り振るスプライトnoの開始と個数
#const ITEM_SPR_HEAD 150
#const ITEM_SPR_NUM 20
#const ITEM_SPR_TAIL (ITEM_SPR_HEAD+ITEM_SPR_NUM-1)
#const TEKI_SPR_HEAD 80
#const TEKI_SPR_NUM 5
#const TEKI_SPR_TAIL (TEKI_SPR_HEAD+TEKI_SPR_NUM-1)
// 自機スプライトno
#const MY_SPR 511
// キャラクタno
#const CHR_POWER 150
#const CHR_PTS 180
#const CHR_MY 400
width ,,130,200 ;ウィンドウの位置
es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1
es_window 30,-30, 412,460 ;スプライト表示エリア設定
es_area 10,-30, 432,480 ;スプライト有効エリア設定
;---パワーアイテム---
es_size 12,12, 100
es_pat CHR_POWER, 1,80
;---点アイテム---
es_size 12,20, 100
es_pat CHR_PTS, 14,80
;---自機---
es_size 28,42, 100
es_pat CHR_MY, 0, 0
JIKI_x = 206 : JIKI_y = 390 ;座標
;---自機弾---
es_size 11,11, 100
es_pat 51, 1,43
;---敵---
es_size 50,38, 100
es_pat 70, 19,0
;敵配置
TEKI_MAX = 5 ;敵の最大数
dim TEKI_f,TEKI_MAX
dim TEKI_x,TEKI_MAX
dim TEKI_y,TEKI_MAX
;敵アイテム
TEKI_AI_MAX = 20 ;アイテムの最大数
dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ
// 追加
dim itemtypes, TEKI_AI_MAX
dim itemtekiindices, TEKI_AI_MAX
foreach itemtekiindices
itemtekiindices(cnt) = -1
loop
;---追加---
dim AI_Jc,TEKI_AI_MAX ;上昇カウント
;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼
TEKI_x = 80,150,220,290,360
TEKI_y = 300,300,300,300,300
;************メインループ***************
*メイン
es_cls
es_draw
pos 420,10 : es_mes "AI_HIT " + AI_HIT
pos 420,30 : es_mes "TN_HIT " + TN_HIT
;---追加----
pos 370,110 : es_mes "AI_Jc(0) " + AI_Jc(0)
pos 370,130 : es_mes "AI_Jc(1) " + AI_Jc(1)
pos 370,150 : es_mes "AI_Jc(2) " + AI_Jc(2)
pos 370,170 : es_mes "AI_Jc(3) " + AI_Jc(3)
pos 510,110 : es_mes "AI_Jc(4) " + AI_Jc(4)
pos 510,130 : es_mes "AI_Jc(5) " + AI_Jc(5)
pos 510,150 : es_mes "AI_Jc(6) " + AI_Jc(6)
pos 510,170 : es_mes "AI_Jc(7) " + AI_Jc(7)
pos 370,200 : es_mes "AI_Jc(8) " + AI_Jc(8)
pos 370,220 : es_mes "AI_Jc(9) " + AI_Jc(9)
pos 370,240 : es_mes "AI_Jc(10) " + AI_Jc(10)
pos 370,260 : es_mes "AI_Jc(11) " + AI_Jc(11)
pos 510,200 : es_mes "AI_Jc(12) " + AI_Jc(12)
pos 510,220 : es_mes "AI_Jc(13) " + AI_Jc(13)
pos 510,240 : es_mes "AI_Jc(14) " + AI_Jc(14)
pos 510,260 : es_mes "AI_Jc(15) " + AI_Jc(15)
;*************カウンター****************
gosub *自機の移動
gosub *自機弾移動
gosub *敵
gosub *当たり判定
es_set MY_SPR, JIKI_x,JIKI_y, CHR_MY ;自機表示
es_sync ;画面更新
await 16
goto *メイン
;**************自機の移動***************
*自機の移動
stick key,15 ;キー取得
if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動
if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動
if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動
if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動
return
;*************自機弾移動****************
*自機弾移動
JK_TAMA_G_kazu = 0
getkey keyZ,90 ;Zキー
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
JK_TAMA_dai_Kz = JK_TAMA_c \ 2
if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1
JK_TAMA_c++ ;ループ内カウンター
if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側
if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側
JKSO_y = JIKI_y
es_set JK_TAMA, JKSO_x,JKSO_y, 51 ;スプライトNo, X,Y座標 ,キャラNo
es_apos JK_TAMA, 0,-15 ,100 ;↑に移動
RENSA = 2 ;弾の間隔
es_type JK_TAMA, BIT_MYSHOT ;type値
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする
return
;*************敵****************
*敵
repeat TEKI_MAX ;敵の最大数(5)
if TEKI_f(cnt) = 0 {
TEKI_f(cnt) = 1
es_exnew TEKI, TEKI_SPR_HEAD, TEKI_SPR_TAIL ;新規スプライトNo
es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 70 ;スプライトNo, X,Y座標 ,キャラNo
es_type TEKI, BIT_TEKI
}
loop
;自機弾VS敵 当たり判定
TEKI_no = TEKI_SPR_HEAD ;敵の検索開始ナンバ-
AI_KZ = 4 ;②「アイテム数」
repeat
es_find TEKI_D, BIT_TEKI, TEKI_no, TEKI_SPR_TAIL ;③「敵スプライト80~84の間を探す」
if TEKI_D == -1 {
break
}
es_check TEKI_VS_TAMA ,TEKI_D, BIT_MYSHOT ;④「敵が自機弾と当たったら変数に not -1を代入」
;あたったら実行
if TEKI_VS_TAMA != -1 {
TKTM_no = TEKI_D
gosub *敵アイテム
es_kill TEKI_D ;敵「削除」
es_kill TEKI_VS_TAMA ;自弾「削除」
}
TEKI_no++
loop
;---追加----
;アイテム移動処理
AI_no = 150 ;でかい敵アイテムの検索ID
if itemtypes(0) = 1 {
repeat AI_KZ ;②「アイテム数」(4)
AI_Jc(cnt) += 1 ;アイテム上昇カウント
if AI_Jc(cnt) >= 95 {
es_apos AI_no, 0,1 ,100 ;↓に移動
}
AI_no++ ;でかい敵アイテムの検索ID
loop
}
return
;************敵アイテム*****************
*敵アイテム
es_get x,TKTM_no,3 ;スプライトX座標
es_get y,TKTM_no,5 ;スプライトY座標
repeat AI_KZ
AI_TUGI = cnt
es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL
if AI_no == -1 {
break
}
index = AI_no - ITEM_SPR_HEAD
;キャラ番号をパワーから点数に変える
if AI_TUGI <= 1 {
AI_HN = CHR_POWER
itemtypes(index) = ITEM_POWER
}
if AI_TUGI >= 2 {
AI_HN = CHR_PTS
itemtypes(index) = ITEM_PTS
}
es_set AI_no, x + AI_TUGI*15, y, AI_HN ;スプライトNo, X,Y座標 ,キャラNo
es_apos AI_no, 0,-1 ,100 ;↑に移動
es_type AI_no, BIT_ITEM ;アイテムtype値(8)
itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD
loop
return
;*********アイテム当たり判定*****************
*当たり判定
repeat
; 400(自機),8(アイテム)
es_check JIKI_VS_TEKI_AI, MY_SPR, BIT_ITEM
if JIKI_VS_TEKI_AI == -1 {
break
}
es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」
index = JIKI_VS_TEKI_AI - ITEM_SPR_HEAD
if (index >= 0) & (index < ITEM_SPR_NUM) {
itemtype = itemtypes(index)
// 0 ~ TEKI_MAX-1 でインデックスが得られる
tekiindex = itemtekiindices(index)
if (itemtype == ITEM_POWER) {
AI_HIT++
}
if (itemtype == ITEM_PTS) {
TN_HIT++
}
itemtypes(index) = ITEM_NONE
;---追加----
AI_Jc(index) = 0 ;アイテム上昇カウント【リセット】
//TEKI_DS_AI_f(tekiindex) = 2 ;アイテムを出すフラグを2にする
}
loop
return

| |
|
2019/8/20(Tue) 21:58:59|NO.88153
> es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL
これは私の使っている命名規則で
HEAD と TAIL は頭としっぽです。
通常、開始と終了の意味の変数(や引数や定数)は
start, end だったり from, to だったりしますが
APIによってはたまに終了に指定する値を含まなかったりします(HSP3以外を含む)。
※例えば JavaScript の String.substring(indexStart, indexEnd) とか。
es_exnew は es_exnew AI_no, 80, 84 と指定した場合
80~84の空いているスプライトナンバーが得られる関数であり
84は含まれます。
私はこのような場合の 84 を格納する定数に TAIL という名前をつける習慣にしています。
|
|
2019/8/20(Tue) 22:13:20|NO.88156
HEAD と TAILはそういうことだったんですね。
ヘッドとテイルで、頭としっぽ・・!
なるほどそういう名前の付け方もあるんですね。
なにかに収納する機会が増えた結果、変数名に困ることがあったので参考にしてみます。
上下は3日ぐらいしたらリバースしてきます(時間が本当にかかるので先にお返事書きたい勢
|
|
2019/8/24(Sat) 19:54:44|NO.88185
やっと時間作れたので、アイテムが上下に移動するソースを作れました。
「流れ」
・アイテムの処理を通過した回数をカウントする(AI_TU_c += 1)
・アイテム通過カウントによって、アイテム動くフラグを立てる(AI_UGO_f(0~4))
・アイテム動くフラグが立っていたら、アイテム上昇をカウントする
・アイテム上昇が特定の数値になったら、カウント数によって動かすアイテムを決める
・動かすアイテムを下に移動させる
こんな感じに設計したのですが、やはりスマートにできていないです・・・・
なんていうかセンスがない・・orz
すいません。お手数ですがヒントだけでもいいのでアドバイスがほしいです。
#include "hspdxfix.as" ;DXライブラリ使用
#const BIT_MYSHOT 2
#const BIT_ITEM 8
#const BIT_TEKI 4096
// アイテム種別
#enum ITEM_NONE = 0
#enum ITEM_POWER
#enum ITEM_PTS
#enum ITEM_BOMB
#enum ITEM_ONEUP
// アイテムに割り振るスプライトnoの開始と個数
#const ITEM_SPR_HEAD 150
#const ITEM_SPR_NUM 20
#const ITEM_SPR_TAIL (ITEM_SPR_HEAD+ITEM_SPR_NUM-1)
#const TEKI_SPR_HEAD 80
#const TEKI_SPR_NUM 5
#const TEKI_SPR_TAIL (TEKI_SPR_HEAD+TEKI_SPR_NUM-1)
// 自機スプライトno
#const MY_SPR 511
// キャラクタno
#const CHR_POWER 150
#const CHR_PTS 180
#const CHR_MY 400
width ,,130,200 ;ウィンドウの位置
es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1
es_window 30,-30, 412,460 ;スプライト表示エリア設定
es_area 10,-30, 432,480 ;スプライト有効エリア設定
;---パワーアイテム---
es_size 12,12, 100
es_pat CHR_POWER, 1,80
;---点アイテム---
es_size 12,20, 100
es_pat CHR_PTS, 14,80
;---自機---
es_size 28,42, 100
es_pat CHR_MY, 0, 0
JIKI_x = 206 : JIKI_y = 390 ;座標
;---自機弾---
es_size 11,11, 100
es_pat 51, 1,43
;---敵---
es_size 50,38, 100
es_pat 70, 19,0
;敵配置
TEKI_MAX = 5 ;敵の最大数
dim TEKI_f,TEKI_MAX
dim TEKI_x,TEKI_MAX
dim TEKI_y,TEKI_MAX
;敵アイテム
TEKI_AI_MAX = 20 ;アイテムの最大数
dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ
// 追加
dim itemtypes, TEKI_AI_MAX
dim itemtekiindices, TEKI_AI_MAX
foreach itemtekiindices
itemtekiindices(cnt) = -1
loop
;---追加---
dim AI_Jc,TEKI_AI_MAX ;上昇カウント
dim AI_UGO_f,TEKI_AI_MAX ;アイテム動くフラグ
;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼
TEKI_x = 80,150,220,290,360
TEKI_y = 300,300,300,300,300
;************メインループ***************
*メイン
es_cls
es_draw
pos 420,10 : es_mes "AI_HIT " + AI_HIT
pos 420,30 : es_mes "TN_HIT " + TN_HIT
;---追加----
pos 370,110 : es_mes "AI_Jc(0) " + AI_Jc(0)
pos 370,130 : es_mes "AI_Jc(1) " + AI_Jc(1)
pos 370,150 : es_mes "AI_Jc(2) " + AI_Jc(2)
pos 370,170 : es_mes "AI_Jc(3) " + AI_Jc(3)
pos 370,190 : es_mes "AI_Jc(4) " + AI_Jc(4)
;*************カウンター****************
gosub *自機の移動
gosub *自機弾移動
gosub *敵
gosub *当たり判定
es_set MY_SPR, JIKI_x,JIKI_y, CHR_MY ;自機表示
es_sync ;画面更新
await 16
goto *メイン
;**************自機の移動***************
*自機の移動
stick key,15 ;キー取得
if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動
if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動
if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動
if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動
return
;*************自機弾移動****************
*自機弾移動
JK_TAMA_G_kazu = 0
getkey keyZ,90 ;Zキー
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
JK_TAMA_dai_Kz = JK_TAMA_c \ 2
if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1
JK_TAMA_c++ ;ループ内カウンター
if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側
if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側
JKSO_y = JIKI_y
es_set JK_TAMA, JKSO_x,JKSO_y, 51 ;スプライトNo, X,Y座標 ,キャラNo
es_apos JK_TAMA, 0,-15 ,100 ;↑に移動
RENSA = 2 ;弾の間隔
es_type JK_TAMA, BIT_MYSHOT ;type値
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする
return
;*************敵****************
*敵
repeat TEKI_MAX ;敵の最大数(5)
if TEKI_f(cnt) = 0 {
TEKI_f(cnt) = 1
es_exnew TEKI, TEKI_SPR_HEAD, TEKI_SPR_TAIL ;新規スプライトNo
es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 70 ;スプライトNo, X,Y座標 ,キャラNo
es_type TEKI, BIT_TEKI
}
loop
;自機弾VS敵 当たり判定
TEKI_no = TEKI_SPR_HEAD ;敵の検索開始ナンバ-
AI_KZ = 4 ;②「アイテム数」
repeat
es_find TEKI_D, BIT_TEKI, TEKI_no, TEKI_SPR_TAIL ;③「敵スプライト80~84の間を探す」
if TEKI_D == -1 {
break
}
es_check TEKI_VS_TAMA ,TEKI_D, BIT_MYSHOT ;④「敵が自機弾と当たったら変数に not -1を代入」
;あたったら実行
if TEKI_VS_TAMA != -1 {
TKTM_no = TEKI_D
gosub *敵アイテム
es_kill TEKI_D ;敵「削除」
es_kill TEKI_VS_TAMA ;自弾「削除」
}
TEKI_no++
loop
;---追加----
;アイテム移動処理
if AI_TU_c = 4 : AI_UGO_f(0) = 1
if AI_TU_c = 8 : AI_UGO_f(1) = 1
if AI_TU_c = 12 : AI_UGO_f(2) = 1
if AI_TU_c = 16 : AI_UGO_f(3) = 1
if AI_TU_c = 20 : AI_UGO_f(4) = 1 : AI_TU_c += 1 ;ずっと実行させないために+1する
repeat TEKI_MAX ;敵の最大数(5)
if AI_UGO_f(cnt) = 1 { ;アイテム動くフラグ
AI_Jc(cnt) += 1 ;アイテム上昇カウント
if AI_Jc(cnt) >= 95 {
AI_UGO_f(cnt) = 0;アイテムを取得したときに、アイテムが再発生してしまうのを防止する
if cnt = 0 : AI_no = 150
if cnt = 1 : AI_no = 154
if cnt = 2 : AI_no = 158
if cnt = 3 : AI_no = 162
if cnt = 4 : AI_no = 166
repeat AI_KZ ;②「アイテム数」(4)
es_apos AI_no, 0,1 ,100 ;↓に移動
AI_no++
loop
}
}
loop
return
;************敵アイテム*****************
*敵アイテム
es_get x,TKTM_no,3 ;スプライトX座標
es_get y,TKTM_no,5 ;スプライトY座標
repeat AI_KZ
AI_TUGI = cnt
es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL
if AI_no == -1 {
break
}
index = AI_no - ITEM_SPR_HEAD
;---追加----
AI_TU_c += 1 ;通った回数をカウントする
;キャラ番号をパワーから点数に変える
if AI_TUGI <= 1 {
AI_HN = CHR_POWER
itemtypes(index) = ITEM_POWER
}
if AI_TUGI >= 2 {
AI_HN = CHR_PTS
itemtypes(index) = ITEM_PTS
}
es_set AI_no, x + AI_TUGI*15, y, AI_HN ;スプライトNo, X,Y座標 ,キャラNo
es_apos AI_no, 0,-1 ,100 ;↑に移動
es_type AI_no, BIT_ITEM ;アイテムtype値(8)
itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD
loop
return
;*********アイテム当たり判定*****************
*当たり判定
repeat
; 400(自機),8(アイテム)
es_check JIKI_VS_TEKI_AI, MY_SPR, BIT_ITEM
if JIKI_VS_TEKI_AI == -1 {
break
}
es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」
index = JIKI_VS_TEKI_AI - ITEM_SPR_HEAD
if (index >= 0) & (index < ITEM_SPR_NUM) {
itemtype = itemtypes(index)
// 0 ~ TEKI_MAX-1 でインデックスが得られる
tekiindex = itemtekiindices(index)
if (itemtype == ITEM_POWER) {
AI_HIT++
}
if (itemtype == ITEM_PTS) {
TN_HIT++
}
itemtypes(index) = ITEM_NONE
;---追加----
AI_Jc(index) = 0 ;アイテム上昇カウント【リセット】
}
loop
return

| |
|
2019/8/26(Mon) 22:00:27|NO.88213
アイテムが落下に転じるフレームカウンタ数を
アイテムごとに保持する方法でやってみました。
item_turns, frame_counter あたりを見てみてください。
#include "hspdxfix.as" ;DXライブラリ使用
#const BIT_MYSHOT 2
#const BIT_ITEM 8
#const BIT_TEKI 4096
// アイテム種別
#enum ITEM_NONE = 0
#enum ITEM_POWER
#enum ITEM_PTS
#enum ITEM_BOMB
#enum ITEM_ONEUP
// アイテムに割り振るスプライトnoの開始と個数
#const ITEM_SPR_HEAD 150
#const ITEM_SPR_NUM 20
#const ITEM_SPR_TAIL (ITEM_SPR_HEAD+ITEM_SPR_NUM-1)
#const TEKI_SPR_HEAD 80
#const TEKI_SPR_NUM 5
#const TEKI_SPR_TAIL (TEKI_SPR_HEAD+TEKI_SPR_NUM-1)
// 自機スプライトno
#const MY_SPR 511
// キャラクタno
#const CHR_MYSHOT 51
#const CHR_TEKI 70
#const CHR_POWER 150
#const CHR_PTS 180
#const CHR_MY 400
// アイテムが出現してから何フレームで下へターンするか
#const TURN_FRAME 95
width ,,130,200 ;ウィンドウの位置
es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1
es_window 30,-30, 412,460 ;スプライト表示エリア設定
es_area 10,-30, 432,480 ;スプライト有効エリア設定
;---パワーアイテム---
es_size 12,12, 100
es_pat CHR_POWER, 1,80
;---点アイテム---
es_size 12,20, 100
es_pat CHR_PTS, 14,80
;---自機---
es_size 28,42, 100
es_pat CHR_MY, 0, 0
JIKI_x = 206 : JIKI_y = 390 ;座標
;---自機弾---
es_size 11,11, 100
es_pat CHR_MYSHOT, 1,43
;---敵---
es_size 50,38, 100
es_pat CHR_TEKI, 19,0
;敵配置
TEKI_MAX = 5 ;敵の最大数
dim TEKI_f,TEKI_MAX
dim TEKI_x,TEKI_MAX
dim TEKI_y,TEKI_MAX
;敵アイテム
TEKI_AI_MAX = 20 ;アイテムの最大数
dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ
// 追加
dim itemtypes, TEKI_AI_MAX
dim itemtekiindices, TEKI_AI_MAX
foreach itemtekiindices
itemtekiindices(cnt) = -1
loop
;---追加---
dim AI_Jc,TEKI_AI_MAX ;上昇カウント
dim AI_UGO_f,TEKI_AI_MAX ;アイテム動くフラグ
// 追加
dim item_turns, TEKI_AI_MAX
;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼
TEKI_x = 80,150,220,290,360
TEKI_y = 300,300,300,300,300
// フレームごとに増えていく全体カウンタ
frame_counter = -1
;************メインループ***************
*メイン
frame_counter += 1
es_cls
es_draw
pos 420,10 : es_mes "AI_HIT " + AI_HIT
pos 420,30 : es_mes "TN_HIT " + TN_HIT
;---追加----
pos 370,110 : es_mes "AI_Jc(0) " + AI_Jc(0)
pos 370,130 : es_mes "AI_Jc(1) " + AI_Jc(1)
pos 370,150 : es_mes "AI_Jc(2) " + AI_Jc(2)
pos 370,170 : es_mes "AI_Jc(3) " + AI_Jc(3)
pos 370,190 : es_mes "AI_Jc(4) " + AI_Jc(4)
;*************カウンター****************
gosub *自機の移動
gosub *自機弾移動
gosub *敵
gosub *当たり判定
gosub *アイテムターン
es_set MY_SPR, JIKI_x,JIKI_y, CHR_MY ;自機表示
es_sync ;画面更新
await 16
goto *メイン
;**************自機の移動***************
*自機の移動
stick key,15 ;キー取得
if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動
if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動
if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動
if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動
return
;*************自機弾移動****************
*自機弾移動
JK_TAMA_G_kazu = 0
getkey keyZ,90 ;Zキー
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
JK_TAMA_dai_Kz = JK_TAMA_c \ 2
if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1
JK_TAMA_c++ ;ループ内カウンター
if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側
if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側
JKSO_y = JIKI_y
es_set JK_TAMA, JKSO_x,JKSO_y, CHR_MYSHOT ;スプライトNo, X,Y座標 ,キャラNo
es_apos JK_TAMA, 0,-15 ,100 ;↑に移動
RENSA = 2 ;弾の間隔
es_type JK_TAMA, BIT_MYSHOT ;type値
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする
return
;*************敵****************
*敵
repeat TEKI_MAX ;敵の最大数(5)
if TEKI_f(cnt) = 0 {
TEKI_f(cnt) = 1
es_exnew TEKI, TEKI_SPR_HEAD, TEKI_SPR_TAIL ;新規スプライトNo
es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), CHR_TEKI ;スプライトNo, X,Y座標 ,キャラNo
es_type TEKI, BIT_TEKI
}
loop
;自機弾VS敵 当たり判定
TEKI_no = TEKI_SPR_HEAD ;敵の検索開始ナンバ-
AI_KZ = 4 ;②「アイテム数」
repeat
es_find TEKI_D, BIT_TEKI, TEKI_no, TEKI_SPR_TAIL ;③「敵スプライト80~84の間を探す」
if TEKI_D == -1 {
break
}
es_check TEKI_VS_TAMA ,TEKI_D, BIT_MYSHOT ;④「敵が自機弾と当たったら変数に not -1を代入」
;あたったら実行
if TEKI_VS_TAMA != -1 {
TKTM_no = TEKI_D
gosub *敵アイテム
es_kill TEKI_D ;敵「削除」
es_kill TEKI_VS_TAMA ;自弾「削除」
}
TEKI_no++
loop
;---追加----
;アイテム移動処理
/*
if AI_TU_c = 4 : AI_UGO_f(0) = 1
if AI_TU_c = 8 : AI_UGO_f(1) = 1
if AI_TU_c = 12 : AI_UGO_f(2) = 1
if AI_TU_c = 16 : AI_UGO_f(3) = 1
if AI_TU_c = 20 : AI_UGO_f(4) = 1 : AI_TU_c += 1 ;ずっと実行させないために+1する
repeat TEKI_MAX ;敵の最大数(5)
if AI_UGO_f(cnt) = 1 { ;アイテム動くフラグ
AI_Jc(cnt) += 1 ;アイテム上昇カウント
if AI_Jc(cnt) >= 95 {
AI_UGO_f(cnt) = 0;アイテムを取得したときに、アイテムが再発生してしまうのを防止する
if cnt = 0 : AI_no = 150
if cnt = 1 : AI_no = 154
if cnt = 2 : AI_no = 158
if cnt = 3 : AI_no = 162
if cnt = 4 : AI_no = 166
repeat AI_KZ ;②「アイテム数」(4)
es_apos AI_no, 0,1 ,100 ;↓に移動
AI_no++
loop
}
}
loop
*/
return
;************敵アイテム*****************
*敵アイテム
es_get x,TKTM_no,3 ;スプライトX座標
es_get y,TKTM_no,5 ;スプライトY座標
repeat AI_KZ
AI_TUGI = cnt
es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL
if AI_no == -1 {
break
}
index = AI_no - ITEM_SPR_HEAD
;---追加----
AI_TU_c += 1 ;通った回数をカウントする
;キャラ番号をパワーから点数に変える
if AI_TUGI <= 1 {
AI_HN = CHR_POWER
itemtypes(index) = ITEM_POWER
}
if AI_TUGI >= 2 {
AI_HN = CHR_PTS
itemtypes(index) = ITEM_PTS
}
es_set AI_no, x + AI_TUGI*15, y, AI_HN ;スプライトNo, X,Y座標 ,キャラNo
es_apos AI_no, 0,-1 ,100 ;↑に移動
es_type AI_no, BIT_ITEM ;アイテムtype値(8)
item_turns(index) = frame_counter + TURN_FRAME
itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD
loop
return
;*********アイテム当たり判定*****************
*当たり判定
repeat
; 400(自機),8(アイテム)
es_check JIKI_VS_TEKI_AI, MY_SPR, BIT_ITEM
if JIKI_VS_TEKI_AI == -1 {
break
}
es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」
index = JIKI_VS_TEKI_AI - ITEM_SPR_HEAD
if (index >= 0) & (index < ITEM_SPR_NUM) {
itemtype = itemtypes(index)
// 0 ~ TEKI_MAX-1 でインデックスが得られる
tekiindex = itemtekiindices(index)
if (itemtype == ITEM_POWER) {
AI_HIT++
}
if (itemtype == ITEM_PTS) {
TN_HIT++
}
itemtypes(index) = ITEM_NONE
;---追加----
//AI_Jc(index) = 0 ;アイテム上昇カウント【リセット】
}
loop
return
;*********アイテムターン判定*****************
*アイテムターン
cur = ITEM_SPR_HEAD
repeat
es_find found, BIT_ITEM, cur, ITEM_SPR_TAIL
if found == -1 {
break
}
index = found - ITEM_SPR_HEAD
if (index >= 0) & (index < ITEM_SPR_NUM) {
if frame_counter == item_turns(index) {
es_apos found, 0,1 ,100 ;↓に移動
}
}
// 次を探しにいく。裏返ったら break しないと無限ループ
cur = found + 1
if cur > ITEM_SPR_TAIL {
break
}
loop
return

| |
|
2019/8/28(Wed) 21:24:41|NO.88242
砂時 計さん、ソースと回答ありがとうございます!!
なるほど、フレーム数をカウントしてその数値を代入していって、
「フレーム+移動するまでの時間」を代入すれば、
条件式で「フレーム = 代入されている数」を行うことによって、
時間が経過したら移動を行っているんですね。
こういう考え方は私だと絶対思い浮かばなかったので助かりました!!
フレーム数が無限に増加するとちょっと怖いので、本番ソースではストッパーを入れようと思います。
(スプライト前の設計は決まっていますが、スプライトではどうするか・・・)
ほんとうにありがとうございます。解決です~♪
|
|