(3)壁で跳ね返る

壁にぶつかって跳ね返るようにする

このページの課題は maru03.bas として、マイドキュメントの basic フォルダに保存すること。( .bas は自動的につきます)

好きなところで止められるようにする

まず、x=500でないと止まらないのでなく、好きなところで止められるようにしましょう。

DO の後ろの WHILE 以下を消してしまいます。これで永遠に動き続けるようになります。(止めるときなは中断ボタン(実行の隣の隣)で中断し、出てくるウインドウで[×中止]を選ぶ)

そして、赤字の部分を加えてください。CHARACTER INPUT はキーボードから1文字を入力する命令です。NOWAIT は入力がなければ、待たずに次に進むということ。:s$ は入力された文字が s$ に代入されることを意味します。

つづく、IF s$="e" THEN EXIT DO はキー入力が小文字の e だったらば DO〜LOOP を終了し LOOP の次の命令に進むことを指示しています。この赤字部分でキーボードで小文字の e が押されたらおしまいということを表しています。

maru03.bas

SET WINDOW 0,500,0,500
SET AREA COLOR 2

LET  x=50
LET  y=300

DO
   CHARACTER INPUT NOWAIT:s$
   IF s$="e" THEN  EXIT DO
   
   SET AREA COLOR 0
   DRAW disk WITH SCALE(10)*SHIFT(x,y)
   LET  x = x + 1
   SET AREA COLOR 2
   DRAW disk WITH SCALE(10)*SHIFT(x,y)
   WAIT DELAY 0.01
LOOP
END

x=500で跳ね返るようにする

x=500で跳ね返るようにしましょう。x に1ずつ加えて右に動かしていましたが、これを d として、最初に d=1 としておき、右端までいったら d=-1 にして逆に動かすことにします。

青字部分は3行一組で x が 500 よりも大きくなったら、d を -1 にするというものです。 x > 500 が成立すれば、IF 〜 THEN の行から、END IF の行までのあいだを実行し、そうでなければ、すぐに END IF の次の行に進むという命令です。

maru03.bas

SET WINDOW 0,500,0,500
SET AREA COLOR 2

LET  x=50
LET  y=300
LET  d=1

DO
   CHARACTER INPUT NOWAIT:s$
   IF s$="e" THEN  EXIT DO
   
   SET AREA COLOR 0
   DRAW disk WITH SCALE(10)*SHIFT(x,y)
   LET  x = x + d
   IF x > 500 THEN 
      LET  d=-1
   END IF
   
   SET AREA COLOR 2
   DRAW disk WITH SCALE(10)*SHIFT(x,y)
   WAIT DELAY 0.01
LOOP
END

x=0でも跳ね返るようにする

さらに青字部分を付け加えました。x が 0 よりもa小さくなったら、d を 1 にするというものです。x < 0 が成立すれば、IF 〜 THEN の行から、END IF の行までのあいだを実行し、そうでなければ、すぐに END IF の次の行に進むという命令です。

maru03.bas

SET WINDOW 0,500,0,500
SET AREA COLOR 2

LET  x=50
LET  y=300
LET  d=1

DO
   CHARACTER INPUT NOWAIT:s$
   IF s$="e" THEN  EXIT DO
   
   SET AREA COLOR 0
   DRAW disk WITH SCALE(10)*SHIFT(x,y)
   LET  x = x + d
   IF x > 500 THEN 
      LET  d=-1
   END IF
   IF x < 0 THEN 
      LET  d=1
   END IF
   
   SET AREA COLOR 2
   DRAW disk WITH SCALE(10)*SHIFT(x,y)
   WAIT DELAY 0.01
LOOP
END

跳ね返るときに、めり込んでいるのですが、ボールがつぶれたと考えてこれでいいことにします。

スムーズにする

一応動きますが、円を消してから次に描くまでは、円が見えない状態にあります。この時間が長いとスムーズに動かずに、点滅して見えます。もちろんコンピュータの速さにもよります。

そこで、改良を加えます。あたらしい x を計算する前に ox = x として、前の x の位置を記憶しておき、消すときは x の代わりに ox をつかうのです。

maru03.bas

SET WINDOW 0,500,0,500
SET AREA COLOR 2

LET  x=50
LET  y=300
LET  d=1

DO
   CHARACTER INPUT NOWAIT:s$
   IF s$="e" THEN  EXIT DO

   LET  ox = x

   LET  x = x + d
   IF x > 500 THEN 
      LET  d=-1
   END IF
   IF x < 0 THEN 
      LET  d=1
   END IF
   
   SET AREA COLOR 0
   DRAW disk WITH SCALE(10)*SHIFT(ox,y)
   SET AREA COLOR 2
   DRAW disk WITH SCALE(10)*SHIFT(x,y)
   WAIT DELAY 0.01
LOOP
END

聖愛高等学校
http://www.seiai.ed.jp/