>  > [Projectμ] プロジェクトμ ブレーキパッド タイプHCプラス リア用 インプレッサ GC8 97/9~98/8 WRX-STI Ver.4 F2pot/R1pot 1.5~2.0L 本州・北海道は送料無料 沖縄・離島は送料1000円(税別)

[Projectμ] プロジェクトμ ブレーキパッド タイプHCプラス リア用 インプレッサ GC8 97/9~98/8 WRX-STI Ver.4 F2pot/R1pot 1.5~2.0L 本州・北海道は送料無料 沖縄・離島は送料1000円(税別)

[Projectμ] プロジェクトμ ブレーキパッド タイプHCプラス リア用 インプレッサ スバル GC8 97/9~98/8 WRX-STI Ver.4 F2pot/R1pot 1.5~2.0L 本州・北海道は送料無料 ブレーキディスク 沖縄・離島は送料1000円(税別)

1で作成したプログラムでは、キャラクタ(ポリゴン)を移動させていくと画面をはみ出してしまう。では、画面内の決められた範囲内しか移動できないようにするにはどうしたら良いのだろうか。

何度も説明したが、ポリゴンは4つの頂点座標を持つ。よって、各頂点が指定範囲内を超えているかどうかを判断すれば、指定範囲を超えたかどうかが分かる。

実際のプログラム

では、この判断文をどこで実行すればよいだろうか?これは、自分が作成するゲームによっていろいろ考えられるので、「ここでこのように行うべき」というものではない。よって、考えられるパターンを紹介する。

本州・北海道は送料無料 インプレッサ ブレーキパッド インプレッサ GC8 本州・北海道は送料無料 F2pot/R1pot リア用 タイプHCプラス プロジェクトμ [Projectμ] Ver.4 沖縄・離島は送料1000円(税別) 1.5~2.0L 97/9~98/8 WRX-STI

どの範囲を移動可能領域とするかを決めなければならない。今回は、画面内(640×480)すべてを移動可能領域と考える。

// マクロの定義
#define WINMODE FALSE // ウィンドウモードの指定(TRUE:ウィンドウモード/FALSE:フルスクリーン)
#define SCREEN_WIDTH640// ウィンドウの幅
#define SCREEN_HEIGHT480// ウィンドウの高さ
/* ゲームの状態を識別する(フレーム番号) */
#define START_INIT 0
#define START_FRAME 1
#define GAME_INIT 10
#define GAME_FRAME 11
/* 頂点フォーマット(基本形)*/
#define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
/* 移動可能領域 */
#define MOVE_LEFT 0
#define MOVE_TOP 0
#define MOVE_RIGHT 640
#define MOVE_BOTTOM 480

《POINT》

  • ウィンドウの大きさと、移動可能領域のサイズが違う場合が考えられるので、別のマクロとして宣言した。

    例1)移動処理関数内でチェックする

    移動処理を行うMove関数の中で siecle シエクル サブコントローラー MINICON ミニコン ist NCP6#、チェックを行う。指定範囲まで移動したら、それ以上移動しないように制御することにより、指定範囲をはみ出さないようにする。

    //----------------------------------------------------------------------------------------
    // 関数名 : Move()
    // 機能概要: 各頂点に対し、与えられた移動量を加算する
    //----------------------------------------------------------------------------------------
    void Move(LPTLVERTEX v, float x, float y)
    {
     int i;
     // 移動処理
     for ( i=0 ; i<4 ; i++ ) {
     v[i].x += x;
     v[i].y += y;
     }
     // 指定範囲を超えないようにする
     if ( v[0].x < MOVE_LEFT ) Move(v, MOVE_LEFT - v[0].x, 0.0f);
     if ( v[0].y < MOVE_TOP ) Move(v, 0.0f, MOVE_TOP - v[0].y);
     if ( MOVE_RIGHT < v[2].x ) Move(v, MOVE_RIGHT - v[2].x , 0.0f);
     if ( MOVE_BOTTOM < v[2].y ) Move(v, 0.0f, MOVE_BOTTOM - v[2].y);
    }
    
    

    《POINT》

    • 移動処理を行った後の値を調べ RSR ダウンサス スプリング Ti2000DOWN フロントのみ ウイングロード Y12 17/11~ N830TWF、指定範囲を超えていたら、座標を指定範囲まで戻す。
    • 座標を戻すには4つの頂点情報すべてを戻さなければならないため 16インチ サマータイヤ セット【適応車種:ランディ(C26系)】A-TECH シュナイダー SQ27 メタリックシルバー 6.5Jx16ヨコハマ エコス ES31 195/60R16、Move関数からMove関数を呼び出している(再帰呼び出し)。
    • このやり方では、移動処理関数を利用するすべてのキャラクタに対して移動制限をかけてしまう(シューティングなど、自キャラは画面内に居るが敵キャラは画面の外に行ってしまうようなゲームには不向き)。

      例2)移動処理関数実行後にチェックする

      移動処理関数内ではなく、実行後にチェックを行うようプログラムする。Move関数内から指定範囲のチェックを削除すること。

      //-----------------------------------------------------------------------------
      // 関数名 : StartFrame()
      // 機能概要: スタート画面処理
      //-----------------------------------------------------------------------------
      void StartFrame(void)
      {
       float mx, my;
       /* 描画処理 */
       // キャラクタ1を描画
       gl_lpD3ddev->SetTexture(0, gl_Texture1);
       gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, VertexDataTbl1, sizeof(TLVERTX));
       // キャラクタ2を描画
       gl_lpD3ddev->SetTexture(0, gl_Texture2);
       gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, VertexDataTbl2, sizeof(TLVERTX));
       /* 移動処理 */
       mx = my = 0.0;
       if ( gl_KeyTbl[VK_LEFT] & 0x80 ) mx = -2.0f;
       if ( gl_KeyTbl[VK_UP] & 0x80 ) my = -2.0f;
       if ( gl_KeyTbl[VK_RIGHT] & 0x80 ) mx = 2.0f;
       if ( gl_KeyTbl[VK_DOWN] & 0x80 ) my = 2.0f;
       Move(VertexDataTbl1, mx, my);
       /* 指定範囲を超えないようにする */
       if ( VertexDataTbl1[0].x < MOVE_LEFT ) Move(VertexDataTbl1, MOVE_LEFT - VertexDataTbl1[0].x, 0.0f);
       if ( VertexDataTbl1[0].y < MOVE_TOP ) Move(VertexDataTbl1, 0.0f, MOVE_TOP - VertexDataTbl1[0].y);
       if ( MOVE_RIGHT < VertexDataTbl1[2].x ) Move(VertexDataTbl1, MOVE_RIGHT - VertexDataTbl1[2].x , 0.0f);
       if ( MOVE_BOTTOM < VertexDataTbl1[2].y ) Move(VertexDataTbl1, 0.0f, MOVE_BOTTOM - VertexDataTbl1[2].y);
       // リターンキーが押されたら、ゲーム開始
       if ( gl_KeyTbl[VK_RETURN] & 0x80 ) g_FrameNo = GAME_INIT;
      }
      
      

      《POINT》

{yahoojp}jpprem01-zenjp40-wl-zd-74712