シューティング
自分や敵は全て文字だけですので、とても軽いと思います。
自分も敵も同じ変数で一括管理します。
shooting.hsp
ソースのダウンロード
#define Wait_time 0
#define global Font_size 20
フォントの大きさと待ち時間を設定しておきます。
フォントのサイズはモジュールでも使うのでグローバルにしてあります。
動作が早過ぎると思う人はWait_timeの0を適当な長さ(例えば10など)に代えてください。
#module
#deffunc scan_put int max,array char
count=-1
repeat max
if char(cnt,0)!0 : continue
count=cnt
break
loop
return count
#global
何も書かれていないものがあればその値を、なければ-1を返します。
モジュールが分からない人はブラックボックスにしておいてください。
#module
#deffunc scan_hit int max,array char,int count
hit=-1
repeat max
if (char(cnt,0)=0)|(cnt=count) : continue
if char(count,0)=1 : {
if (char(cnt,0)=2)|(char(cnt,0)=4) : {
if (char(cnt,1)>char(count,1)-Font_size)&(char(cnt,1)
break
}
}
}
if char(count,0)=2 : {
if char(cnt,0)=3 : {
if (char(cnt,1)>char(count,1)-Font_size)&(char(cnt,1)
break
}
}
}
loop
return hit
#global
これも分からない人は飛ばしても問題ないです。
*index
randomize
wx=300 : wy=450 : screen 0,wx,wy
mes"シューティングゲーム" : button"START",*start : stop
まず画面を初期化します。サイズはwxとwyを調節するといいです。
スタートを押すと始まります。
*start
max=128 ;総キャラ数
dim char,max,5 ;一つ目0は死 それ以外は種類
;二つ目X 三つ目Y 四つ目Xの増加量 五つ目Y
;自機=1 敵機=2 通常弾=3 敵の弾=4
;追尾弾=5
char(0,0)=1 : char(0,1)=wx/2 : char(0,2)=wy-Font_size
point=0
cls
総キャラ数を少なくすると速くなるかもしれません。
(それほど速くならないことの方が多いです。なぜなら128個も画面に同時に表示されることはまずないからです)
charの0に自機の情報を入力します。
pointは得点管理用の変数です。
配列変数は0から始まるのでご注意下さい。
*main
stick k,15
if k=128 : end
redraw 0 : color 0,0,0 : boxf : font"MSゴシック",Font_size
if rnd(50)=0 : gosub *set
gosub *put
color 255,255,255 : pos 0,0 : mes "POINT:"+point
redraw 1 : await Wait_time : goto *main
これ自体は特に何もせず、各サブルーチンに飛ばすだけです。
*set
scan_put max,char : if stat=-1 : return
char(stat,0)=2 : char(stat,1)=rnd(wx) : char(stat,2)=-Font_size
return
ランダムで出現させるだけです。
メインループのrndの値を代えると、敵の出現率が変わります。
*put
repeat max
if char(cnt,0)=0 : continue
if char(cnt,0)=1 : {
count=cnt : scan_hit max,char,count
if stat!-1 : char(cnt,0)=0 : char(stat,0)=0 : continue
if k&1 : char(cnt,1)-=2
if k&2 : char(cnt,2)-=2
if k&4 : char(cnt,1)+=2
if k&8 : char(cnt,2)+=2
if k&16 : {
scan_put max,char : if stat!-1 : {
char(stat,0)=3 : char(stat,1)=char(cnt,1) : char(stat,2)=char(cnt,2)-Font_size
}
}
pos char(cnt,1),char(cnt,2) : color 255,255,255 : mes "機"
}
キー情報を取得し、それを反映させます。
if char(cnt,0)=2 : {
count=cnt : scan_hit max,char,count
if stat!-1 : char(cnt,0)=0 : char(stat,0)=0 : point+=10 : continue
if rnd(100)=0 : {
scan_put max,char : if stat!-1 : {
char(stat,0)=4 : char(stat,1)=char(cnt,1) : char(stat,2)=char(cnt,2)+Font_size
}
}
char(cnt,2)+=1
if char(cnt,2)>wy : char(cnt,0)=0
pos char(cnt,1),char(cnt,2) : color 255,0,0 : mes "敵"
}
横移動はないので、縦に落ちてくるだけです。
ランダムで弾を発射します。
これも出る量を変えることが出来ます。
if char(cnt,0)=3 : {
char(cnt,2)-=3
if char(cnt,2)<0-Font_size : char(cnt,0)=0
pos char(cnt,1),char(cnt,2) : color 0,255,0 : mes "弾"
}
横移動はないので弾は上がっていくだけです。
if char(cnt,0)=4 : {
char(cnt,2)+=3
if char(cnt,2)>wy : char(cnt,0)=0
pos char(cnt,1),char(cnt,2) : color 255,170,0 : mes "弾"
}
構造は自分の弾とほぼ同じです。
loop
return