2017-01-16 5 views
0

ユーザーが大砲からボールを​​撃つゲームを開発すると考えられています。そのためには、大砲(矩形)を回転させて別の角度から撮影する必要があります。手伝っていただけませんか?x11/Cで矩形を回転させる方法

乾杯!

typedef struct _Cannon { 
 
    \t \t int x, y, w, h; 
 
    }Cannon; 
 

 
typedef struct _Ball{ 
 
\t int itx, ity; //size 
 
\t float ix, iy; //position 
 
\t float vx, vy; //velocity 
 
\t float gr; \t //gravity 
 
}Ball; 
 

 
    Cannon cannon = {60, 400, 114, 33}; 
 
Ball ball = { 
 
\t 0,0, 
 
\t cannon.x+cannon.w*0.8,cannon.y+cannon.h/5, 
 
\t 17.0, 0, 
 
\t 0.3 
 
\t }; 
 

 
    XSetForeground(XApp->getDisplay(), GCAtr->getGC(), 
 
    GCAtr->getColor(2)); 
 
    XFillRectangle(XApp->getDisplay(), XApp->getWindow(), GCAtr->getGC(),cannon.x,cannon.y,cannon.w,cannon.h); 
 
    
 
void calculate() 
 
{ 
 
\t double dt; 
 
\t dt = XApp->getDifTime(); 
 
\t 
 
\t //Calculates the position of the ball 
 
\t ball.vy += ball.gr * dt; 
 
\t ball.iy += ball.vy * dt; 
 
\t ball.ix += ball.vx * dt; 
 
}

Image of the game

答えて

0

XFillRectangleのみの軸平行の長方形で動作します。任意の回転した矩形については、XFillPolygonを使用します。

回転した矩形の頂点の座標を自分で計算する必要があります。これは、2Dジオメトリの線形変換に関するチュートリアルではありませんが、簡単に説明すると次のようになります。

  1. (0,0)を中心とする四角形で開始します。
  2. は回転行列のコーナーの各々に

     cos θ sin θ 
         -sin θ cos θ 
    

    を用いて角度θによって回転を適用します。これにより、コーナーが原点の周りを回転します。

  3. 矩形の中心を配置する座標を追加して翻訳します。
関連する問題