Path: chuka.playstation.co.uk!news1.scei.co.jp!usenet From: krd Newsgroups: playstation.ny.program.beginner Subject: Re: =?iso-2022-jp?B?GyRCJTUlcyVXJWslVyVtJTAlaSVgJE48QUxkGyhK?= Date: Thu, 17 Jul 1997 02:03:04 +0900 Organization: PlayStation Net Yarouze Lines: 55 Message-ID: <33CCFEC8.D26@niftyserve.or.jp> References: <33C42A19.6EA6@sti.softbank.co.jp> NNTP-Posting-Host: 203.139.230.19 Mime-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 3.01 [ja] (Win95; I) こんにちは、krdです。 私も加門さんと同じ意見で、check.cは非常に分かり難いサンプルだと思いま す。 アルゴリズム的にはエレガントなのかも知れないけど、ゲームとして拡張してい く ためには、不向きだと思いますし。 でも一応、解説してみますので、興味があれば読んでみてください。。 x,y共に、同一の考え方ですので、xについてだけ注目します。 if ((x = (pp->x += pp->dx) % WALL_X*2 ) >= WALL_X) x = WALL_X*2 - x; 問題の上記の式は以下のように置き換えられます。 pp->x += pp->dx; /* pp->xにpp->dxを加算 */ x = pp->x % WALL_X*2; /* pp->x/(WALL_X*2)の余りをxに代入 */ if( x >= WALL_X ) x = WALL_X*2 - x; /* もしxがWALL_Xより大きければ */ /* WALL_X*2からxを引いたものをxに 代入 */ 'x'が実際に表示される、画面上の位置となります。 (pp->xは、計算上必要となる内部位置。 pp->dxは、速度にあたります。) 例えば、WALL_X=2、速度=1の場合に当てはめて考えると、 画面上の表示位置 x が、x = 0, 1, 2, 1, 0, 1, 2, 0, 1, 2, ... のように変化すれば、画面上で壁に跳ね返るように動作しそうです。 しかし、内部的な数値では、「内部位置+=速度」の計算しかしていませんので、 1行目の計算式では、 pp->x = 0, 1, 2, 3, 4, 5, 6, 7, ...となります。 2行目の計算式は、「x = 内部位置/4の余り」なので、 x = 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, ....という結果が得られます。 この時点でのxの動作は、画面の2倍幅の区間を左から右に動き、 右端に到達したら瞬時に左端に戻るといった動きになっています。 最後の式で、「xが2以上の場合は、xに4-xを代入」しています。 結果として、x = 0, 1, 2, 1, 0, 1, 2, 1, 0, 1, 2, ...となり、 最初に期待した通りの結果となります。 最後の式の処理は、イメージ的には、2行目の式の結果、画面の右側にはみ出し た 玉を画面内に折り返して表示させる処理だといいかえても良いと思います。 文章だけで説明しているので、もし、かえって混乱させたらスイマセン。 (根本的に私が勘違いしてたら、さらに御免なさい。) -- krd (Yousuke Kuroda) CQD00245@niftyserve.or.jp