グレイズのカウント

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
ドクダミ茶
記事: 12
登録日時: 13年前
住所: 広島県

グレイズのカウント

#1

投稿記事 by ドクダミ茶 » 13年前

龍神録のプログラムを使ってゲームを作っています。
龍神録プログラミングの館にはグレイズがなかったので実装しようと思いグレイズの判定を作って成功したのですが、件名のとおりグレイズカウントが物凄い速さで上がっていきます。

http://dixq.net/forum/viewtopic.php?f=3 ... %BA#p27640

↑を参考に見ていたのですがよくわからず何日か悩んでいますどなたかアドバイスをおねがいします。

south

Re: グレイズのカウント

#2

投稿記事 by south » 13年前

グレイズカウント処理の前にif文を挿入してはどうですか?

簡単な例を書いておきます。

static int count = 0;
if ( count++ % 50 == 0 ) // 50回処理が通ったら1回処理する
{
   グレイズカウントアップ処理
}

アバター
ドクダミ茶
記事: 12
登録日時: 13年前
住所: 広島県

Re: グレイズのカウント

#3

投稿記事 by ドクダミ茶 » 13年前

>>south様
説明不足で申し訳ないです。
先ほどのURLのDixq (管理人)様の

確かに当たり判定範囲にあった時、+1すればいいのでしょうが、グレイズは当たり判定範囲にあっただけで+1しないようにするのがポイントです。
もし当たり判定範囲に入っているだけで+1してしまうと、遅い弾などの近くにいると、すごい勢いでグレイズが上がってしまいます。
(マイフレームカウントしてしまう)

グレイズに関する変数は弾にも持たせる必要があり、その弾は発射してから当たり判定範囲が満たされたことがあるかどうかも調べる必要があります。

ですので、bullet_t構造体にグレイズ変数を用意し、弾を発射した時に1とでも代入しておき、グレイズの判定を満たしたら、これを0にしておき、再度判定されないようにするなどの工夫が必要だと思います。

↑こんな感じのを実装したかったのですが説明が足りず、すいませんでした。

アバター
ドクダミ茶
記事: 12
登録日時: 13年前
住所: 広島県

Re: グレイズのカウント

#4

投稿記事 by ドクダミ茶 » 13年前

質問をすこし変えます。
弾幕に1を代入する処理とはどんな処理何でしょうか?
こんな質問ですみません。

アバター
あたっしゅ
記事: 664
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: グレイズのカウント

#5

投稿記事 by あたっしゅ » 13年前

グレイズって何 ?

調べてみた。
http://dic.nicovideo.jp/a/%E3%82%B0%E3% ... 4%E3%82%BA

これのことか ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
ドクダミ茶
記事: 12
登録日時: 13年前
住所: 広島県

Re: グレイズのカウント

#6

投稿記事 by ドクダミ茶 » 13年前

はい、シューティングの弾幕を避けた時に入る点です。

bullet_t構造体にグレイズ変数を用意し、弾を発射した時に1とでも代入しておき、グレイズの判定を満たしたら、これを0にしておき、再度判定されないようにするなどの工夫
これの処理の仕方がわからず悩んでおります。(ToT)

アバター
サウス
記事: 78
登録日時: 13年前
住所: 千葉
連絡を取る:

Re: グレイズのカウント

#7

投稿記事 by サウス » 13年前

southです。
読解不足でした。

ドクダミ茶さんがどのようなグレイズカウントアップ処理を組んだのか分らないので使えるのかわかりませんが
60章のプロジェクトをベースにグレイズ判定を追加してみました。
色強調ができなかったので追加位置に全角の「!」入れてるので確認後消してください。

ボスが出現して初めの弾幕にしかboss_shot.bullet[k].graze = 1;を追加していないので他はグレイズ判定は行われません。
確認する場合は、ボスが出現するまで進めてください。

bullet_t構造体にgraze判定用の変数を追加
struct.h // 61行目付近

コード:

//弾に関する構造体
typedef struct{
	//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
	int flag,knd,cnt,col,state,till,eff,kaiten,eff_detail;
	int cnt_till,cnt_stt;
	//座標、角度、速度、ベースの角度、一時記憶スピード
	double x,y,vx,vy,angle,spd,base_angle[1],rem_spd[1];
	int c_flag;
	double cx,cy;
!	int graze;
}bullet_t;
弾幕を登録する際にグレイズ判定を初期化
boss_shotH.cpp // 13行目付近

コード:

