トップページ > 過去ログ > 記事閲覧
マウスで動く照準を教えてください
名前:七草堂ひろきち 日時: 2008/03/10 03:37

マウスで動く照準のプログラムで御指南を頂きたく投稿しました。 以下のようなプログラムを組みました。 mPositionX, mPositionY;//マウス位置用 PositionX , PositionY;//現在のマウス位置 targetX,targetY //照準の座標 マウス位置との差が3以上になったら差を照準の座標にプラスする。 という原理のツモリでしたが、、、 起動させたらプログラムは起動しなくなるわ、パソコンは激重になってフリーズ寸前になるわで、とても危険なシロモノになってしまったようです。 どなたか、照準の上手な動かし方を御指南いただければ幸いと思い、すがるように投稿させていただいた次第です。 よろしくお願いします。m(__;)m // --------------照準関連 -------------- void MoveByMouse()//マウスでうごく { int mPositionX, mPositionY;//マウス位置用 int PositionX = mPositionX, PositionY = mPositionY;//現在のマウス座標代入 GetMousePoint( &mPositionX , &mPositionY );//マウス位置取得 if( mPositionX > PositionX+3) targetX = targetX + (mPositionX - PositionX);//右に移動 if( mPositionX < PositionX-3) targetX = targetX - (mPositionX - PositionX);//左に移動 if( mPositionY > PositionY+3) targetY = targetY + (mPositionY - PositionY);//下に移動 if( mPositionY < PositionY-3) targetX = targetY - (mPositionY - PositionY);//上に移動 DrawGraph( targetX, targetY, targetbmp ,TRUE);//照準表示 }

Page: 1 |

Re: マウスで動く照準を教えてください ( No.1 )
名前:キーチック 日時:2008/03/10 04:15

mPositionX, mPositionYはこの関数では受け取っていないのでしょうか. いずれにしてもソースコード全てを書いているわけではないので,どのように考えたら良いか,誰もが悩みそうな感じです. 最低限,その関数のソースコードくらいは全て記述した方が的確なアドバイスを得られるのではないかと思います. targetbmp はどのくらいの大きさのbmp(?)なのかとか,どこで定義しているのかなども疑問として浮かんできますし…
Re: マウスで動く照準を教えてください ( No.2 )
名前:憂煉 日時:2008/03/10 06:28

とりあえずバグ取りをしました。 void MoveByMouse()//マウスでうごく { int mPositionX, mPositionY;//マウス位置用 int PositionX = mPositionX, PositionY = mPositionY;//現在のマウス座標代入 GetMousePoint( &mPositionX , &mPositionY );//マウス位置取得 if( mPositionX > PositionX+3 || mPositionX < PositionX-3) targetX = targetX + (mPositionX - PositionX); else if( mPositionY > PositionY+3 || mPositionY < PositionY-3) targetY = targetY + (mPositionY - PositionY); DrawGraph( targetX, targetY, targetbmp ,TRUE);//照準表示 }
Re: マウスで動く照準を教えてください ( No.3 )
名前:憂煉 日時:2008/03/10 06:40

Returnキーを間違って押してしまって未完投稿してしまいましたorz ソースコードの問題点は二つありました。 @else文が使われていないので必要のない条件分岐をすることになりリソースを無駄遣いしていること。 A+と−を間違えている部分があるので左方向と上方向に進めないこと。 この関数にはフリーズしたりするような原因は見当たりませんが、ありそうなパターンを挙げます。 @ProcessMessage関数を使い忘れているケース。 Aループの条件があやしい。breakを忘れたなどで無限ループになっているとか。 Bgoto文が思わぬ動きをした。 特にAのパターンが多いので、for,while文を中心に探してみるとよいと思われます。
Re: マウスで動く照準を教えてください ( No.4 )
名前:colon 日時:2008/03/10 21:37

