質問: 以下のようなプログラムを作ったのですが、人を動かそうとすると背景が消えたり、UFOが表示されなくなったりします。 ほんとは人を動かしながらも、背景はそのままで、UFOは操作せずにずっと動き続けるようなものを作ろうとしています。 なぜ消えたりするのか教えて欲しいです、後どうすればその様になるのか教えていただけると助かります。 ``` #include #include #include #include //人間を描く関数 void humanA1(int x1,int x2); void humanA2(int x1,int x2); void humanB1(int x1,int x2); void humanB2(int x1,int x2); void UFO(int a); void view(void); //void plane1(int a, int gid1); //void plane2( int gid2); //void Flag(int a, int gid1, int gid2); int main(){ int x1=0; int x2=0; int a=0; int v; int key; int count1=0; int count2=0; // int gid1=HgImageLoad("war_stealth_aircraft.png"); // int gid2=HgImageLoad("war_stealth_aircraft2.png"); HgOpen(600,600); //背景 view(); for(;;){ key=HgGetChar(); HgClear(); //背景 view(); //UFO UFO(a); a=a-10; HgClear(); if(a==-400){ a=a+10; HgClear(); UFO(a); HgSleep(0.05); }else if(a==540){ a=a-10; HgClear(); UFO(a); HgSleep(0.05); } //左に動く if(key=='a'){ printf("%d\n",(500+a)); count1++; if(count1%2==0){ humanA2(x1,x2); x1=x1-10; }else{ humanB2(x1,x2); x1=x1-10; } } //右に動く if(key=='d'){ printf("%d\n",(500+a)); count2++; if(count2%2==0){ humanA1(x1,x2); x1=x1+10; }else{ humanB1(x1,x2); x2=x2+10; } } } HgGetChar(); HgClose(); return 0; } void humanA1(int x1,int x2){//右向き HgSetFillColor(HG_ORANGE); HgCircleFill(300+x1+x2, 75, 25,0);//頭 HgLine(300+x1+x2, 50, 300+x1+x2, 25);//胴体 HgLine(275+x1+x2, 38, 325+x1+x2, 38);//肩から手首 HgLine(275+x1+x2, 38, 275+x1+x2, 25);//左手 HgLine(325+x1+x2, 38, 325+x1+x2, 50);//みぎ手 HgLine(300+x1+x2, 25, 275+x1+x2,0);//左足 HgLine(300+x1+x2, 25, 325+x1+x2, 25);//みぎ太もも HgLine(325+x1+x2, 25, 325+x1+x2, 0);//右足 } void humanA2(int x1,int x2){//左向き HgSetFillColor(HG_ORANGE); HgCircleFill(300+x1+x2, 75, 25,0);//頭 HgLine(300+x1+x2, 50, 300+x1+x2, 25);//胴体 HgLine(275+x1+x2, 38, 325+x1+x2, 38);//肩から手首 HgLine(275+x1+x2, 38, 275+x1+x2, 50);//左手 HgLine(325+x1+x2, 38, 325+x1+x2, 25);//みぎ手 HgLine(300+x1+x2, 25, 275+x1+x2, 25);//左足太もも HgLine(275+x1+x2, 25, 275+x1+x2, 0);//左足 HgLine(300+x1+x2, 25, 325+x1+x2, 0);//右足 } void humanB1(int x1,int x2){//右向き HgSetFillColor(HG_ORANGE); HgCircleFill(300+x1+x2, 75, 25,0);//頭 HgLine(300+x1+x2, 50, 300+x1+x2, 25);//胴体 HgLine(300+x1+x2, 38, 275+x1+x2, 30);//左手首 HgLine(275+x1+x2, 30, 290+x1+x2, 25);//左手 HgLine(300+x1+x2, 38, 325+x1+x2, 30);//みぎ手首 HgLine(325+x1+x2, 30, 325+x1+x2, 35);//右手 HgLine(300+x1+x2, 25, 290+x1+x2, 0);//左足 HgLine(300+x1+x2, 25, 325+x1+x2, 13);//右足首 HgLine(325+x1+x2, 13, 312+x1+x2, 0);//右足 } void humanB2(int x1,int x2){//左向き HgSetFillColor(HG_ORANGE); HgCircleFill(300+x1+x2, 75, 25,0);//頭 HgLine(300+x1+x2, 50, 300+x1+x2, 25);//胴体 HgLine(300+x1+x2, 38, 275+x1+x2, 30);//左手首 HgLine(275+x1+x2, 30, 290+x1+x2, 35);//左手 HgLine(300+x1+x2, 38, 325+x1+x2, 30);//みぎ手首 HgLine(325+x1+x2, 30, 310+x1+x2, 25);//右手 HgLine(300+x1+x2, 25, 280+x1+x2, 13);//左足太もも HgLine(280+x1+x2, 13, 290+x1+x2, 0);//左足 HgLine(300+x1+x2, 25, 310+x1+x2, 0);//右足 } void UFO(int a){ HgSetFillColor(HG_GRAY); HgFanFill(500+a, 550, 30, 0, M_PI, 1); HgOvalFill(500+a, 530, 50, 25, 0, 1); HgBoxFill(470+a, 465, 60, 40, 1); } void view(void){ HgSetFillColor(HG_GREEN); HgFanFill(50, 200, 300, 1.25*M_PI, 1.75*M_PI,1); HgFanFill(300, 300, 500, 1.25*M_PI, 1.75*M_PI,1); HgFanFill(550, 200, 300, 1.25*M_PI, 1.75*M_PI,1); } ```
回答: 「Handy Graphic」でしょうか。あまり詳しくないのて、アルゴリズム的観点でのみ助言してみます。 ユーザー入力に反応して描画更新を行う場合の一般的な疑似コードは次の様になります。 ``` //----------------------------------------- 変数 位置変数; // UFO 人等のX/Y位置等 for( 無限に繰り返す){ // (1) 全て消去(); 全て描画( 位置変数); // 背景、UFO、人等を、毎回全て描画するのが最も簡単な方法 入力結果 = ユーザー入力待ち(); switch( 入力結果){ //・・・入力結果により「位置変数」を変更・・・(ここでは描画しない) }// (1)に戻る } //----------------------------------------- ``` 上のアルゴリズムと異なり、掲載されたコードは 「何らかのアクションのあった時にだけ描画」している様に見えます。