レーザーの消し方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yu

レーザーの消し方

#1

投稿記事 by yu » 16年前

いつもお世話になっています。
毎度すみません;
また質問させてください。

今、動くレーザーを作っていますが、(速さと角度を持っただけです
レーザーを消すときの処理がうまくいかなくて困っています。
ボムを打って画面中央からどんどん外側へ消したいのですが、どうもうまくいきません。
東方を見てみるとレーザー真ん中が消えるとレーザーが分裂したりもしています。
最終的には東方のようにレーザーを消したいです。

レーザーの表示と自機との当たり判定は付けることができたのですが・・・


どなたかアドバイスをしていただけたらありがたいです。
東方のレーザー画像と自分のソースコードを添付しましたので、見ていただけたら幸いです。
管理者様の龍神録を軸にして作成しています。


添付したソースを見てもらえばわかると思いますが。
かなり雑で汚いです。
そして無駄なことをしていると思います。(特に計算部

近くにプログラムできる人がいたらなぁ~・・・

Dixq (管理人)

Re:レーザーの消し方

#2

投稿記事 by Dixq (管理人) » 16年前

日本語理解力が乏しいので、言いたい事が完全に理解出来ていないかもしれません、ごめんなさい・・。
ちと、下を見てみて下さい。

龍神録ではレーザーを2種類の方法で実装しています。

1種類目はレーザーを作ってみようの章で紹介しているので、わかり易いかもしれませんが、
もう一種類の方は明確に紹介していなかったかもしれません。

レーザーって私が考える範囲では単純に考えると2種類の実装の仕方が考えられます。

1. 大きな一つのレーザーとしてレーザーを扱う方法
2. 小さなレーザーがたくさん集まり、一つの大きなレーザーを作り上げる方法

東方や、その他の類似品のコードを見たりしたわけじゃないのでわかりませんが、
どうもこの2種類で実装されている気がします。
マスタースパークや極太レーザーなんかは方法1、敵が撃ってくるたくさんの細いレーザーや被弾した部分が途切れるようなレーザーは方法2で実装してある気がします。

1は館で紹介してあるのでいいですよね。
2は、例えばこんな感じです。

http://dixq.net/zip/bbs/for_yu.zip

50章のプログラムを改良したものなので、龍神録プログラミングの館で配布しているプロジェクトに入れて下さい。(画像データとかは入っていませんので)

ボスが細いレーザーを連続で撃ってくると思うので、被弾してみて下さい。するとその部分が途切れると思います。

画像
(注:レーザーの当たり判定範囲を考えてないのですり抜ける場合あり)

これはどうなっているのかと言うと、img/bulletにあるb2の細長い弾を小さなレーザーの1つだとみなしているのです。
この小さなレーザーを連続で同じ方向に打ち続ければ繋がって見え、レーザーのように見えるということです。
しかし、単純に弾を重ねて描画してしまったのでは継ぎ目が見えます。
そこは光を表現する為に使う「加算ブレンド」で誤魔化します。

この弾幕はboss_shot_bulletH012関数で表現しているので、のぞいてみてください。
boss_shot.bullet[k].eff = 1;//加算ブレンドオン

こいつがその役割をします。
加算ブレンドオンにしてある弾は描画部で自動的に加算ブレンドで描画されるようにしてあります。

加算ブレンドって何?と思ったかもしれませんが、要は光の足し算です。
色はRBGで表し、0~255で表してプログラムしていると思うのでわかると思いますが、
色を足すと白に近づきますよね。つまりレーザーの重なった部分はうまく白になり、
レーザーが繋がって見えるわけです。

小さな弾の集合だから、その部分の弾を消せば分離する・・というか元々たくさん分離したものなんですけどね。
これで解決出来ないでしょうか?

Dixq (管理人)

Re:レーザーの消し方

#3

投稿記事 by Dixq (管理人) » 16年前

ボムを使ったとき一定範囲だけ消すイメージサンプル作ってみました。
・・・と言っても、実際にここに実装してはダメなので、あくまでサンプルとしてご覧下さい。
以下の青の部分を追加してみて下さい。
ショットを撃つと、その瞬間敵の周辺のレーザーが消えます。
//yuさん用レーザー
void boss_shot_bulletH012(){
    int i,k,t=boss_shot.cnt%200;
    if(t<140 && t%5==0){
        for(i=0;i<10;i++){
            if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].col   = 0;//弾の色
                boss_shot.bullet[k].x     = boss.x;//座標
                boss_shot.bullet[k].y     = boss.y;
                boss_shot.bullet[k].knd   = 2;//弾の種類
                boss_shot.bullet[k].angle = PI2/10*i;//角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].cnt   = 0;
                boss_shot.bullet[k].spd   = 5;//スピード
                boss_shot.bullet[k].eff      = 1;//加算ブレンドオン
                se_flag[0]=1;
            }
        }
    }

    for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet.flag>0){//登録されてる弾なら
            if(CheckStatePad(configpad.shot)==1){//ショットボタンが押された瞬間なら
                //ボスの位置-100~100の範囲を消す
                if(boss.x-100<boss_shot.bullet.x && boss_shot.bullet.x<boss.x+100 && 
                    boss.y-100<boss_shot.bullet.y && boss_shot.bullet.y<boss.y+100)
                {
                    boss_shot.bullet.flag=0;
                }
            }
        }
    }

}

yu

