龍神録のプログラムを使ってゲームを作っています。
龍神録プログラミングの館にはグレイズがなかったので実装しようと思いグレイズの判定を作って成功したのですが、件名のとおりグレイズカウントが物凄い速さで上がっていきます。
http://dixq.net/forum/viewtopic.php?f=3 ... %BA#p27640
↑を参考に見ていたのですがよくわからず何日か悩んでいますどなたかアドバイスをおねがいします。
グレイズのカウント
Re: グレイズのカウント
グレイズカウント処理の前にif文を挿入してはどうですか?
簡単な例を書いておきます。
static int count = 0;
if ( count++ % 50 == 0 ) // 50回処理が通ったら1回処理する
{
グレイズカウントアップ処理
}
簡単な例を書いておきます。
static int count = 0;
if ( count++ % 50 == 0 ) // 50回処理が通ったら1回処理する
{
グレイズカウントアップ処理
}
Re: グレイズのカウント
>>south様
説明不足で申し訳ないです。
先ほどのURLのDixq (管理人)様の
確かに当たり判定範囲にあった時、+1すればいいのでしょうが、グレイズは当たり判定範囲にあっただけで+1しないようにするのがポイントです。
もし当たり判定範囲に入っているだけで+1してしまうと、遅い弾などの近くにいると、すごい勢いでグレイズが上がってしまいます。
(マイフレームカウントしてしまう)
グレイズに関する変数は弾にも持たせる必要があり、その弾は発射してから当たり判定範囲が満たされたことがあるかどうかも調べる必要があります。
ですので、bullet_t構造体にグレイズ変数を用意し、弾を発射した時に1とでも代入しておき、グレイズの判定を満たしたら、これを0にしておき、再度判定されないようにするなどの工夫が必要だと思います。
↑こんな感じのを実装したかったのですが説明が足りず、すいませんでした。
説明不足で申し訳ないです。
先ほどのURLのDixq (管理人)様の
確かに当たり判定範囲にあった時、+1すればいいのでしょうが、グレイズは当たり判定範囲にあっただけで+1しないようにするのがポイントです。
もし当たり判定範囲に入っているだけで+1してしまうと、遅い弾などの近くにいると、すごい勢いでグレイズが上がってしまいます。
(マイフレームカウントしてしまう)
グレイズに関する変数は弾にも持たせる必要があり、その弾は発射してから当たり判定範囲が満たされたことがあるかどうかも調べる必要があります。
ですので、bullet_t構造体にグレイズ変数を用意し、弾を発射した時に1とでも代入しておき、グレイズの判定を満たしたら、これを0にしておき、再度判定されないようにするなどの工夫が必要だと思います。
↑こんな感じのを実装したかったのですが説明が足りず、すいませんでした。
Re: グレイズのカウント
質問をすこし変えます。
弾幕に1を代入する処理とはどんな処理何でしょうか?
こんな質問ですみません。
弾幕に1を代入する処理とはどんな処理何でしょうか?
こんな質問ですみません。
Re: グレイズのカウント
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: グレイズのカウント
はい、シューティングの弾幕を避けた時に入る点です。
bullet_t構造体にグレイズ変数を用意し、弾を発射した時に1とでも代入しておき、グレイズの判定を満たしたら、これを0にしておき、再度判定されないようにするなどの工夫
これの処理の仕方がわからず悩んでおります。(ToT)
bullet_t構造体にグレイズ変数を用意し、弾を発射した時に1とでも代入しておき、グレイズの判定を満たしたら、これを0にしておき、再度判定されないようにするなどの工夫
これの処理の仕方がわからず悩んでおります。(ToT)
Re: グレイズのカウント
southです。
読解不足でした。
ドクダミ茶さんがどのようなグレイズカウントアップ処理を組んだのか分らないので使えるのかわかりませんが
60章のプロジェクトをベースにグレイズ判定を追加してみました。
色強調ができなかったので追加位置に全角の「!」入れてるので確認後消してください。
ボスが出現して初めの弾幕にしかboss_shot.bullet[k].graze = 1;を追加していないので他はグレイズ判定は行われません。
確認する場合は、ボスが出現するまで進めてください。
bullet_t構造体にgraze判定用の変数を追加
struct.h // 61行目付近
弾幕を登録する際にグレイズ判定を初期化
boss_shotH.cpp // 13行目付近
グレイズ判定用の関数(弾の当たり判定+ 5.0fがかすり判定)
out.cpp // 93行目付近
かすり判定を実際に行ってかすっていた時の処理を追加
out.cpp // 210行目付近
読解不足でした。
ドクダミ茶さんがどのようなグレイズカウントアップ処理を組んだのか分らないので使えるのかわかりませんが
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){
//
// }
// }
}
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: グレイズのカウント
southさんが仰るように四聖龍神録Plusでも同様に弾にグレイズ用フラグを持たせて、一度グレイズした弾はもうグレイズしないようにしています。
弾が戻ってきた時、かすってもグレイズにならないので、もし厳密にしたければ、一度グレイズした弾が範囲外に出たらフラグを戻す処理も必要かもしれません。
弾が戻ってきた時、かすってもグレイズにならないので、もし厳密にしたければ、一度グレイズした弾が範囲外に出たらフラグを戻す処理も必要かもしれません。
Re: グレイズのカウント
>>south様
south様のコードを実装してみたところ難なく解決いたしました。
ありがとうございました。<m(_ _)m>
>>Dixq (管理人)様
アドバイスありがとうございました。<m(_ _)m>
僕の説明不足がためにすみませんでした。読解不足でした。
south様のコードを実装してみたところ難なく解決いたしました。
ありがとうございました。<m(_ _)m>
>>Dixq (管理人)様
わかりました、機会があればやってみようと思います。弾が戻ってきた時、かすってもグレイズにならないので、もし厳密にしたければ、一度グレイズした弾が範囲外に出たらフラグを戻す処理も必要かもしれません。
アドバイスありがとうございました。<m(_ _)m>