1

私は(楽しみのために)ゲームを作っており、スクロール画面があります。次のコードは、位置を更新します。

screen_x += screen_scroll_x;
if(screen_x < 0)
    screen_x = 0;

if(screen_x > map_width - screen_width)
    screen_x = map_width - screen_width;

screen_x の正しい整数型を選択するのに苦労しています。署名されている場合は、 「署名されていないものscreen_x > map_width - screen_widthと署名されているものとの比較」という警告が表示されます。署名されていない場合if(screen_x < 0)、screen_x が負になることはないため、(クリエイティブな結果で) 失敗します。

map_widthマップをロードするときに文字列の長さと比較されるため、map_width符号付きにすると、問題はコードのその部分に移ります。

多くの人が正しい整数を使うべきだと言っています。彼らはまた、あなたの警告に注意を払うと言い、私が警告を受け取るのは私を悩ませます (あまりにも多くの警告を受け取ると、警告に注意を払うのをやめます)。

理想的な解決策は何ですか?

4

2 に答える 2

0

数学的に賢明な比較に興味がある場合は、直接恣意的に比較しないでくださいunsignedsigned intsこれは、C(++) の算術演算が通常の算術演算ではないためです。

asigned intと anを含む C(++) 式ではunsigned intsigned int最初に が an に変換されてからunsigned int演算が実行されます (+、*、< など)。

signed intaと anを正しく比較するには、 unsigned intC(++) の「算術規則」と、プログラミング言語によって義務付けられていて初心者には見えない型/値の変換を考慮する必要があります。

したがって、次のように 2 つを比較できます。

/* returns -1 if s < u,
   returns 0 if s == u,
   returns 1 if s > u */
int CompareSignedUnsigned(int s, unsigned u)
{
  if (s < 0) return -1; // negative is always smaller than 0 or positive
  if (s < u) return -1; // obvious
  if (s > u) return 1;  // obvious
  return 0; // obvious
}

適切な種類の整数を使用することは良いアドバイスですが、1 つのサイズがすべてに適合しない場合があります。画面上の座標はそのような領域の 1 つであり、座標に署名を付けるのが合理的ではありません。

たとえば、画面上にボックスをレンダリングするルーチンが必要であり、画面の外側 (画面に移動) から外側 (画面に移動) で終了する、画面上を移動するボックスを描画できるようにしたいとします。

次のような API を選択した場合:

void DrawBox(unsigned x, unsigned y, unsigned width, unsigned height, color c);

この関数のユーザーは、そのボックスの一部を描画するときに、一部が画面上にあり、別の部分が画面外にある場合に、追加の計算を行う必要があります。すべては、元の/クロップされていないボックスが実際にすべて画面に表示されていないことを関数に伝える方法がないためです。

ここで、代わりにこれを選択した場合:

void DrawBox(int x, int y, unsigned width, unsigned height, color c);

追加のクロッピング計算を関数内に移動すると、突然、この関数のユーザーは非常に単純なコードを記述できるようになります。次のように簡単です。

for (int x = -100; x < SCREEN_WIDTH + 100, x++)
  DrawBox(x, SCREEN_HEIGHT / 2, 100, 50, GREEN);
于 2012-08-18T12:15:32.900 に答える
0

二項演算子の両側の符号が異なる場合、符号付きオペランドは符号なしに昇格されます。これは C 標準では奇妙ですが、キャストする (ただし、この場合はエラーになります) か、この場合は両方の値を保持するために符号付き整数を使用することによって、対処する必要があります。

于 2012-08-18T11:51:06.263 に答える