STGをやってみた

んで、やってみた。

仕様

素材を用意してないので、文字列スプライトで代用。「@」が自機、「●」が敵。自弾は「■」で。
自機の大きさは見かけに関係なく1ドットを想定している。実は自分と敵との接触判定を入れてないから意味がないんだが。
敵は逆に「●」にもかかわらず24ドット四方の正方形の判定を持っていて、自弾も同様。
まあ、暇だったらやるだけやってみて。
敵の動き方のアルゴリズムがタコなので、自機の手前で止まってしまうのはご愛嬌。

スクリプト

 *define
numalias x,100
numalias y,101
numalias sp,102
numalias on,103
numalias status,104

for %0 = 100 to 200
	dim ?%0[100]
next
defsub abs
game
 *start
saveoff
; グラフィックの設定
lsph 0,":s/32,32,0;#FFFFFF@",0,0
lsph 1,":s/32,32,0;#FFFFFF■",0,0
lsph 2,":s/32,32,0;#FFFFFF●",0,0
lsph 3,":s/32,32,0;#FFFFFF*",0,0
lsph 4,":s/32,32,0;#FFFFFF・",0,0
; 自分の設定
mov ?x[0],320
mov ?y[0],320
mov ?on[0],1
mov ?sp[0],0

 *main
 *main_my
; 自分の位置を決定
getmousepos %0,%1
mov ?x[0],?x[0]+(%0-?x[0])/5
mov ?y[0],?y[0]+(%1-?y[0])/5
; 射撃中かどうか決定
isdown %0
if %0=0 goto *main_brid_move
mov %50,0 ; 弾番号
 *main_brid
inc %50
if %50>50 goto *main_brid_move
if ?on[%50]=1 goto *main_brid
mov ?on[%50],1
mov ?x[%50],?x[0]
mov ?y[%50],?y[0]
mov ?sp[%50],1
; 弾の移動
 *main_brid_move
for %50=1 to 50
if ?on[%50]=0 goto *main_brid_move_next
mov ?y[%50],?y[%50]-32
if ?y[%50]<0 mov ?on[%50],0
 *main_brid_move_next
next
 *main_enemy
; 敵の発生
for %50=51 to 100
if ?on[%50]=1 goto *main_enemy_next
rnd2 %0,1,100
if %0>1 goto *main_enemy_next
mov ?on[%50],1
mov ?sp[%50],2
rnd2 %0,0,639
mov ?x[%50],%0
mov ?y[%50],0
 *main_enemy_next
next
; 敵の移動
 *main_enemy_move
for %50=51 to 100
if ?on[%50]=0 goto *main_enemy_move_next
mov ?x[%50],?x[%50]+(?x[0]-?x[%50])/30
mov ?y[%50],?y[%50]+(?y[0]-?y[%50])/30
 *main_enemy_move_next
next
; 自分の弾と敵の接触判定
 *main_brid_enemy
for %50=1 to 50
if ?on[%50]=0 goto *main_brid_enemy_1
	for %51 = 51 to 100
	if ?on[%51]=0 goto *main_brid_enemy_2
		abs %0,?x[%50]-?x[%51]
		if %0>32 goto *main_brid_enemy_2
		abs %0,?y[%50]-?y[%51]
		if %0>32 goto *main_brid_enemy_2
		mov ?on[%50],0
		mov ?on[%51],0
		break
 *main_brid_enemy_2
	next
 *main_brid_enemy_1
next
; 全体の表示
 *main_print
drawclear
for %50=0 to 100
if ?on[%50]=0 goto *main_print_next
drawsp2 ?sp[%50],0,255,?x[%50],?y[%50],100,100,0
 *main_print_next
next
draw
goto *main

 *abs
getparam i%150,%151
if %151<0 mul %151,(-1)
mov %%150,%151
return