質問: C#、キーイベントによりキャラクター画像を移動するプログラムについて
回答: Gimp を使ったことがないので、わかりません。 しかし、何にせよ、位置補正を行なえば、良いのではないでしょうか。 以下に、補正のコード例を示します。 [考えられる原因] 開発環境自体が異なり、基本的な制御文や計算式を利用したのならば、壁の判定位置が異なる可能性があります(違う場合でも、後述の補正コードに関わる説明ですので、以下を読み続けて下さい)。 と言いますのは、Visual C# で、bmpファイルやJPGファイルを扱う場合は、そのキャラクター画像の座標位置を、キャラクター画像の真ん中の位置で指定するのではなく、キャラクター画像の左上の隅で指定するからです。 よって、キャラクター画像の真ん中の位置を、そのキャラクター画像を配置させる座標位置として指定するシステムでは、当然、キャラクターが半分飛び出すなどの現象がおきます。 左上隅ではなく、その他の3隅の内のどれかで指定するシステムでも、当然、キャラクターがはみ出します(この場合は、半分ではなく、全部はみだす)。 例として、中心位置指定のシステムの場合の修正を書きますが、その他の場合でも、以下の例のように、位置修正をすれば良いです。 [キャラクター画像の中心位置を指定するシステムの場合] キャラクター画像の中心位置を、そのキャラクターの位置として指定するシステムの場合は、以下の通りです。 なお、キーイベントでキャラクター画像を動かす知恵ノートは、幾つか出しているので、どれを指しているかわかりません。 よって、以下の知恵ノートを指しているものとします。 しかし、今まで出した知恵ノートで、壁への衝突判定は、だいたい同じですので、元コードも書いておきます(違う知恵ノートでも、元コードの比較をすれば、わかります)。 判定位置を、キャラクターの半分だけ補正しているだけですので、見ればわかります。 << 右壁での衝突判定 >> <元のコード> // キャラクターがステージ右側の壁をまだ越えてはいない場合 if (CharaPosition.X < (pictureBox1.Width - CharacterImg.Width)) <修正後のコード> // キャラクターがステージ右側の壁をまだ越えてはいない場合 if (CharaPosition.X < (pictureBox1.Width - (CharacterImg.Width / 2.0f)) << 左壁での衝突判定 >> <元のコード> // キャラクターがステージ左側の壁をまだ越えてはいない場合 if (CharaPosition.X > 0) <修正後のコード> // キャラクターがステージ左側の壁をまだ越えてはいない場合 if (CharaPosition.X > -CharacterImg.Width / 2.0f) マイナスが付いているのを見落とさないように注意。 << 上壁での衝突判定 >> <元のコード> // キャラクターがステージ上側の壁をまだ越えてはいない場合 if (CharaPosition.Y > 0) <修正後のコード> // キャラクターがステージ上側の壁をまだ越えてはいない場合 if (CharaPosition.Y > -CharacterImg.Height / 2.0f) マイナスが付いているのを見落とさないように注意。 << 下壁での衝突判定 >> <元のコード> // キャラクターがステージ下側の壁をまだ越えてはいない場合 if (CharaPosition.Y < (pictureBox1.Height - CharacterImg.Height)) <修正後のコード> // キャラクターがステージ下側の壁をまだ越えてはいない場合 if (CharaPosition.Y < (pictureBox1.Height - CharacterImg.Height / 2.0f)) [その他の補正方法] なお、実行環境(使用パソコン)の違いにより、ずれてしまうのでしたら、そのプログラムの実行を開始する前に、ユーザーに位置補正を行なう仕様にしたら、どうでしょうか。 下記コードは、補正用定数(比率)を実数値(0.6 とか 0.56等の箇所)で指定していますが、実際のプログラムでは、変数にして、ユーザーが調整した値を代入するようにします。 << 右壁での衝突判定 >> // キャラクターがステージ右側の壁をまだ越えてはいない場合 if (CharaPosition.X < (pictureBox1.Width - (0.6f * CharacterImg.Width)) << 左壁での衝突判定 >> // キャラクターがステージ左側の壁をまだ越えてはいない場合 if (CharaPosition.X > - (0.56f * CharacterImg.Width) << 上壁での衝突判定 >> // キャラクターがステージ上側の壁をまだ越えてはいない場合 if (CharaPosition.Y > - (0.55f * CharacterImg.Height) << 下壁での衝突判定 >> // キャラクターがステージ下側の壁をまだ越えてはいない場合 if (CharaPosition.Y < (pictureBox1.Height - (0.48f * CharacterImg.Height)) [追記] PNGファイルを使っては、どうでしょうか。 やってみたら、位置関連の情報が変わる問題は、発生しませんでした。 ちなみに、PNGファイルは、.NET系のグラフィック環境(XNA や Silverlight 等)でよく使われるので、トラブルは少ないと思います。