【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秒間、真ん中でぐるぐる回った後、方向転換して逆回りにぐるぐる回ります。

レーザーのシステムは完成したものの、動きを制御するのが結構大変…orz
今度は動きを簡単に制御できるようにするための関数が必要だなー…orz
あ、っていうかまずあたり判定つけないと…。
というわけでこれからもがんばっていきます。
シューティングの本体を作っていないことには突っ込まないでください←
あと、数学の話になっちゃいますけど、余弦定理と外角の定理を初めて実用で使いました←
円の軌道ってこうやって出すんですねー。
ではまたいつかお会いしましょう~。
↓クリックしてね~


「【HSP】へにょりレーザー廃版【STG一部】」への6件のフィードバック

  1. なるほど。。。。。わからん!!!!!!!!

  2. まあ初心者にわかれといったほうが難しいですけど…。

  3. わからん。。。。。。わからん!!!!!!!
    >//余弦定理より
    >//外郭の定理より
    わからん!!!!!!

  4. なるほどわからん←
    角度とかの知識が皆無に等しいんでw

  5. おおおお、これ、よく作りましたね^^!!
    かんぺきにそのレーザーです。面白いです。
    避けるとなるととても嫌らしいけれど、見栄えはいいという不思議なレーザーですね。

  6. >Cookiesさn
    円を多角形に分割したときの、頂点と頂点の距離と角度を出してるんですよ。
    また今度スクリプト改造してうpしたときに詳細でも書きます。

    >橙さん
    弾幕作成には三角関数関連の式結構必要ですよ~。

    >フェルミウム湾さん
    ありがとうございます!
    そうですね。なにしろ東方のへにょりレーザーは動き読み見にくいですからねー。

コメントは受け付けていません。