ひろきちさんのいわれてる原理のところが ちょっと違うのかなと言うのが感想です。 今、似たようなものを書いてみたので参考にどうぞ。 #include "DxLib.h" /* * 宣言:照準 */ int targetBMP; // 画像 int targetX, targetY; // 座標( 未定義=-100 or 定義済み≧0 ) int createTargetMark( void ); // 初期化( 失敗=-1 or 定義済み≠-1 ) int drawTargetMark( void ); // 表示( 失敗=-1 or 定義済み≠-1 ) /* * 定義:照準 */ // 初期化( 失敗=-1 or 成功≠-1 ) int createTargetMark( void ) { targetBMP = LoadGraph( "target.bmp" ); targetX = targetY = -1; if( targetBMP == -1 ) return -1; else return 1; } // 表示( 失敗=-1 or 成功≠-1 ) int drawTargetMark( void ) { int mouseX, mouseY; // マウス座標 GetMousePoint( &mouseX , &mouseY ); // マウス座標取得 // マウス座標とターゲットマークが'距離3'以上離れているなら int x = mouseX - targetX; int y = mouseY - targetY; if( ( x * x + y * y ) > ( 3 * 3 ) ) { // ターゲットマークをマウスの位置に更新 targetX = mouseX; targetY = mouseY; } // マウスの位置を中心に照準を表示 int w, h; GetGraphSize( targetBMP, &w, &h ); DrawGraph( targetX - w / 2, targetY - h / 2, targetBMP, TRUE ); return 1; // 常に成功 } // メイン int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモード ChangeWindowMode( 1 ); // DXライブラリ初期化 if( DxLib_Init( ) == -1 ) return -1; // 描画先画面を裏画面にセット SetDrawScreen( DX_SCREEN_BACK ); // その他のリソースを初期化 if( createTargetMark( ) == -1 ) return -1; // メインループ while( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { DrawBox( 0, 0, 640, 480, GetColor( 0, 0, 0 ), TRUE ); // 画面クリア drawTargetMark( ); ScreenFlip( ); } // DXライブラリ終了 DxLib_End( ); // 終了 return 0; }
Re: マウスで動く照準を教えてください ( No.5 )
名前:colon 日時:2008/03/10 21:42

すいません。コメント一個間違ってますね。 誤) // マウスの位置を中心に照準を表示 正) // 照準位置を中心に画像を表示
Re: マウスで動く照準を教えてください ( No.6 )
名前:colon 日時:2008/03/10 21:44

誤) targetX = targetY = -1; 正) targetX = targetY = -100; 申し訳ない
あ、ありがとうございます! ( No.7 )
名前:七草堂ひろきち 日時:2008/03/11 13:50

>キーチック様 どれが必要な材料か否かも正直わからずに質問しておりました。申し訳ありません。 次回より関連コードと思われるものを挙げてアドバイスをお願いするように心がけます。 お教えありがとうございました。 >憂煉さま 再び助けの手を差し伸べていただきありがとうございます。穴だらけの質問だというのに、 バグ取りまでしていただき感謝の言葉もありません。 アドバイスの通りだったようです。フリーズ寸前の状況は消えました。本当に助かりました。 >clonさま こ!これは!とても参考になりました! 現在、「14歳からはじめるC言語〜」の本の教材のヨコスクロールのシューティングゲームプログラムを勉強しています。 第5章を終え、力試しのために 一旦脱線してアドリブで自機をアクションゲームのようなジャンプをする人型に変え、様々なアクションやアニメ、 さらに射撃方向はマウスで動かす照準に360度に可能とするものを作れるか試しています。 (とは言っても1からではなく解る範囲での改造程度ですが・・) 今回の照準もその一環でつまづいておりましたが、 参考にさせていただいて大きく進められそうです! みなさまはきっと、 DXライブラリを手足のように扱い、自在にプログラムを組んでいるのであろうなと思うと、 とてもうらやましく、かつ、自分も早くそうなりたいと思います。 みなさま、本当にありがとうございました!!

Page: 1 |