質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

1回答

411閲覧

ピクチャコントロール内で図形を跳ね返らせる処理を教えてください。

don

総合スコア10

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2022/08/18 13:16

前提

VC++のMFC(ダイアログベース)にて、ピクチャコントロール内で図形を動かし、ピクチャコントロールの四方の壁に当たると図形を跳ね返らせるプログラムを書いています。

ピクチャコントロールの壁に描画した図形が衝突する判定までは出来ているようなのですが、
そこから方向を変えて次に当たる壁まで移動させることができていません。

改善点、アドバイス等、よろしくお願いいたします。

該当のソースコード

C++

1// ダイアログのクラス 2// 図形とピクチャコントロールの壁の当たり判定をする関数 3BOOL CPolygonViewerDlg::isBounds() 4{ 5 CRect rect; 6 GetDlgItem( IDC_IMAGE )->GetWindowRect( rect ); 7 ScreenToClient( &rect ); 8 rect.Width(); 9 rect.Height(); 10 11 double dMinX, dMinY, dMaxX, dMaxY; 12 m_Rect.MaxFrame( &dMinX, &dMinY, &dMaxX, &dMaxY ); 13 14 if( rect.right - rect.left < dMaxX ){ 15 return TRUE; 16 } 17 else if( rect.left - rect.left > dMinY ){ 18 return TRUE; 19 } 20 else if( rect.top - rect.top > dMinY ){ 21 return TRUE; 22 } 23 else if( rect.bottom - rect.top < dMaxY ){ 24 return TRUE; 25 } 26 else{ 27 return FALSE; 28 } 29} 30 31// OnTimerの関数 32void CPolygonViewerDlg::OnTimer( UINT_PTR nIDEvent ) 33{ 34 // TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。 35 // 移動量(方向) 36 int nMoveX = 1; 37 int nMoveY = 0; 38 39 if( 1 == nIDEvent ){ 40 if( FALSE == isBounds() ){ 41 nMoveX *= 1; 42 } 43 else{ 44 nMoveX *= -1; 45 } 46 } 47 48 m_Rect.Move( nMoveX, nMoveY ); 49 m_Rect.Rotate( 30 ); 50 51 Invalidate(); 52 CDialogEx::OnTimer( nIDEvent ); 53} 54 55// ダイアログの派生クラス 56// ピクチャコントロール内に描画した図形の最大フレーム(四角)を求める関数 57BOOL CArea::MaxFrame( double *Xmin, double *Ymin, double *Xmax, double *Ymax ) // 最大枠 58{ 59 //if( ){ 60 // return FALSE; 61 //} 62 63 double MinX = m_arrPoint.GetAt( 0 ).X; 64 for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ 65 if( MinX > m_arrPoint.GetAt( i ).X ){ 66 MinX = m_arrPoint.GetAt( i ).X; 67 } 68 } 69 *Xmin = MinX; 70 71 double MinY = m_arrPoint.GetAt( 0 ).Y; 72 for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ 73 if( MinY > m_arrPoint.GetAt( i ).Y ){ 74 MinY = m_arrPoint.GetAt( i ).Y; 75 } 76 } 77 *Ymin = MinY; 78 79 double MaxX = m_arrPoint.GetAt( 0 ).X; 80 for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ 81 if( MaxX < m_arrPoint.GetAt( i ).X ){ 82 MaxX = m_arrPoint.GetAt( i ).X; 83 } 84 } 85 *Xmax = MaxX; 86 87 double MaxY = m_arrPoint.GetAt( 0 ).Y; 88 for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ 89 if( MaxY < m_arrPoint.GetAt( i ).Y ){ 90 MaxY = m_arrPoint.GetAt( i ).Y; 91 } 92 } 93 *Ymax = MaxY; 94 95 return TRUE; 96} 97 98// 図形を移動させる関数 99BOOL CArea::Move( double Dx, double Dy ) // 移動 100{ 101 //if( ){ 102 // return FALSE; 103 //} 104 105 for( int i = 0; i < m_arrPoint.GetCount(); i++ ){ 106 m_arrPoint.GetAt( i ).X = m_arrPoint.GetAt( i ).X + Dx; 107 m_arrPoint.GetAt( i ).Y = m_arrPoint.GetAt( i ).Y + Dy; 108 } 109 110 return TRUE; 111}

補足情報(FW/ツールのバージョンなど)

Visual Studio C++ MFCアプリケーション ダイアログベース
を使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

提示コードにおいてnMoveXOnTimer関数のローカル変数なので、壁に当たったときに方向を逆転しても、次の呼出では1に戻ります。
メンバ変数にするなど、方向を維持しておく必要があるでしょう。

投稿2022/08/19 00:39

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問