|
|
|
2021/7/10(Sat) 14:18:03|NO.93200
どうもかなりお久し振りです。
リアルがクソ忙しくなりゲーム制作に期間があいてしまいました。
hspdxfix.asプラグインで作ったSTGゲームになります。
■やりたいこと
敵アイテム、でかい敵アイテムを1つにまとめて管理したいです。
例えば「*敵処理」で、「アイテムタイプ」と「撃破した敵を代入」します。
「*アイテム処理」で、「アイテムタイプ」によって処理を分けています。
■仕様
・敵:アイテム1つ
・でかい敵:アイテム4つ
└4つのうち2つはパワーアップアイテム、残り2は点数アイテム
(「if DK_AI_TUGI <= 1、if DK_AI_TUGI >= 2」で判定)
・アイテムは出現したら上に移動
└一定時間経過したら下に移動
・パワーアップアイテムを取ると点数1点
・点数アイテムを取ると点数10点
敵のアイテムとでかい敵アイテムを1つの処理にしたいので、
あまり関係のない当たり判定はエラーが出てしまうのでいったんコメントアウトしています。
(一部あえてコメントアウトしている箇所もあります)
でかい敵のアイテムを4つ出すという処理がうまく行かなくって困っています。
どこかドジっていると思いますが、アドバイスなどあればよろしくお願いいたします。
#include "hspdxfix.as" ;DXライブラリ使用
width ,,130,200 ;ウィンドウの位置
es_ini 4010,6000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1 ;スクリーン
es_window -13,-43, 640,480 ;スプライト表示エリア設定
es_area -36,-430, 600,498 ;スプライト有効エリア設定
;---Pアイテム---
es_size 12,12, 100
es_pat 540, 243,819
;---点アイテム---
es_size 12,12, 100
es_pat 541, 257,819
;------
;---自機---
es_size 28,42, 100
es_pat 4000, 0, 0
JIKI_x = 290 : JIKI_y = 390 ;位置
JIKISpd = 4 ;スピード
;---自機弾---
es_size 11,11, 150
es_pat 51, 1,43
;------
;---敵---
es_size 18,19, 50
es_pat 60, 0,0
;自機が動ける範囲
;--上--
es_size 383,3
es_pat 10, 0,0
es_set 10, 30,11, 10
;--左--
es_size 3,450
es_pat 11, 0,0
es_set 11, 30,11, 11
;--下--
es_size 383,3, 100
es_pat 12, 0,0
es_set 12, 30,460, 12
;--右--
es_size 3,450
es_pat 13, 0,0
es_set 13, 411,11, 13
;------
;---敵---
es_size 18,19, 50
es_pat 60, 0,0
;---でかい敵---
es_size 50,38, 100
es_pat 320, 37,0
;敵配置
TEKI_MAX = 5 ;敵の最大数
dim TEKI_f,TEKI_MAX ;フラグ
;でかい敵配置
DK_TEKI_MAX = 5 ;でかい敵の最大数
dim DK_TEKI_f,DK_TEKI_MAX ;フラグ
;デバッグ用
dim TK_AI_TUNZ,10
;▼▼▼▼▼敵配列▼▼▼▼▼
TEKI_x = 200,200,200,200,200
TEKI_y = 40,80,120,160,200
;▼▼▼▼▼でかい敵配列▼▼▼▼▼
DK_TEKI_x = 280,280,280,280,280
DK_TEKI_y = 300,250,200,150,100
;*********メインループ*********
*メイン
es_cls ;画面クリア
es_draw ;スプライト描画
;************カウンター******************
pos 430,20 : es_mes "アイテム上昇カウント " + AI_JSY
pos 430,70 : es_mes "【AI_JSY+95>=で下に移動】 "
pos 430,90 : es_mes "TK_AI_TUNZ(0) " + TK_AI_TUNZ(0)
pos 430,110 : es_mes "TK_AI_TUNZ(1) " + TK_AI_TUNZ(1)
pos 430,130 : es_mes "TK_AI_TUNZ(2) " + TK_AI_TUNZ(2)
pos 430,150 : es_mes "TK_AI_TUNZ(3) " + TK_AI_TUNZ(3)
pos 430,170 : es_mes "TK_AI_TUNZ(4) " + TK_AI_TUNZ(4)
pos 430,200 : es_mes "TK_AI_TUNZ(5) " + TK_AI_TUNZ(5)
pos 430,220 : es_mes "TK_AI_TUNZ(6) " + TK_AI_TUNZ(6)
pos 430,240 : es_mes "TK_AI_TUNZ(7) " + TK_AI_TUNZ(7)
pos 430,260 : es_mes "TK_AI_TUNZ(8) " + TK_AI_TUNZ(8)
pos 430,280 : es_mes "TK_AI_TUNZ(9) " + TK_AI_TUNZ(9)
pos 430,330 : es_mes "パワーアイテム数 " + TK_PAI_HIT
pos 430,350 : es_mes "点アイテム数 " + TK_TNAI_HIT
;*****************ゲーム枠外***************
es_set 4000, JIKI_x,JIKI_y, 4000 ;自機
;************gosub************
gosub *自機の移動
gosub *自機弾移動
gosub *敵処理
gosub *でかい敵
gosub *アイテムターン
gosub *アイテム当たり判定
es_sync ;画面更新
await 16
goto *メイン
;**************自機の移動*************
*自機の移動
stick key,15 ;キー取得
if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動
if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動
if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動
if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動
return
;*************自機弾移動****************
*自機弾移動
getkey keyZ,90 ;Zキー
JK_TAMA_G_kazu = 0
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
if JK_TAMA_c >= 1 {
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値(2)
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔
;---画面外判定---
JK_TAMA_no = 10 ;自機弾の検索開始ナンバー
repeat
es_find JK_TAM_D, 2, JK_TAMA_no,30, 1
if JK_TAM_D < 0 : break
es_get JK_TAM_D_y,JK_TAM_D,5 ;自機弾Y
if JK_TAM_D_y < 0 : es_kill JK_TAM_D ;自機弾【削除】
JK_TAMA_no++ ;自機弾の検索開始ナンバー
loop
return
;*************敵処理****************
*敵処理
TEKI_no = 80 ;敵の検索開始ナンバ−
repeat TEKI_MAX ;敵の最大数(5)
es_exnew TEKI, 80,84 ;新規スプライトNo
if TEKI_f(cnt) = 0 { ;フラグ
TEKI_f(cnt) = 1 ;フラグ
es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 60 ;スプライトNo, X,Y座標 ,キャラNo
}
es_type TEKI,4096
;当たり判定
es_find TEKI_D, 4096, TEKI_no,84
es_check TEKI_VS_TAMA ,TEKI_D,2 ;敵(4096),自機弾(2)
if TEKI_VS_TAMA != -1 {
es_kill TEKI_D ;敵「削除」
es_kill TEKI_VS_TAMA;自機弾「削除」
AI_TYPE = 1 ;1種類アイテムタイプ
AI_TEKI_HIT_no = TEKI_D ;撃破した敵を代入
gosub *アイテム処理
}TEKI_no++
loop
return
;*************でかい敵****************
*でかい敵
DK_TEKI_no = 320 ;でかい敵の検索開始ナンバ−
repeat DK_TEKI_MAX ;でかい敵の最大数(5)
es_exnew DK_TEKI, 320,324 ;新規スプライトNo
if DK_TEKI_f(cnt) = 0 { ;フラグ
DK_TEKI_f(cnt) = 1 ;フラグ
es_set DK_TEKI, DK_TEKI_x(cnt),DK_TEKI_y(cnt), 320 ;スプライトNo, X,Y座標 ,キャラNo
}
es_type DK_TEKI,4096
;当たり判定
es_find TEKI_D, 4096, DK_TEKI_no,324
es_check DK_TEKI_VS_TAMA ,TEKI_D,2 ;でかい敵(4096),自機弾(2)
if DK_TEKI_VS_TAMA != -1 {
es_kill TEKI_D ;でかい敵「削除」
es_kill DK_TEKI_VS_TAMA ;自機弾「削除」
AI_TYPE = 2 ;2種類アイテムタイプ
AI_TEKI_HIT_no = TEKI_D ;撃破したでかい敵を代入
gosub *アイテム処理
}DK_TEKI_no++
loop
return
;*************アイテム処理****************
*アイテム処理
;1種類アイテムタイプ
if AI_TYPE = 1 {
es_get TK_P_AI_x,AI_TEKI_HIT_no,3 ;X
es_get TK_P_AI_y,AI_TEKI_HIT_no,5 ;Y
AI_no = TEKI_D + 280 ;敵80+280 = 360
es_set AI_no, TK_P_AI_x,TK_P_AI_y, 540
es_apos AI_no, 0,-1 ,100 ;上に移動
TK_AI_TUNZ(AI_no - 360) = AI_JSY + 95 ;フレームカウンター + 何フレーム経過したら下に移動させたい数値
}
;2種類アイテムタイプ
if AI_TYPE = 2 {
es_get TK_P_AI_x,AI_TEKI_HIT_no,3 ;X
es_get TK_P_AI_y,AI_TEKI_HIT_no,5 ;Y
AI_no = TEKI_D + 40 + 5 ;でかい敵320+40+敵の数 = 365
repeat 4
DK_AI_TUGI = cnt ;アイテムを送るために代入する
if DK_AI_TUGI <= 1 { ;アイテムが2回以下
DK_AI_SYURUI = 540
; TK_AI_TYPE(AI_no - 365) = 1 ;Pアイテム
}
if DK_AI_TUGI >= 2 { ;アイテムが2回以上
DK_AI_SYURUI = 541
; TK_AI_TYPE(AI_no - 365) = 2 ;点アイテム
}
es_set AI_no, TK_P_AI_x + DK_AI_TUGI*15, TK_P_AI_y + DK_AI_TUGI*15, DK_AI_SYURUI
; es_apos AI_no, 0,-1 ,100 ;上に移動
TK_AI_TUNZ(AI_no - 365+5) = AI_JSY + 95;フレームカウンター + 何フレーム経過したら下に移動させたい数値
loop
}
es_type AI_no, 8 ;アイテムtype値
return
;**********アイテムターン***********
*アイテムターン
AI_JSY += 1 ;敵アイテムカウント
AI_TUN_no = 360 ;アイテム検索開始ナンバ−
repeat
es_find TK_AI_TUN_D, 8, AI_TUN_no, 369
if TK_AI_TUN_D = -1 : break
if AI_JSY = TK_AI_TUNZ(TK_AI_TUN_D - 360) { ;敵アイテムカウント + 95以上の数値になったら実行
es_apos TK_AI_TUN_D, 0,1 ,100 ;下に移動
}
AI_TUN_no = TK_AI_TUN_D + 1 ;最後までアイテムが出現したら+1をする
if AI_TUN_no > 369 : break ;+1した数値以上ならループを抜ける
loop
return
;********アイテム当たり判定***********
*アイテム当たり判定
/*
repeat
es_check JIKI_VS_TK_TEKI_AI, 4000,8 ;4000(自機),8(アイテム)
if JIKI_VS_TK_TEKI_AI = -1 : break ;当たっていない場合ループを抜ける
es_kill JIKI_VS_TK_TEKI_AI ;アイテム「削除」
AI_TYPE_D = JIKI_VS_TK_TEKI_AI - 360 ;0から数字を増加する (360-360 = 0, 361-360 = 1...)
AI_HIT_TYPE = TK_AI_TYPE(AI_TYPE_D) ;入っているアイテムタイプを代入する
if AI_HIT_TYPE = 1 : TK_PAI_HIT++ ;Pアイテム増加
if AI_HIT_TYPE = 2 : TK_TNAI_HIT += 10 ;点アイテム増加
loop
*/
return
| |
|
2021/8/1(Sun) 18:56:03|NO.93424
お久しぶりです(二度目
やっぱりあんま時間とれそうもなかったです・・orz
とりあえず別々で処理しても最悪いいと思っているので、
倒したときにそれぞれの敵でアイテムを複数種類を出せるようにできればいけそうなきがします。
アドバイスとかありましたらよろしくお願いいたします。
#include "hspdxfix.as" ;DXライブラリ使用
width ,,130,200 ;ウィンドウの位置
es_ini 4010,6000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1 ;スクリーン
es_window -13,-43, 640,480 ;スプライト表示エリア設定
es_area -36,-430, 600,498 ;スプライト有効エリア設定
;---Pアイテム---
es_size 12,12, 100
es_pat 540, 243,819
;---点アイテム---
es_size 12,12, 100
es_pat 541, 257,819
;------
;---自機---
es_size 28,42, 100
es_pat 4000, 0, 0
JIKI_x = 290 : JIKI_y = 390 ;位置
JIKISpd = 4 ;スピード
;---自機弾---
es_size 11,11, 150
es_pat 51, 1,43
;------
;---敵---
es_size 18,19, 50
es_pat 60, 0,0
;自機が動ける範囲
;--上--
es_size 383,3
es_pat 10, 0,0
es_set 10, 30,11, 10
;--左--
es_size 3,450
es_pat 11, 0,0
es_set 11, 30,11, 11
;--下--
es_size 383,3, 100
es_pat 12, 0,0
es_set 12, 30,460, 12
;--右--
es_size 3,450
es_pat 13, 0,0
es_set 13, 411,11, 13
;------
;---でかい敵---
es_size 50,38, 100
es_pat 320, 37,0
;でかい敵配置
DK_TEKI_MAX = 5 ;でかい敵の最大数
dim DK_TEKI_f,DK_TEKI_MAX ;フラグ
;デバッグ用
dim TK_AI_TUNZ,10
;▼▼▼▼▼でかい敵配列▼▼▼▼▼
DK_TEKI_x = 280,280,280,280,280
DK_TEKI_y = 300,250,200,150,100
;*********メインループ*********
*メイン
es_cls ;画面クリア
es_draw ;スプライト描画
;************カウンター******************
pos 430,20 : es_mes "アイテム上昇カウント " + AI_JSY
pos 430,70 : es_mes "【AI_JSY+95>=で下に移動】 "
pos 430,90 : es_mes "TK_AI_TUNZ(0) " + TK_AI_TUNZ(0)
pos 430,110 : es_mes "TK_AI_TUNZ(1) " + TK_AI_TUNZ(1)
pos 430,130 : es_mes "TK_AI_TUNZ(2) " + TK_AI_TUNZ(2)
pos 430,150 : es_mes "TK_AI_TUNZ(3) " + TK_AI_TUNZ(3)
pos 430,170 : es_mes "TK_AI_TUNZ(4) " + TK_AI_TUNZ(4)
pos 430,200 : es_mes "TK_AI_TUNZ(5) " + TK_AI_TUNZ(5)
pos 430,220 : es_mes "TK_AI_TUNZ(6) " + TK_AI_TUNZ(6)
pos 430,240 : es_mes "TK_AI_TUNZ(7) " + TK_AI_TUNZ(7)
pos 430,260 : es_mes "TK_AI_TUNZ(8) " + TK_AI_TUNZ(8)
pos 430,280 : es_mes "TK_AI_TUNZ(9) " + TK_AI_TUNZ(9)
pos 430,330 : es_mes "パワーアイテム数 " + TK_PAI_HIT
pos 430,350 : es_mes "点アイテム数 " + TK_TNAI_HIT
;*****************ゲーム枠外***************
es_set 4000, JIKI_x,JIKI_y, 4000 ;自機
;************gosub************
gosub *自機の移動
gosub *自機弾移動
gosub *でかい敵
es_sync ;画面更新
await 16
goto *メイン
;**************自機の移動*************
*自機の移動
stick key,15 ;キー取得
if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動
if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動
if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動
if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動
return
;*************自機弾移動****************
*自機弾移動
getkey keyZ,90 ;Zキー
JK_TAMA_G_kazu = 0
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
if JK_TAMA_c >= 1 {
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値(2)
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔
;---画面外判定---
JK_TAMA_no = 10 ;自機弾の検索開始ナンバー
repeat
es_find JK_TAM_D, 2, JK_TAMA_no,30, 1
if JK_TAM_D < 0 : break
es_get JK_TAM_D_y,JK_TAM_D,5 ;自機弾Y
if JK_TAM_D_y < 0 : es_kill JK_TAM_D ;自機弾【削除】
JK_TAMA_no++ ;自機弾の検索開始ナンバー
loop
return
;*************でかい敵****************
*でかい敵
DK_TEKI_no = 320 ;でかい敵の検索開始ナンバ−
repeat DK_TEKI_MAX ;でかい敵の最大数(5)
es_exnew DK_TEKI, 320,324 ;新規スプライトNo
if DK_TEKI_f(cnt) = 0 { ;フラグ
DK_TEKI_f(cnt) = 1 ;フラグ
es_set DK_TEKI, DK_TEKI_x(cnt),DK_TEKI_y(cnt), 320 ;スプライトNo, X,Y座標 ,キャラNo
}
es_type DK_TEKI,4096
;当たり判定
es_find TEKI_D, 4096, DK_TEKI_no,324
es_check DK_TEKI_VS_TAMA ,TEKI_D,2 ;でかい敵(4096),自機弾(2)
if DK_TEKI_VS_TAMA != -1 {
es_kill TEKI_D ;でかい敵「削除」
es_kill DK_TEKI_VS_TAMA ;自機弾「削除」
AI_TEKI_HIT_no = TEKI_D ;撃破したでかい敵を代入
gosub *アイテム処理
}DK_TEKI_no++
loop
return
;*************アイテム処理****************
*アイテム処理
es_get TK_P_AI_x,AI_TEKI_HIT_no,3 ;X
es_get TK_P_AI_y,AI_TEKI_HIT_no,5 ;Y
AI_no = TEKI_D + 40 ;320+40=360
repeat 4
DK_AI_TUGI = cnt ;アイテムを送るために代入する
es_set AI_no, TK_P_AI_x + DK_AI_TUGI*15, TK_P_AI_y + 15, 540
AI_no++
loop
es_type AI_no, 8 ;アイテムtype値
return
| |
|
2021/8/24(Tue) 09:05:16|NO.93674
だいぶ遅くなろましたが自己解決しました。
結局敵とでかい敵はそれぞれ別で管理することにしました。
この方法でもまとめれる部分はまとめているので、目的であるソース短縮化につながるため解決とします。
一応ソースは載せますが他人にわかりやすくしてないので、(変数名とか治すの地味に大変)
ちょっとわかりにくい部分あると思います
#include "hspdxfix.as" ;DXライブラリ使用
width ,,130,200 ;ウィンドウの位置
es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1
es_window -13,-43, 640,480 ;スプライト表示エリア設定
es_area -36,-430, 600,498 ;スプライト有効エリア設定
buffer 2
picload "G_sisu-2.bmp" ;ゲーム中のシステム画像
es_buffer 2,,$00ff00,,1
;---Pアイテム---
es_size 12,12, 100
es_pat 540, 243,819
;---点アイテム---
es_size 12,12, 100
es_pat 541, 257,819
;---得点(スコア)---
es_size 11,14
CS_TEN_x = 243 ;取ってくる画像のX座標
repeat 10
es_pat 40+cnt, CS_TEN_x,855
CS_TEN_x += 11
loop
;---------
buffer 4
picload "jiki.bmp"
es_buffer 4,,$00ff00,,1
;---自機---
es_size 28,42, 100
es_pat 400, 0,0
JIKI_x = 206 : JIKI_y = 390
JIKISpd = 4 ;自機のスピード(4)
;---自機弾---
es_size 11,11, 150
es_pat 51, 1,43
;---------
buffer 5
picload "teki.bmp"
es_buffer 5,,$00ff00,,1
;---敵---
es_size 18,19, 50
es_pat 60, 0,0
;---でかい敵---
DK_TEKI_G_ca = 320 ;キャラクタ開始ナンバー
es_size 50,38, 100
repeat 2
es_pat DK_TEKI_G_ca, 37+50*cnt, 0 ;p1=キャラクタNo.
DK_TEKI_G_ca++
loop
;---------
buffer 3
picload "G_wmap.bmp";ゲーム中の外枠背景などの画像
es_size 150,100, 100
es_pat 600, 0,1000
gsel 0,1
;自機弾
JKTM_MAX = 50 ;自機弾の最大数(50)
dim JKSO_x,JKTM_MAX
dim JKSO_y,JKTM_MAX
;敵配置
TEKI_MAX = 5 ;敵の最大数(5)
dim TEKI_f,TEKI_MAX
dim TEKI_x,TEKI_MAX
dim TEKI_y,TEKI_MAX
;でかい敵配置
DK_TEKI_MAX = 5 ;でかい敵の最大数(5)
dim DK_TEKI_f,DK_TEKI_MAX
dim DK_TEKI_x,DK_TEKI_MAX
dim DK_TEKI_y,DK_TEKI_MAX
dim DK_AI_TYPE,DK_TEKI_MAX ;補助
dim AI_TYPE,10
;デバッグ用
dim TK_AI_TUNZ,70 ;アイテムターン
dim TK_AI_TYPE,70 ;でかい敵アイテム
;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼
TEKI_x = 200,200,200,200,200
TEKI_y = 40,80,120,160,200
;▼▼▼▼▼▼▼でかい敵配列▼▼▼▼▼▼▼
DK_TEKI_x = 280,280,280,280,280
DK_TEKI_y = 300,250,200,150,100
;▼▼▼▼▼▼▼アイテム配列▼▼▼▼▼▼▼
AI_score_LIN = 0,5000,2500,1000 ;アイテムエリア点数
;■■■■■敵配置■■■■■
repeat TEKI_MAX ;敵の最大数(5)
es_exnew TEKI, 80,84 ;新規スプライトNo (敵:80〜84)
es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 60 ;スプライトNo, X,Y座標 ,キャラNo
es_type TEKI,4096
loop
;■■■■■でかい敵配置■■■■■
repeat DK_TEKI_MAX ;でかい敵の最大数(5)
es_exnew DK_TEKI, 90,94 ;新規スプライトNo
es_set DK_TEKI, DK_TEKI_x(cnt),DK_TEKI_y(cnt), 320 ;スプライトNo, X,Y座標 ,キャラNo
es_type DK_TEKI,4096
loop
;*********メインループ*********
*メイン
es_cls ;画面クリア
es_draw ;スプライト描画
;************カウンター******************
pos 340,10 : es_mes "AI_JSY " + AI_JSY
pos 430,10 : es_mes "score " + score
;敵
pos 340,40 : es_mes "TK_AI_TUNZ(0) " + TK_AI_TUNZ(0)
pos 340,60 : es_mes "TK_AI_TUNZ(1) " + TK_AI_TUNZ(1)
pos 340,80 : es_mes "TK_AI_TUNZ(2) " + TK_AI_TUNZ(2)
pos 340,100 : es_mes "TK_AI_TUNZ(3) " + TK_AI_TUNZ(3)
pos 340,120 : es_mes "TK_AI_TUNZ(4) " + TK_AI_TUNZ(4)
;でかい1匹目
pos 340,150 : es_mes "TK_AI_TUNZ(60) " + TK_AI_TUNZ(60)
pos 340,170 : es_mes "TK_AI_TUNZ(61) " + TK_AI_TUNZ(61)
pos 340,190 : es_mes "TK_AI_TUNZ(62) " + TK_AI_TUNZ(62)
pos 340,210 : es_mes "TK_AI_TUNZ(63) " + TK_AI_TUNZ(63)
;2匹目
pos 490,150 : es_mes "TK_AI_TUNZ(64) " + TK_AI_TUNZ(64)
pos 490,170 : es_mes "TK_AI_TUNZ(65) " + TK_AI_TUNZ(65)
pos 490,190 : es_mes "TK_AI_TUNZ(66) " + TK_AI_TUNZ(66)
pos 490,210 : es_mes "TK_AI_TUNZ(67) " + TK_AI_TUNZ(67)
;---アイテム---
;敵
pos 340,240 : es_mes "【アイテム】 "
pos 340,260 : es_mes "TK_AI_TYPE(0) " + TK_AI_TYPE(0)
pos 340,280 : es_mes "TK_AI_TYPE(1) " + TK_AI_TYPE(1)
pos 340,300 : es_mes "TK_AI_TYPE(2) " + TK_AI_TYPE(2)
pos 340,320 : es_mes "TK_AI_TYPE(3) " + TK_AI_TYPE(3)
pos 340,340 : es_mes "TK_AI_TYPE(4) " + TK_AI_TYPE(4)
pos 340,370 : es_mes "TK_AI_TYPE(60) " + TK_AI_TYPE(60)
pos 340,390 : es_mes "TK_AI_TYPE(61) " + TK_AI_TYPE(61)
pos 340,410 : es_mes "TK_AI_TYPE(62) " + TK_AI_TYPE(62)
pos 340,430 : es_mes "TK_AI_TYPE(63) " + TK_AI_TYPE(63)
pos 490,370 : es_mes "TK_AI_TYPE(64) " + TK_AI_TYPE(64)
pos 490,390 : es_mes "TK_AI_TYPE(65) " + TK_AI_TYPE(65)
pos 490,410 : es_mes "TK_AI_TYPE(66) " + TK_AI_TYPE(66)
pos 490,430 : es_mes "TK_AI_TYPE(67) " + TK_AI_TYPE(67)
;**************************************
gosub *自機の移動
gosub *自機弾移動
gosub *敵処理
gosub *でかい敵
gosub *アイテム当たり判定
gosub *アイテムターン
es_set 400, JIKI_x,JIKI_y, 400 ;自機
;**************スコア***********
es_set 600, 0,0, 600 ;背景の白
;システムの点数
sco_keta = strlen(str(score)) ;スコアの文字列の長さを測定
repeat sco_keta ;3桁だったら3回ループする、4桁だったら4回...(スコアの長さ分ループする)
string = str(score) ;文字列に変換
sco_bit = peek(string,cnt) ;バッファから1byte読み出し
es_put 130-sco_keta*12+cnt*13,30, sco_bit-8 ;アスキーコード表で0は48になるので、48+79することによってキャラ番号を調節する
loop
es_sync ;画面更新
await 16
goto *メイン
;**************自機の移動*************
*自機の移動
stick key,15 ;キー取得
if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動
if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動
if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動
if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動
return
;*************自機弾移動****************
*自機弾移動
getkey keyZ,90 ;Zキー
JK_TAMA_G_kazu = 0
if keyZ AND JKSO_f = 0 AND RENSA = 0 {
es_exnew JK_TAMA ,10,30 ;新規スプライト取得
;---弾の判断---
if JK_TAMA_c >= 1 {
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値(2)
}
if RENSA > 0 : RENSA -= 1 ;弾の間隔
return
;*************敵処理****************
*敵処理
TEKI_no = 80 ;敵の検索開始ナンバ−
repeat TEKI_MAX ;敵の最大数(5)
es_find TEKI_D, 4096, TEKI_no,84
es_check TEKI_VS_TAMA ,TEKI_D,2 ;敵(4096),自機弾(2)
if TEKI_VS_TAMA != -1 & TEKI_f(cnt) = 0 {
TEKI_HIT_no = TEKI_D
gosub *敵アイテム
es_kill TEKI_D ;敵「削除」
es_kill TEKI_VS_TAMA;自機弾「削除」
TEKI_f(TEKI_no - 80) = 1 ;敵のフラグを「立てる」
}TEKI_no++
loop
return
;************敵アイテム*****************
*敵アイテム
es_get TK_P_AI_x,TEKI_HIT_no,3 ;X座標
es_get TK_P_AI_y,TEKI_HIT_no,5 ;Y座標
es_exnew TK_P_AI_no, 360,430
es_set TK_P_AI_no, TK_P_AI_x,TK_P_AI_y, 540 ;スプライトNo, X,Y座標 ,キャラNo
es_apos TK_P_AI_no, 0,-1 ,100 ;↑に移動
es_type TK_P_AI_no,8 ;アイテムtype値
;Pアイテム判定
TK_AI_TYPE(TK_P_AI_no - 360) = 1 ;1 = Pアイテム, 2 = 点数アイテム
;上下カウンタ
TK_AI_TUNZ(TK_P_AI_no - 360) = AI_JSY + 95 ;フレームごとに進むカウンター + 何フレーム経過したら下に移動するか
return
;*************でかい敵****************
*でかい敵
DK_TEKI_no = 90 ;でかい敵の検索開始ナンバー
repeat DK_TEKI_MAX ;でかい敵の最大数(5)
es_find DK_TEKI_D, 4096, DK_TEKI_no,94
es_check DK_TEKI_VS_TAMA ,DK_TEKI_D,2 ;でかい敵(4096),自機弾(2)
if DK_TEKI_VS_TAMA != -1 & DK_TEKI_f(cnt) = 0 {
DK_TK_HIT_no = DK_TEKI_D
gosub *でかい敵アイテム
es_kill DK_TEKI_D ;でかい敵「削除」
es_kill DK_TEKI_VS_TAMA ;自機弾「削除」
DK_TEKI_f(DK_TEKI_no - 90) = 1 ;でかい敵のフラグを「立てる」
}DK_TEKI_no++
loop
return
;************でかい敵アイテム*****************
*でかい敵アイテム
es_get DK_AITM_x,DK_TK_HIT_no,3 ;X座標
es_get DK_AITM_y,DK_TK_HIT_no,5 ;Y座標
repeat 4
DK_AI_TUGI = cnt ;アイテムを送るために代入する
es_exnew DK_AI_no, 420,439
if DK_AI_no = -1 : break
;キャラ番号をパワーから点数に変える
if DK_AI_TUGI <= 1 { ;アイテムが2回以下
DK_AI_SYURUI = 540
TK_AI_TYPE(DK_AI_no - 360) = 1 ;Pアイテムと定義する(360:敵の最大数が60個と定義→360+60=420)
}
if DK_AI_TUGI >= 2 { ;アイテムが2回以上
DK_AI_SYURUI = 541
TK_AI_TYPE(DK_AI_no - 360) = 2 ;点アイテムと定義する(360:敵の最大数が60個と定義→360+60=420)
}
es_set DK_AI_no, DK_AITM_x + DK_AI_TUGI*15, DK_AITM_y, DK_AI_SYURUI ;スプライトNo, X,Y座標 ,キャラNo
es_apos DK_AI_no, 0,-1 ,100 ;↑に移動
es_type DK_AI_no, 8 ;アイテムtype値
TK_AI_TUNZ(DK_AI_no - 360) = AI_JSY + 95 ;フレームごとに進むカウンター + 何フレーム経過したら下に移動するか
loop
return
;***********アイテム当たり判定**************
*アイテム当たり判定
;エリア判定
AI_ERIA_no = 360 ;アイテムエリア検索開始ナンバ−
repeat 90 ;360+90=450 (でかい敵アイテムの最大数「439」より多め)
es_get AI_ERIA_y,AI_ERIA_no,5 ;アイテムY
if AI_ERIA_y <= 160 : AI_ERIA_TYPE(AI_ERIA_no - 360) = 1 ;一番上
if AI_ERIA_y >= 161 : AI_ERIA_TYPE(AI_ERIA_no - 360) = 2 ;真ん中
if AI_ERIA_y >= 310 : AI_ERIA_TYPE(AI_ERIA_no - 360) = 3 ;一番下
AI_ERIA_no++ ;アイテムエリア検索開始ナンバ−
loop
;当たり判定
repeat
es_check JIKI_VS_TK_TEKI_AI ,400,8 ;400(自機),8(アイテム)
if JIKI_VS_TK_TEKI_AI = -1 : break ;当たっていない場合ループを抜ける
es_kill JIKI_VS_TK_TEKI_AI ;アイテム「削除」
;Pアイテム
if TK_AI_TYPE(AI_SP_D) = 1 : score += 10
;点数アイテム
AI_SP_D = JIKI_VS_TK_TEKI_AI - 360 ;0から数字を増加する
if TK_AI_TYPE(AI_SP_D) = 2 {
AI_ERIA_HIT_TYPE = AI_ERIA_TYPE(AI_SP_D);「高、中、下」の情報を代入する
score += AI_score_LIN(AI_ERIA_HIT_TYPE);高さによって点数を変える (0番は無いので0を入れてある 0,5000,2500,1000)
}
loop
return
;************アイテムターン*************
*アイテムターン
AI_JSY += 1 ;敵アイテムの上下カウント
AI_TUN_no = 360
repeat
es_find TK_AI_TUN_D, 8, AI_TUN_no, 439
if TK_AI_TUN_D = -1 : break
if AI_JSY = TK_AI_TUNZ(TK_AI_TUN_D - 360) { ;現在のフレームから足し算することによって、その足し算した時間に来たら実行するようになっている
es_apos TK_AI_TUN_D, 0,1 ,100 ;↓に移動
}
AI_TUN_no = TK_AI_TUN_D + 1 ;最後までアイテムが出現したら+1をする
if AI_TUN_no > 439 : break ;+1した数値以上ならループを抜ける
loop
return
| |
|