>ookamiさん
やはり一次関数が無難でしょうか。
なんだか無駄に長いソースになってしまいましたが、レーザーの起点、向きを使って一次関数を出し、それを比較の対象にすることにしました。
構造体とか纏めればもう少し見栄えも良くなるかなと思います……。あと変なコメント消したり。
考えながら行き当たりばったりにやってるものでごちゃごちゃします。どうにかしないといけませんね。
レーザー実装の為に書き直したのにそもそものレーザーを発生させる部分のソースが出来てないのでレーザー描画の部分についてこれで合ってるかが不明ですが、キャラクター描画順に関してはとりあえず無問題でしたので、たぶんレーザーも大丈夫かなーと。根拠はないのですが。
本当ならばしっかり実装してから色々報告したかったのですが、一応これで解決とさせていただきます。
予定はありませんがもっと複雑になったら3D機能のことも調べつつ実装してみようと思います。
ありがとうございました。
コード:
void Drawfunc()
{
struct Graph *top=(struct Graph*)calloc(1,sizeof(struct Graph));
struct Graph *newptr=top;
struct Graph *ptr;
for(int i=0;i<256;i++){//レーザーのグラフ順位を最初に入力しなければ後に描画順序が狂う
if(Atk[i].type>=1000){
if(top->flag==0){//最初のレーザーは無条件
newptr->number=i+128;
newptr->flag=1;
newptr->next=(struct Graph*)calloc(1,sizeof(struct Graph));
}
else{
newptr=top;
while(1){
if(newptr!=NULL && -tan(Atk[i].muki)*100+(Atk[i].y)+tan(Atk[i].muki)*Atk[i].x <=-tan(Atk[(newptr->number)-128].muki)*100+(Atk[(newptr->number)-128].y)+tan(Atk[(newptr->number)-128].muki)*Atk[(newptr->number)-128].x ){//あるx座標(何でもいいので無作為に100で)でのy座標を比べる
//もし現在入力待ちのデータが現在調べている対象よりy座標が小さければ入力
ptr=(struct Graph*)calloc(1,sizeof(struct Graph));
ptr->flag=1;
ptr->next=newptr->next;
ptr->number=newptr->number;
newptr->number=i+128;
newptr->flag=1;
newptr->next=ptr;
break;
}
if(newptr->next==NULL)
{
newptr->next=(struct Graph*)calloc(1,sizeof(struct Graph));
newptr->next->flag=1;
newptr->next->number=i+128;
break;
}
newptr=newptr->next;
}
}
}
}
for(int i=0;i<256;i++){//通常の弾の入力
if(Atk[i].type>0 && Atk[i].type<1000){
if(top->flag==0){//最初のは無条件
newptr->number=i+128;
newptr->flag=1;
newptr->next=(struct Graph*)calloc(1,sizeof(struct Graph));
}
else{
newptr=top;
while(1){
if(newptr!=NULL && Atk[(newptr->number)-128].type<1000 && Atk[(newptr->number)-128].type>0){
if(Atk[i].y <=Atk[(newptr->number)-128].y ){//Atk[i]のx座標()でのy座標を比べる
//もし現在入力待ちのデータが現在調べている対象よりy座標が小さければ入力
ptr=(struct Graph*)calloc(1,sizeof(struct Graph));
ptr->flag=1;
ptr->next=newptr->next;
ptr->number=newptr->number;
newptr->number=i+128;
newptr->flag=1;
newptr->next=ptr;
break;
}
}
if(newptr!=NULL &&Atk[(newptr->number)-128].type>=1000){
if(Atk[i].y <=-tan(Atk[(newptr->number)-128].muki)*Atk[i].x+(Atk[(newptr->number)-128].y)+tan(Atk[(newptr->number)-128].muki)*Atk[(newptr->number)-128].x ){//Atk[i]のx座標()でのy座標を比べる
//もし現在入力待ちのデータが現在調べている対象よりy座標が小さければ入力
ptr=(struct Graph*)calloc(1,sizeof(struct Graph));
ptr->flag=1;
ptr->next=newptr->next;
ptr->number=newptr->number;
newptr->number=i+128;
newptr->flag=1;
newptr->next=ptr;
break;
}
}
if(newptr->next==NULL)
{
newptr->next=(struct Graph*)calloc(1,sizeof(struct Graph));
newptr->next->flag=1;
newptr->next->number=i+128;
break;
}
newptr=newptr->next;
}
}
}
}
for(int i=0;i<128;i++){//キャラクターの入力
if(Chara[i].type>0){
if(top->flag==0){//最初のは無条件
newptr->number=i;
newptr->flag=1;
newptr->next=(struct Graph*)calloc(1,sizeof(struct Graph));
}
else{
newptr=top;
while(1){
if(newptr!=NULL &&newptr->number>=128){//対象が攻撃オブジェクトのばあい
if(Atk[(newptr->number)-128].type<1000 && Atk[(newptr->number)-128].type>0){//対象が弾の場合
if(Chara[i].y <=Atk[(newptr->number)-128].y ){//Atk[i]のx座標()でのy座標を比べる
//もし現在入力待ちのデータが現在調べている対象よりy座標が小さければ入力
ptr=(struct Graph*)calloc(1,sizeof(struct Graph));
ptr->flag=1;
ptr->next=newptr->next;
ptr->number=newptr->number;
newptr->number=i;
newptr->flag=1;
newptr->next=ptr;
break;
}
}
if(Atk[(newptr->number)-128].type>=1000){//対象がレーザーの場合
if(Chara[i].y <=-tan(Atk[(newptr->number)-128].muki)*Chara[i].x+(Atk[(newptr->number)-128].y)+tan(Atk[(newptr->number)-128].muki)*Atk[(newptr->number)-128].x ){//Atk[i]のx座標()でのy座標を比べる
//もし現在入力待ちのデータが現在調べている対象よりy座標が小さければ入力
ptr=(struct Graph*)calloc(1,sizeof(struct Graph));
ptr->flag=1;
ptr->next=newptr->next;
ptr->number=newptr->number;
newptr->number=i;
newptr->flag=1;
newptr->next=ptr;
break;
}
}
}
if(newptr!=NULL &&newptr->number<128){//対象がキャラクターの場合
if(Chara[i].y <=Chara[newptr->number].y ){//Atk[i]のx座標()でのy座標を比べる
//もし現在入力待ちのデータが現在調べている対象よりy座標が小さければ入力
ptr=(struct Graph*)calloc(1,sizeof(struct Graph));
ptr->flag=1;
ptr->next=newptr->next;
ptr->number=newptr->number;
newptr->number=i;
newptr->flag=1;
newptr->next=ptr;
break;
}
}
if(newptr->next==NULL)
{
newptr->next=(struct Graph*)calloc(1,sizeof(struct Graph));
newptr->next->flag=1;
newptr->next->number=i;
break;
}
newptr=newptr->next;
}
}
}
}
//以下は入力されたデータをもとに描画する
float g_x=Chara[0].x+Xdis(50,UtoQ(Chara[0].muki));
float g_y=Chara[0].y-Ydis(50,UtoQ(Chara[0].muki));
DrawGraph(320.0-g_x,240-g_y,UseMisData.graph,TRUE);//背景描画
//以下キャラ、オブジェクト、弾の描画
int muki;
int count;
newptr=top;
while(1){
count=0;
if(newptr->number<128){//キャラクター構造体
if(Chara[newptr->number].muki<=0+PAI/8 || Chara[newptr->number].muki>PAI/4*7+PAI/8){muki=0;}
if(Chara[newptr->number].muki>=PAI/4-PAI/8 && Chara[newptr->number].muki<PAI/4+PAI/8){muki=1;}
if(Chara[newptr->number].muki>=PAI/4*2-PAI/8 && Chara[newptr->number].muki<PAI/4*2+PAI/8){muki=2;}
if(Chara[newptr->number].muki>=PAI/4*3-PAI/8 && Chara[newptr->number].muki<PAI/4*3+PAI/8){muki=3;}
if(Chara[newptr->number].muki>=PAI/4*4-PAI/8 && Chara[newptr->number].muki<PAI/4*4+PAI/8){muki=4;}
if(Chara[newptr->number].muki>=PAI/4*5-PAI/8 && Chara[newptr->number].muki<PAI/4*5+PAI/8){muki=5;}
if(Chara[newptr->number].muki>=PAI/4*6-PAI/8 && Chara[newptr->number].muki<PAI/4*6+PAI/8){muki=6;}
if(Chara[newptr->number].muki>=PAI/4*7-PAI/8 && Chara[newptr->number].muki<PAI/4*7+PAI/8){muki=7;}
DrawRotaGraph(320-(g_x-Chara[newptr->number].x),240-(g_y-Chara[newptr->number].y),1,0,Chara[newptr->number].graph[muki],TRUE,FALSE);
}
if(newptr->number>=128 && Atk[(newptr->number)-128].type<1000){//普通の攻撃構造体
if(Atk[(newptr->number)-128].muki<=0+PAI/8 || Atk[(newptr->number)-128].muki>PAI/4*7+PAI/8){muki=0;}
if(Atk[(newptr->number)-128].muki>=PAI/4-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4+PAI/8){muki=1;}
if(Atk[(newptr->number)-128].muki>=PAI/4*2-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*2+PAI/8){muki=2;}
if(Atk[(newptr->number)-128].muki>=PAI/4*3-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*3+PAI/8){muki=3;}
if(Atk[(newptr->number)-128].muki>=PAI/4*4-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*4+PAI/8){muki=4;}
if(Atk[(newptr->number)-128].muki>=PAI/4*5-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*5+PAI/8){muki=5;}
if(Atk[(newptr->number)-128].muki>=PAI/4*6-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*6+PAI/8){muki=6;}
if(Atk[(newptr->number)-128].muki>=PAI/4*7-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*7+PAI/8){muki=7;}
// DrawRotaGraph(320-(g_x-Atk[(newptr->number)-128].x),240-(g_y-Atk[(newptr->number)-128].y),1,Atk[(newptr->number)-128].muki,Atk[(newptr->number)-128].graph[muki],TRUE,FALSE);
DrawRotaGraph(320-(g_x-Atk[(newptr->number)-128].x),240-(g_y-Atk[(newptr->number)-128].y),1,Atk[(newptr->number)-128].muki,Atk[(newptr->number)-128].graph[0],TRUE,FALSE);
}
if(newptr->number>=128 && Atk[(newptr->number)-128].type>=1000){//レーザーの攻撃構造体
if(Atk[(newptr->number)-128].muki<=0+PAI/8 || Atk[(newptr->number)-128].muki>PAI/4*7+PAI/8){muki=0;}
if(Atk[(newptr->number)-128].muki>=PAI/4-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4+PAI/8){muki=1;}
if(Atk[(newptr->number)-128].muki>=PAI/4*2-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*2+PAI/8){muki=2;}
if(Atk[(newptr->number)-128].muki>=PAI/4*3-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*3+PAI/8){muki=3;}
if(Atk[(newptr->number)-128].muki>=PAI/4*4-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*4+PAI/8){muki=4;}
if(Atk[(newptr->number)-128].muki>=PAI/4*5-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*5+PAI/8){muki=5;}
if(Atk[(newptr->number)-128].muki>=PAI/4*6-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*6+PAI/8){muki=6;}
if(Atk[(newptr->number)-128].muki>=PAI/4*7-PAI/8 && Atk[(newptr->number)-128].muki<PAI/4*7+PAI/8){muki=7;}
while(1){
DrawRotaGraph(320-(g_x-Atk[(newptr->number)-128].x)+cos(Atk[(newptr->number)-128].muki)*40*count,240-(g_y-Atk[(newptr->number)-128].y)-sin(Atk[(newptr->number)-128].muki)*40*count,1,Atk[(newptr->number)-128].muki,Atk[(newptr->number)-128].graph[muki],TRUE,FALSE);
count++;
if(Atk[(newptr->number)-128].length<sqrt((cos(Atk[(newptr->number)-128].muki)*40*count)*(cos(Atk[(newptr->number)-128].muki)*40*count)+(sin(Atk[(newptr->number)-128].muki)*40*count)*(sin(Atk[(newptr->number)-128].muki)*40*count))){
if(count==1){break;}
DrawRotaGraph(320-(g_x-Atk[(newptr->number)-128].x)+cos(Atk[(newptr->number)-128].muki)*(Atk[(newptr->number)-128].length-40),240-(g_y-Atk[(newptr->number)-128].y)-sin(Atk[(newptr->number)-128].muki)*(Atk[(newptr->number)-128].length-40),1,Atk[(newptr->number)-128].muki,Atk[(newptr->number)-128].graph[muki],TRUE,FALSE);//終端を描く
break;
}
}
}
if(newptr->next==NULL){break;}
else{newptr=newptr->next;}
}
}