Re:レーザーの消し方

#4

投稿記事 by yu » 16年前

返信ありがとうございます。

加算ブレンド・・・すっかり忘れていました。
このやり方は考えたのですが、画像の重なりが一部分見えてしまうな。と思ってやめました。
これなら途切れるレーザーも作れますね。


しかし、レーザーが太くなると当たり判定が少し変になりそうですね・・・
横幅=円の直径=当たり判定になるのでレーザーの先の方が丸くなってしまいそうです。
それと、これは別にあまり気になりませんが、
レーザーを出す位置の後ろの方にもレーザーが見えてしまうのではないでしょうか。


しかし、龍神録plusをやっているとレーザーに全く違和感がありません。
当たり判定も正確でした。

自分も弾を重ねてレーザーを作ることにします。


わざわざ自分のためにサンプルまで作っていただき本当にありがとうございました。m(_ _)m

Dixq (管理人)

Re:レーザーの消し方

#5

投稿記事 by Dixq (管理人) » 16年前

当たり判定範囲について、先端が丸くなっては変です?
多分少々内部の形がおかしくても気にならないような気がしますが、
長方形の方がよければ長方形と円で判定すればいいと思います。

>レーザーを出す位置の後ろの方にもレーザーが見えてしまうのではないでしょうか。

そうなります。
でも、そんなに気にならないんですよね。
もし気になるのなら、ボスの位置から発射するのではなく、ボスの位置から少し進行方向に進んだ位置を初期位置にしたらいいと思います。
この辺は進ませすぎてボスの位置が安置にならないように気をつければ問題ないかと。

後、レーザーを連続発射する時は当たり判定範囲に気をつけて下さい。

今レーザー一本の当たり判定の長さが50だとします。
スピード5で、10カウントに1回ずつ連続発射すると、当たり判定に隙間無く連続になりますが、
例えば12カウントに1回ずつ連続発射すると、見た目つながってみえても、
当たり判定の無い部分が継ぎ目に出来てしまう可能性があります。

それから、龍神録はレーザーが進行方向に動くこと、キャラがレーザーを横切ることは想定していますが、
レーザー自体が回転することは想定していません。

進行方向であればどんなに早くレーザーが動いても、軌跡からあたったかどうか判定します、
また、キャラクタが動いた軌跡からも当たり判定を計算します。
しかし進行方向以外に回転したりすると、当たらない可能性があります。

現に龍神録のオマケ弾幕、芸術~の弾幕はレーザーを回転させているため、キャラが止まっていて、回転したレーザーが上を回転して移動すると、時々すり抜けることがあります。

画像

赤がレーザーだとして矢印の方向に回転しているとします。この時、緑の場所にいると当たらないってことです。
もしレーザーを回転させたいならこの辺をうまく処理する必要がありそうです。

yu

Re:レーザーの消し方

#6

投稿記事 by yu » 16年前

>当たり判定範囲について、先端が丸くなっては変です?

すみません。orz
勘違いです;


>もしレーザーを回転させたいならこの辺をうまく処理する必要がありそうです。

回転は・・・自分では無理そうなので、やめておきます。
本当に数学が苦手で、習いたての三角関数で精一杯です。


やっぱりいきなりstg作るのは無謀だったかな・・・
小さいゲームから取り掛かった方が良かったかもしれません。
本当にstgの質問ばっかりしてごめんなさい。

長方形と円の当たり判定なんて全く分かりませんでしたw

Dixq (管理人)

Re:レーザーの消し方

#7

投稿記事 by Dixq (管理人) » 16年前

まだ一度もゲームを作り上げた事がないなら小さいゲームを一つ作り上げてみるっていうものいい経験かもしれません。
サンプルプログラミングの館とか参考にしてもらってもいいと思います。
最初はジャンケン作るだけでも案外大変だと思います。
まずコンソールでジャンケンできるようにしてから、次にDXライブラリで・・。みたいな流れがいいでしょうか?

>本当に数学が苦手で

私も大の苦手です!
数学の難しい事はよくわかりませんw

でも、「解る事で実装する」これを積み重ねていけば案外誤魔化せる事多いんですよ。
長方形と円がわからなければ、計算は面倒になりますがいっぱい円並べてもいいわけですし、
ベジェ曲線とか、物理的な制御を使った運動とか使わなくても、適当に作った計算式でそれっぽくなるように
試行錯誤してもいいわけですし、
または、サインって何?コサインって何?って状態だとしても、
「斜辺にサインをかけたらy成分が出る」って事だけ解ってたら計算出来るわけですから、
大事なのは知識より知恵ですよ!

例えばテレビを見るとき、基盤の構造や電子の流れまで全て解っている人はごく一部だと思います。
でもそんなこと全く知らなくてもテレビはみんな操作できます。
「中身の理論」を知らなくても「使い方」を知ってるからです。

小学生でもシューティング作ってる人知ってます。
サインやコサインの理屈は知らないらしいですが、使い方を知っているから作れるらしいです。

シューティングを作る為に必要な数学的知識なんてごくごく僅かだと思います。
後は関数の「使い方」を知る事で中身の理論知らなくても誤魔化せると思います。

最後に、好きこそものの上手なれ、これは本当にそのとおりだと思います。
・・ということで、今現在の知識量は問題じゃなく、
自分の「作りたい!」と思うゲームを作るのが一番だと思いますよ☆

閉鎖

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