質問: 0) { if (Key[KEY_INPUT_RIGHT] >= 1) { x+=5.0; } if (Key[KEY_INPUT_LEFT] >= 1) { x-=5.0; } if (Key[KEY_INPUT_UP] >= 1) { y-=5.0; } if (Key[KEY_INPUT_DOWN] >= 1) { y+=5.0; } DrawRotaGraph(x,y,1.0,0.0,Handle,TRUE); } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 } ```
回答: (A)「→」キーだけが押された場合は、x=5、y=0 で全体の移動距離は 5 となります。 (B)「↑」キーと「→」キーが同時に押された場合にはx=5 Y=5 になってしまい、上より大きな移動距離(=およそ7)となってしまう。 そこで、(B)の場合でも移動距離を「右上方向に5の移動」としたいという解釈とさせてもらいます。 まず、xもyもint(整数)なので、ぴったりの値にすることは原理的に不可能であることを断っておきます。 次に、距離の公式が理解できていれば、ありえる値は3か4であることが予測できます。 (1) 点(0,0)から点(5,5)までの距離は sqrt( x * x + y * y) ですので √5*5+5*5 でおよそ7.0710・・・という数値になります。 (2) これを5に近い値にしたいのですが、xもyもint(整数)ですので小数点付きの値が使えません。可能性があるのは 4 又は 3 となります。 (3) 4にした場合は、先の公式により移動距離はおよそ5.65。 (4) 3の場合の移動距離は4.24となります。 (5) x、y を同値にしなくてよはならば、xを3 yを4にすると、移動距離は5になります。 (6) どれを使うかは、実際に画面上で違和感のない方法を採用するのが良いかもしれません。 (追加)今の分岐方法だと、それぞれのキーの押下状態毎にxとyが加算されていくので、「あるキーの組み合わせが同時に押された場合」と「単独で押された場合」について、干渉しないように分岐して各々xとyの値を設定した方が簡便だと考えられます。 つまり、 ``` if( ↑だけ押された){ y -= 5; } else if( →だけ押された){ x += 5; } else if( ←だけ押された){ x -= 5; } else if( ↓だけ押された){ y += 5; } else if( ↑と→が同時におされた){ x += 4; y -= 4; // 4を採用した場合 } else if( ・・・・ ``` こんな感じですかね。