【HSP】へにょりレーザー廃版【STG一部】
【HSP】へにょりレーザー廃版【STG一部】
// モジュール
#module "kerupani_f"
; 角度を 0~2π の範囲に変換する関数
#defcfunc limit_pi double _p1
return (0.0+_p1)\(M_PI*2)+M_PI*2
#global
// スクリーン/画像準備
buffer 1,20,256
color : boxf
color 255,200,200
circle 0,0,19,255,1
color 255,127,127
repeat 4
circle cnt,cnt,19-cnt,255-cnt,0
loop
screen 0
// 変数準備
; 処理に使う変数 (システム)
dim timer,1 // ループの中で、時間を図るタイマー
; ユーザー指定する変数 (長方形→位置/サイズ)
ddim s_pos_x,16 // 長方形の中心のX座標
ddim s_pos_y,16 // 長方形の中心のY座標
ddim s_pos_s,16 // 長方形の角度
ddim s_pos_s2,16 // 長方形の見かけの角度
ddim s_size_x,16 // 長方形のXサイズ
ddim s_size_y,16 // 長方形のYサイズ
ddim s_speed,16 // 長方形のスピード
ddim s_speed_s,16 // 長方形の進む角度
dim s_f,1 // オブジェクトの有無
; 処理に使う変数 (位置/サイズ→頂点座標)
ddim l_a,1 // 長方形の中心から頂点までの角度 (回転前)
ddim l_s,4 // 長方形の中心から頂点までの角度 (回転後)
ddim l_l,1 // 長方形の中心から頂点までの距離
dim l_x,4 // 各頂点のX座標
dim l_y,4 // 各頂点のY座標
; 処理に使う変数 (元画像→頂点座標))
dim l_x2,4 // 各頂点のX座標
dim l_y2,4 // 各頂点のY座標
; その他使う変数
ddim item_s,1 // レーザーが1フレームに進む角度
// 処理
repeat 16
s_size_x(cnt)=20.0
s_size_y(cnt)=16.0
loop
item_s=0.1
// ループ
gmode 2
*main
redraw 0
// 処理
; 発生/値変更処理
gosub *item_init
; 移動処理
gosub *item_move
// 表示
; 背景
color 255,255,255 : boxf
; レーザー
if s_f=1 {
repeat 16
l_l=sqrt(s_size_x(cnt)*s_size_x(cnt)+s_size_y(cnt)*s_size_y(cnt))/2
l_a=atan(s_size_y(cnt),s_size_x(cnt))
l_s=limit_pi(s_pos_s2(cnt)+l_a+M_PI),limit_pi(s_pos_s2(cnt)-l_a),limit_pi(s_pos_s2(cnt)+l_a),limit_pi(s_pos_s2(cnt)-l_a+M_PI)
if cnt=0 {
l_x=int(s_pos_x(cnt)+cos(l_s(0))*l_l),int(s_pos_x(cnt)+cos(l_s(1))*l_l),int(s_pos_x(cnt)+cos(l_s(2))*l_l),int(s_pos_x(cnt)+cos(l_s(3))*l_l)
l_y=int(s_pos_y(cnt)+sin(l_s(0))*l_l),int(s_pos_y(cnt)+sin(l_s(1))*l_l),int(s_pos_y(cnt)+sin(l_s(2))*l_l),int(s_pos_y(cnt)+sin(l_s(3))*l_l)
} else {
l_x=l_x(3),l_x(2),int(s_pos_x(cnt)+cos(l_s(2))*l_l),int(s_pos_x(cnt)+cos(l_s(3))*l_l)
l_y=l_y(3),l_y(2),int(s_pos_y(cnt)+sin(l_s(2))*l_l),int(s_pos_y(cnt)+sin(l_s(3))*l_l)
}
l_x2=0,19,19,0
l_y2=cnt*16,cnt*16,cnt*16+15,cnt*16+15
gsquare 1,l_x,l_y,l_x2,l_y2
loop
}
;
// システム
timer+
redraw
await 15
goto *main*item_init
if timer=0 {
s_f=1
repeat 16
s_pos_x(cnt)=320.0+cos(M_PI*cnt/16)*86
s_pos_y(cnt)=240.0+sin(M_PI*cnt/16)*86
s_pos_s(cnt)=M_PI*cnt/16+M_PI/2
s_pos_s2(cnt)=M_PI*cnt/16
s_speed(cnt)=sqrt(14792.0*(1.0-cos(item_s))) // 余弦定理より
s_speed_s(cnt)=item_s/2 // 外角の定理より
loop
}
if 300<=timer & timer<256/s_speed(cnt)+300 {
s_speed_s(15-(timer-300)/(16/s_speed(cnt)))=-item_s/2
}
return*item_move
if s_f=1 {
repeat 16
s_pos_x(cnt)+=cos(s_pos_s(cnt)+s_speed_s(cnt))*s_speed(cnt)
s_pos_y(cnt)+=sin(s_pos_s(cnt)+s_speed_s(cnt))*s_speed(cnt)
s_pos_s(cnt)+=s_speed_s(cnt)*2
s_pos_s2(cnt)+=s_speed_s(cnt)*2
loop
}
return
(約)4秒間、真ん中でぐるぐる回った後、方向転換して逆回りにぐるぐる回ります。
なるほど。。。。。わからん!!!!!!!!
まあ初心者にわかれといったほうが難しいですけど…。
わからん。。。。。。わからん!!!!!!!
>//余弦定理より
>//外郭の定理より
わからん!!!!!!
なるほどわからん←
角度とかの知識が皆無に等しいんでw
おおおお、これ、よく作りましたね^^!!
かんぺきにそのレーザーです。面白いです。
避けるとなるととても嫌らしいけれど、見栄えはいいという不思議なレーザーですね。
>Cookiesさn
円を多角形に分割したときの、頂点と頂点の距離と角度を出してるんですよ。
また今度スクリプト改造してうpしたときに詳細でも書きます。
>橙さん
弾幕作成には三角関数関連の式結構必要ですよ~。
>フェルミウム湾さん
ありがとうございます!
そうですね。なにしろ東方のへにょりレーザーは動き読み見にくいですからねー。