スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

当たり判定のプログラム例 二つの長方形(2)

二つの長方形の重なりを判定するプログラム例。DX ライブラリを使用。

プログラムの概要

矢印キーで白い長方形Aを動かします。画面中央に置かれた青い長方形Bに重ねると、Bの色が赤くなります。

ソースコード

#include "DxLib.h"
#include <tchar.h>

// 長方形を表すクラス
class CRect
{
  TCHAR name[20];  // 名前
  int mx;  // 中心の x 座標
  int my;  // 中心の y 座標
  int wd;  // 幅
  int ht;  // 高さ
public:
  CRect( LPCTSTR str ) {
    _tcscpy_s( name, sizeof(name)/sizeof(TCHAR), str );
    mx = my = wd = ht = 0;
  }  // コンストラクタ
  void set( int x, int y, int w, int h ) {
    mx = x; my = y; wd = w; ht = h;
  }  // 値をセットする
  int get_mx() const { return mx; }  // mx の値を返す
  int get_my() const { return my; }  // my の値を返す
  int get_wd() const { return wd; }  // wd の値を返す
  int get_ht() const { return ht; }  // ht の値を返す
  void moveUp() { my--; }     // 上へ移動
  void moveDown() { my++; }   // 下へ移動
  void moveLeft() { mx--; }   // 左へ移動
  void moveRight() { mx++; }  // 右へ移動  
  void displayInfo ( int x, int y, int colorCode ) const {
    DrawFormatString( x, y, colorCode, 
    _T("%s: (mx, my) = (%3d, %3d), wd = %3d, ht = %3d"), 
    name, mx, my, wd, ht );
  }  // 情報の表示
  void draw( int colorCode ) const {
    DrawBox( mx-wd/2, my-ht/2, mx+wd/2, my+ht/2, colorCode, TRUE ) ;
  }  // 描画
  BOOL isIntersected( const CRect& b ) const {
    return ( 
      abs( b.get_mx() - mx ) < ( b.get_wd() + wd ) / 2 &&
      abs( b.get_my() - my ) < ( b.get_ht() + ht ) / 2
    );
  }  // 交差しているかどうかの判定
};

int WINAPI WinMain( 
  HINSTANCE hInstance, 
  HINSTANCE hPrevInstance, 
  LPSTR lpCmdLine, int nCmdShow )
{
  ChangeWindowMode( TRUE );  // フルスクリーンで起動しない
  SetGraphMode( 640, 480, 16 );  // 画面:640x480、カラー:16bit
  if( DxLib_Init() == -1 ) { return -1; }  // DXライブラリ初期化
  SetDrawScreen( DX_SCREEN_BACK );  // 描画先画面を裏画面にセット

  // 長方形の作成
  CRect rect_A( _T("A") ); rect_A.set( 160, 160, 120,  80 );
  CRect rect_B( _T("B") ); rect_B.set( 320, 240, 100, 160 );

  // 色コードの取得
  int col_red   = GetColor( 255,   0,   0 );
  int col_blue  = GetColor(  64, 128, 255 );
  int col_white = GetColor( 255, 255, 255 );

  while( ProcessMessage() == 0 &&
         CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
  {
    ClearDrawScreen();  // 画面クリア

    // 長方形Aを矢印キーで動かす
    if( CheckHitKey( KEY_INPUT_UP ) ) { rect_A.moveUp(); }
    if( CheckHitKey( KEY_INPUT_DOWN ) ) { rect_A.moveDown(); }
    if( CheckHitKey( KEY_INPUT_LEFT ) ) { rect_A.moveLeft(); }
    if( CheckHitKey( KEY_INPUT_RIGHT ) ) { rect_A.moveRight(); }

    // 長方形Bの描画
    if( rect_A.isIntersected( rect_B ) ) { 
      rect_B.draw( col_red );   // 長方形が重なったら赤
    }
    else {
      rect_B.draw( col_blue );  // 重ならなければ青
    }
    // 長方形Aの描画
    rect_A.draw( col_white );

    // 長方形の情報を表示
    rect_A.displayInfo( 4,  4, col_white );
    rect_B.displayInfo( 4, 24, col_white );

    ScreenFlip();  // 裏画面の内容を表画面に反映させる
  }

  DxLib_End();  // DXライブラリ使用の終了処理

  return 0;     // ソフトの終了
}

関連記事

よしいずの雑記帳:当たり判定の基本
よしいずの雑記帳:DXライブラリを今すぐ使いたい

【theme : プログラミング
【genre : コンピュータ

プロフィール

よしいず

Author:よしいず
MATHEMATICS.PDFというウェブサイトを運営しています。

管理の都合上、トラックバックとコメントはオフにしてあります。ブログ経験者なら分かっていただけると思いますが、スパム(アダルトやその他の宣伝)ばかりなのが現実です。

リンクは自由です。当サイトの記事に対する間違いの指摘・意見・感想などを述べた記事からのリンクは歓迎です。ただし、ブログ記事アップ直後はミスが多く、頻繁に修正します。場合によっては削除する可能性もあります。その際、何も断りもなく修正・削除しますがご了承ください。内容を参考にする場合には投稿後一週間ほど様子を見てからにしてください(笑)。

記事の間違いを指摘するときは、その具体的箇所、理由(仕様に反するなど)・根拠(参考にした文献など)、代替案(同じ結果を得るための正しいやり方)も教えてください。そうしないと、(指摘される側および第三者はその時点では無知の状態なので、)どこが間違いなのか分かりませんし、本当に間違っているのかどうかが判断・検証できません。実際、間違いだと指摘されたことが結局は正しかったというケースもありますので。

このブログのタイトル一覧

リンク
月別アーカイブ
カテゴリ
最新記事
検索フォーム
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。