void boss_shot_bulletH000(){
#define TM000 120
    int i,k,t=boss_shot.cnt%TM000,t2=boss_shot.cnt;
    double angle;
    //60カウント以下で10カウントに1回
    if(t<60 && t%10==0){
        angle=bossatan2();//自機とボスとの成す角
        for(i=0;i<30;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   = 8;//弾の種類
                boss_shot.bullet[k].angle = angle+PI2/30*i;//角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].cnt      = 0;
                boss_shot.bullet[k].spd      = 3;//スピード
!                boss_shot.bullet[k].graze = 1;
                se_flag[0]=1;
            }
        }
    }
//    for(i=0;i<BOSS_BULLET_MAX;i++){
//        if(boss_shot.bullet[i].flag>0){
//
//        }
//    }
}
グレイズ判定用の関数(弾の当たり判定+ 5.0fがかすり判定)
out.cpp // 93行目付近

コード:

!int out_judge_bossshot_graze(int n){
!    if(boss_shot.bullet[n].cnt>0 && boss_shot.bullet[n].graze != 0){//ショットの軌道が1度でも計算されていたら
!        if(out_judge(
!            boss_shot.bullet[n].x,boss_shot.bullet[n].y,ch.x,ch.y,
!            bullet_info[boss_shot.bullet[n].knd].range + 5.0f,CRANGE,
!            boss_shot.bullet[n].spd,boss_shot.bullet[n].angle
!            )){
!                return 1;
!        }
!    }
!    return 0;
!}

int serch_item(){
	for(int i=0;i<ITEM_MAX;i++)
		if(item[i].flag==0)
			return i;
	return -1;
}
かすり判定を実際に行ってかすっていた時の処理を追加
out.cpp // 210行目付近

コード:

//敵ショットと自機との処理
void enemyshot_and_ch(){
    int s,n;
	if(ch.flag==0 && ch.mutekicnt==0 && out_lazer()==1){
        ch.cnt=0;
        ch.flag=1;
        se_flag[3]=1;
	}
    //雑魚敵のショット
    for(s=0;s<SHOT_MAX;s++){//敵ショット総数
        if(shot[s].flag>0){//そのショットが登録されていたら
            for(n=0;n<SHOT_BULLET_MAX;n++){//弾総数
                if(shot[s].bullet[n].flag==1){//弾が登録されていたら
					if(bom.flag!=0){
						shot[s].bullet[n].flag=0;
						continue;
					}
                    if(out_judge_enemyshot(s,n)==1){//自機にその弾が接触していたら
                        shot[s].bullet[n].flag=0;//弾をオフ
                        if(ch.flag==0 && ch.mutekicnt==0){
                            ch.cnt=0;
                            ch.flag=1;
                            se_flag[3]=1;
                        }
                    }
                }
            }
        }
    }
    //ボスのショット
    if(boss_shot.flag>0){//そのショットが登録されていたら
        for(n=0;n<BOSS_BULLET_MAX;n++){//弾総数
            if(boss_shot.bullet[n].flag==1){//弾が登録されていたら
				if(bom.flag!=0){
					boss_shot.bullet[n].flag=0;
					continue;
				}
                if(out_judge_bossshot(n)==1){//自機にその弾が接触していたら
                    boss_shot.bullet[n].flag=0;//弾をオフ
                    if(ch.flag==0 && ch.mutekicnt==0){
                        ch.cnt=0;
                        ch.flag=1;
                        se_flag[3]=1;
                    }
                }
!                if(out_judge_bossshot_graze(n)==1){//自機にその弾がかすっていたら
!					boss_shot.bullet[n].graze = 0;	//かすり判定OFF
!                    printfDx("かすった!");// ここにカウントアップ処理を追加
!                }
            }
        }
    }
}
最後に編集したユーザー サウス on 2011年5月05日(木) 08:21 [ 編集 1 回目 ]

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: グレイズのカウント

#8

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

southさんが仰るように四聖龍神録Plusでも同様に弾にグレイズ用フラグを持たせて、一度グレイズした弾はもうグレイズしないようにしています。
弾が戻ってきた時、かすってもグレイズにならないので、もし厳密にしたければ、一度グレイズした弾が範囲外に出たらフラグを戻す処理も必要かもしれません。

アバター
ドクダミ茶
記事: 12
登録日時: 13年前
住所: 広島県

Re: グレイズのカウント

#9

投稿記事 by ドクダミ茶 » 13年前

>>south様
読解不足でした。
僕の説明不足がためにすみませんでした。
south様のコードを実装してみたところ難なく解決いたしました。
ありがとうございました。<m(_ _)m>

>>Dixq (管理人)様
弾が戻ってきた時、かすってもグレイズにならないので、もし厳密にしたければ、一度グレイズした弾が範囲外に出たらフラグを戻す処理も必要かもしれません。
わかりました、機会があればやってみようと思います。
アドバイスありがとうございました。<m(_ _)m>

閉鎖

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