シューティングの基本は2D3D横縦問わず
*main
[自機に関する処理]
[敵に関する処理]
[その他の処理(アイテムなど)]
[接触判定]
await 20
goto *main
というループだと思います。
失礼ですが、質問のされ方からしてSTGを作る経験というより
プログラミング自体の経験があまりないのではございませんか?
(違っていたら申し訳ありません)
であれば、まずは比較的簡単なスクロールなしの2DSTGを習作として
作り、ある程度HSPでのプログラミングに慣れてから、
改めて思い通りのSTG作りに挑戦されてはいかがでしょう?
小学生に遊ばせる目的で作った簡単なゲームですが
何かの参考になれば幸いです。
#define global draw_cir(%1,%2,%3) circle %1-%3, %2-%3, %1+%3, %2+%3 ;%1=X座標,%2=Y座標を中心にした円の描画
#define global ctype d_cos(%1) cos(deg2rad(%1)) ;コサインの度数法表記
#define global ctype d_sin(%1) sin(deg2rad(%1)) ; サインの度数法表記
#define global ctype dis(%1,%2,%3,%4) sqrt(double(%1-%3)*(%1-%3) + double(%2-%4)*(%2-%4)) ;2点間の距離
#const GAME_W 640 ;ウィンドウ幅
#const GAME_H 640 ;ウィンドウ高さ
#const GAME_hW 0.5 * GAME_W ;ウィンドウ中心(横)
#const GAME_hH 0.5 * GAME_H ;ウィンドウ中心(縦)
#const PLAYER_spd 2
;敵用
#enum X = 0 ;X座標
#enum Y ;Y座標
#enum R ;半径
screen 0, GAME_W, GAME_H
title ""
dialog "ルール\n赤(あか)い玉を↑↓→←で操作(そうさ)して\n壁(かべ)までたどりつけるかな?\n途中(とちゅう)で青(あお)い玉にさわったら負(ま)けだよ!", 0
v_stage = 1
*GAME_start
v_GAME = 0
PLAYER_X = GAME_hW
PLAYER_Y = GAME_hH
v_loop = 0
*main
redraw 2
color $ff, $ff, $ff
boxf : color
gosub *sub_PLAYER
gosub *sub_ENEMY
redraw 1
await 20
v_loop++
if v_GAME : goto *GAME_end : else : goto *main
*sub_PLAYER
getkey key_left, 37
getkey key_right, 39
getkey key_up, 38
getkey key_down, 40
PLAYER_move_X = key_right - key_left
PLAYER_move_Y = key_down - key_up
if PLAYER_move_X | PLAYER_move_Y {
PLAYER_A = atan(PLAYER_move_Y, PLAYER_move_X)
PLAYER_X += cos(PLAYER_A) * PLAYER_spd
PLAYER_Y += sin(PLAYER_A) * PLAYER_spd
}
color $ff, $00, $00 : draw_cir PLAYER_X, PLAYER_Y, 8;描画
if ((0 < PLAYER_X & PLAYER_X < GAME_W) & (0 < PLAYER_Y & PLAYER_Y < GAME_H)) = 0 : v_GAME++;壁との接触判定
return
*sub_ENEMY
ddim ENEMY, 3, 8
v_eR1 = d_sin(v_loop) * 25 + 50
repeat 8
ENEMY(0, cnt) = (d_cos(45 * cnt + v_loop) * v_ER1) + GAME_hW, (d_sin(45 * cnt + v_loop) * v_ER1) + GAME_hH, 0.2 * v_ER1
loop
if 2 <= v_stage { ;2面以降
v_eR2 = d_sin(v_loop+180) * 25 + 150
repeat 12,8
ENEMY(0, cnt) = (d_cos(30 * cnt - v_loop) * v_ER2) + GAME_hW, (d_sin(30 * cnt - v_loop) * v_ER2) + GAME_hH, 0.1 * v_ER2
loop
}
if 3 <= v_stage { ;3面以降
v_eR3 = d_sin(v_loop) * 25 + 250
repeat 18,20
ENEMY(0, cnt) = (d_cos(20 * cnt + v_loop) * v_ER3) + GAME_hW, (d_sin(20 * cnt + v_loop) * v_ER3) + GAME_hH, 0.05 * v_ER3
loop
}
color $00, $00, $ff
repeat length(ENEMY)
draw_cir ENEMY(X, cnt), ENEMY(Y, cnt), ENEMY(R, cnt) ;描画
if dis(PLAYER_X, PLAYER_Y, ENEMY(X, cnt), ENEMY(Y, cnt)) < ENEMY(R, cnt) + 6 : v_GAME-- ;自機との接触判定
loop
return
*GAME_end
if 0 < v_GAME {
if 3 < v_stage {
dialog "おめでとう!\n全ステージクリアです", 1
end
} else {
dialog "おめでとう!次(つぎ)のステージもがんばってね", 1
v_stage++
goto *GAME_start
}
} else : dialog "負け", 1 : end
wait 5