STGの弾幕で綺麗な正円(半円)の書き方を教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ptepe2h
記事: 7
登録日時: 11年前

STGの弾幕で綺麗な正円(半円)の書き方を教えてください

#1

投稿記事 by ptepe2h » 11年前

初めて質問させていただきます。
龍神録の方を参考にさせてもらっているのですが、弾幕の作り方でつまずいています。
「自機の上下から周りに少しずつ時計回りに弾で半円を描いていき閉じ込める」というような物を作りたいのですが、綺麗な半円の書き方が解りません。(「時計回りに弾で」の部分を書き直しました)
とりあえず、何とか弾で閉じ込める方法は以下の様に出来ました。しかし、これでは四角になります。

コード:

void boss_shot_bulletH100(){
    int k,cnt=boss_shot.cnt%700;
    //初期位置
    if(cnt==0){
        if((k=search_boss_shot())!=-1){
            boss_shot.bullet[k].col      = 0;//弾の色
            boss_shot.bullet[k].x     = ch.x;
            boss_shot.bullet[k].y     = ch.y-60;
            //カウントゼロ時の座標を覚えておく。[0]とあるのは[1][2]~と計五回くらい円を描く予定で0~5をループするからです。
            boss_shot.bullet[0].temp_x     = ch.x;
            boss_shot.bullet[0].temp_y     = ch.y;
            //上で描いた計五回の円のそれぞれのカウント数です。
            boss_shot.bullet[0].temp_cnt=0;
            boss_shot.bullet[k].knd   = 1;//弾の種類
            boss_shot.bullet[k].flag  = 1;
            boss_shot.bullet[k].spd   = 0;
            se_flag[0]=1;
         }
     }
    //自機の上から自機の右に斜めに線を引いて行く
    if(cnt>0 && cnt<60){
        boss_shot.bullet[0].temp_cnt++;
        int st=boss_shot.bullet[0].temp_cnt;
        if(boss_shot.bullet[0].temp_cnt%10==0){
            if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].col      = 0;//弾の色
                boss_shot.bullet[k].x     = boss_shot.bullet[0].temp_x+st;
                boss_shot.bullet[k].y     = boss_shot.bullet[0].temp_y-60+st;
                boss_shot.bullet[k].knd   = 1;//弾の種類
                boss_shot.bullet[k].angle = 0;//角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].cnt      = 0;
                boss_shot.bullet[k].spd      = 0;//スピード
                se_flag[0]=1;
            }
		}
    }
   //自機の右から自機の下に斜めに線を引く
    if(cnt>=60 && cnt<120){
            boss_shot.bullet[0].temp_cnt++;
            int st=boss_shot.bullet[0].temp_cnt;
            if(boss_shot.bullet[0].temp_cnt%10==0){
            if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].col      = 0;//弾の色
                boss_shot.bullet[k].x     = boss_shot.bullet[0].temp_x+60-st;//座標
                boss_shot.bullet[k].y     = boss_shot.bullet[0].temp_y+st;
                boss_shot.bullet[k].knd   = 1;//弾の種類
                boss_shot.bullet[k].angle = 0;//角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].cnt      = 0;
                boss_shot.bullet[k].spd      = 0;//スピード
                se_flag[0]=1;
            }
		}

//後は同じように左側の線も
//boss_shot.bullet[k].x     = boss_shot.bullet[0].temp_x+st; 
//boss_shot.bullet[k].y     = boss_shot.bullet[0].temp_y+60-st;
//と
//boss_shot.bullet[k].x     = boss_shot.bullet[0].temp_x-60+st;
// boss_shot.bullet[k].y     = boss_shot.bullet[0].temp_y-st;
//等の足し方や引き方を変えて線を引きます
//描き始めは右側の線と同じカウントタイミング
}
色々と無駄な記入もあると思いますが、まあ、それは置いときますとして。
私がやりたいのは四角ではなく円(半円)です。
もしかしたら、sin波を使えばいいのかもしれませんが、どのように数値を変えても楕円になってしまい、どうにも上手くいきません。

コード:

//こういう風に描きました
boss_shot.bullet[k].x     = boss_shot.bullet[0].temp_x+sin( PI*2 / 120 * st ) * 60; 
boss_shot.bullet[k].y     = boss_shot.bullet[0].temp_y+60-st*2;
数学な苦手な自分にはこれ以上の良案が思い浮かびません。そもそもsin波を使うのは間違いだったりしますか?
どうか綺麗な半円の書き方を教えてください。お願いしますm(_ _)m

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: STGの弾幕で綺麗な正円(半円)の書き方を教えてください

#2

投稿記事 by usao » 11年前

弾幕がどうの という話はよくわかりませんが,
単純に円弧上の座標
(x, y) = (cosθ, sinθ)
とかをそのまま使えばよいという話ではない,ということなのでしょうか?

ptepe2h
記事: 7
登録日時: 11年前

Re: STGの弾幕で綺麗な正円(半円)の書き方を教えてください

#3

投稿記事 by ptepe2h » 11年前

ああ、そうか。そういう使い方ができるんですね。
そのやり方で旨く行きました
(ただ、描き始めは上下なので、どちらかというと(x,y)=(sinθ,cosθ)ですが。)
何か難しく考えすぎていたみたいです。

コード:

boss_shot.bullet[k].x     = boss_shot.bullet[0].temp_x-sin(PI/60*st)*60;//座標/n
boss_shot.bullet[k].y     = boss_shot.bullet[0].temp_y+cos(PI/60*st)*60;
と書いて、自機の60上から60下まで綺麗な右半円を時計回りに描けました
訊いてみて良かったです
本当にありがとうございますm(_ _)m

閉鎖

“C言語何でも質問掲示板” へ戻る