フルスクリーンの件については、本当にありがとうございました。
無事に龍神録のページを見終えて、色々いじっているのですが、グレイズの実装がよく分からず
再び質問させていただきました。
前に同じ質問をしていた方がいらっしゃったのですが、
僕自信c言語を始めて日が浅いので
その質問のところを見てもあまりよく理解できませんでした。
グレイズの実装はほぼ何も出来ていないに等しい状態です。
できれば分かりやすく教えていただきたいです。
どうかよろしくお願いします。
グレイズについて
Re:グレイズについて
あたり判定を行っている部分は分かるでしょうか?
確認したところ龍神録の館ではout_judge_enemyshot関数内の以下の部分ですね
半径計算部分
double r = bullet_info[shot.bullet[n].knd].range+CRANGE;
あたり判定部分
if(x*x+y*y<r*r) return 1; //当たり判定内なら当たり
これと同様の関数を作ってあげて
半径計算部分
double r = bullet_info[shot.bullet[n].knd].range+CRANGE+(グレイズ範囲);
と少し半径を大きくしてやって
同じようにあたり判定部分
if(x*x+y*y<r*r) return 1; //当たり判定内ならグレイズ
としてやり、1が返ってきたらグレイズの数を保存している変数を+1してあげると良いかと思います
また同じ弾を連続で何度もグレイズできると一つの弾でたくさんグレイズが増えてしまいます
なので弾の構造体にプレイヤーがグレイズしたか否かのフラグを用意し、グレイズ判定する際、
すでにグレイズ済みの弾なら0を返し、未グレイズでグレイズしているなら1を返す、とすると良いかと思います
また、あたり判定とほぼ同じ処理なのであたり判定とグレイズ判定は一つにまとめてしまった方が効率的だと思います
確認したところ龍神録の館ではout_judge_enemyshot関数内の以下の部分ですね
半径計算部分
double r = bullet_info[shot.bullet[n].knd].range+CRANGE;
あたり判定部分
if(x*x+y*y<r*r) return 1; //当たり判定内なら当たり
これと同様の関数を作ってあげて
半径計算部分
double r = bullet_info[shot.bullet[n].knd].range+CRANGE+(グレイズ範囲);
と少し半径を大きくしてやって
同じようにあたり判定部分
if(x*x+y*y<r*r) return 1; //当たり判定内ならグレイズ
としてやり、1が返ってきたらグレイズの数を保存している変数を+1してあげると良いかと思います
また同じ弾を連続で何度もグレイズできると一つの弾でたくさんグレイズが増えてしまいます
なので弾の構造体にプレイヤーがグレイズしたか否かのフラグを用意し、グレイズ判定する際、
すでにグレイズ済みの弾なら0を返し、未グレイズでグレイズしているなら1を返す、とすると良いかと思います
また、あたり判定とほぼ同じ処理なのであたり判定とグレイズ判定は一つにまとめてしまった方が効率的だと思います
Re:グレイズについて
>>nayo さん
ありがとうございました。
アドバイスを参考にプログラムを組んでみたのですが
このようなエラーが出ました。
----------------------------------------------------------------------------------------------------
error C2440: '=' : 'int (__cdecl *)(double,double,double,double,double,double,double,double)' から 'int' に変換できません。
----------------------------------------------------------------------------------------------------
どうしてもこのエラーだけが取ることが出来ません。
どうしたらとれるのでしょうか?
組んだプログラムは
----------------------------------------------------------------------------------------------------
//自機と敵ショットがグレイズしたかどうかを判定する
int out_judge_enemyshot_graze(int s,int n){
if(shot.bullet[n].cnt>0){//ショットの軌道が1度でも計算されていたら
if(out_judge(
shot.bullet[n].x,shot.bullet[n].y,ch.x,ch.y,
bullet_info[shot.bullet[n].knd].range2,CRANGE,
shot.bullet[n].spd,shot.bullet[n].angle
)){
return 1;
}
}
{if(1 = out_judge)
ch.graze += 1;
}
return 0;
}
----------------------------------------------------------------------------------------------------
range2 は新たに定義したグレイズする範囲です。
ありがとうございました。
アドバイスを参考にプログラムを組んでみたのですが
このようなエラーが出ました。
----------------------------------------------------------------------------------------------------
error C2440: '=' : 'int (__cdecl *)(double,double,double,double,double,double,double,double)' から 'int' に変換できません。
----------------------------------------------------------------------------------------------------
どうしてもこのエラーだけが取ることが出来ません。
どうしたらとれるのでしょうか?
組んだプログラムは
----------------------------------------------------------------------------------------------------
//自機と敵ショットがグレイズしたかどうかを判定する
int out_judge_enemyshot_graze(int s,int n){
if(shot.bullet[n].cnt>0){//ショットの軌道が1度でも計算されていたら
if(out_judge(
shot.bullet[n].x,shot.bullet[n].y,ch.x,ch.y,
bullet_info[shot.bullet[n].knd].range2,CRANGE,
shot.bullet[n].spd,shot.bullet[n].angle
)){
return 1;
}
}
{if(1 = out_judge)
ch.graze += 1;
}
return 0;
}
----------------------------------------------------------------------------------------------------
range2 は新たに定義したグレイズする範囲です。
Re:グレイズについて
エラーの原因は
>{if(1 = out_judge)
ですね。
out_judgeは
int out_judge(double x1, double y1, double x2, double y2,double range1, double range2, double spd1,double angle1){
//略
}
となっているので確認してください。
out_judge_enemyshot_graze関数内でグレイズの処理を行おうとしているみたいですが、
enemyshot_and_ch関数で行ってみてはどうでしょうか?
nayoさんが書かれているように、弾の構造体にグレイズしたかどうかのフラグを用意して(ここではg_flagとする)
//自機と敵ショットがグレイズしたかどうかを判定する
int out_judge_enemyshot_graze(int s,int n){
if(shot.bullet[n].cnt>0){//ショットの軌道が1度でも計算されていたら
if(shot.bullet[n].g_flag == 0 && out_judge(shot.bullet[n].x,shot.bullet[n].y,ch.x,ch.y,
bullet_info[shot.bullet[n].knd].range2,CRANGE,shot.bullet[n].spd,shot.bullet[n].angle)){
return 1;
}
}
return 0;
}
とし、enemyshot_and_ch関数で
//敵ショットと自機との処理
void enemyshot_and_ch(){
//略
//雑魚敵のショット
for(s=0;s<SHOT_MAX;s++){//敵ショット総数
if(shot.flag>0){//そのショットが登録されていたら
for(n=0;n<SHOT_BULLET_MAX;n++){//弾総数
if(shot.bullet[n].flag==1){//弾が登録されていたら
if(bom.flag!=0){
shot.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(out_judge_enemyshot_graze(s,n) == 1){
++ch.graze;
shot[s].bullet[n].g_flag = 1;
//ここでグレイズ音も処理すればいいかもしれません
}
}
}
}
}
//略
}
ボスに関しても同じようにすればできるかも。
私はグレイズの処理は実装してないので、間違ってたらすみません。
>{if(1 = out_judge)
ですね。
out_judgeは
int out_judge(double x1, double y1, double x2, double y2,double range1, double range2, double spd1,double angle1){
//略
}
となっているので確認してください。
out_judge_enemyshot_graze関数内でグレイズの処理を行おうとしているみたいですが、
enemyshot_and_ch関数で行ってみてはどうでしょうか?
nayoさんが書かれているように、弾の構造体にグレイズしたかどうかのフラグを用意して(ここではg_flagとする)
//自機と敵ショットがグレイズしたかどうかを判定する
int out_judge_enemyshot_graze(int s,int n){
if(shot.bullet[n].cnt>0){//ショットの軌道が1度でも計算されていたら
if(shot.bullet[n].g_flag == 0 && out_judge(shot.bullet[n].x,shot.bullet[n].y,ch.x,ch.y,
bullet_info[shot.bullet[n].knd].range2,CRANGE,shot.bullet[n].spd,shot.bullet[n].angle)){
return 1;
}
}
return 0;
}
とし、enemyshot_and_ch関数で
//敵ショットと自機との処理
void enemyshot_and_ch(){
//略
//雑魚敵のショット
for(s=0;s<SHOT_MAX;s++){//敵ショット総数
if(shot.flag>0){//そのショットが登録されていたら
for(n=0;n<SHOT_BULLET_MAX;n++){//弾総数
if(shot.bullet[n].flag==1){//弾が登録されていたら
if(bom.flag!=0){
shot.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(out_judge_enemyshot_graze(s,n) == 1){
++ch.graze;
shot[s].bullet[n].g_flag = 1;
//ここでグレイズ音も処理すればいいかもしれません
}
}
}
}
}
//略
}
ボスに関しても同じようにすればできるかも。
私はグレイズの処理は実装してないので、間違ってたらすみません。