絵を動かす |
1.絵が動く仕組み |
テレビのアニメが動く仕組みをご存知でしょうか。まず1枚目の絵を描きます。次に、ほんの少しだけ動かした絵を描きます。その次に、またちょっとだけ動かした絵を描きます。
こうして描いた膨大な量の絵を連続して見せることにより、動いて見えるのです。
ゲームも同じことです。自機を最初の位置よりほんのちょっとずらした位置に描き直し、またほんのちょっとずらした位置に描き直し、ということを繰り返していくと、動いて見えます。
2.自機を動かす |
自機を左右に往復させます。
screen 0, 640, 480 celload "myship.bmp", 1 gsel 0 myship_x = 304 myship_dx = 2 *Main_Loop await 16 myship_x += myship_dx if myship_x == 0 | myship_x == 608 { myship_dx = -myship_dx } redraw 0 color 0, 0, 0 boxf 0, 0, 639, 479 pos myship_x, 416 gmode 2 celput 1 redraw 1 goto *Main_Loop
myship_x = 304 myship_dx = 2
自機のx座標をmyship_xに入れます(左上隅のドットの座標です)。
一度にx方向に何ドット動かすかをmyship_dxに入れます。プラスであれば右に、マイナスであれば左に動きます。
await 16
awaitは今までただ待つだけの命令としか説明してきませんでしたが、より詳しく言うと、awaitから次のawaitまでがちょうど指定したミリ秒になるように時間調整する命令です。メイン・ループの最初にawaitを行って、goto文でまたメイン・ループの先頭に戻ってawaitを行うので、結局メイン・ループ1回分の時間になります。
パソコンの性能によって、プログラムの実行速度は変わります。パソコンによってゲームのスピードが違うことになります。そこで待ち時間を入れて、どのパソコンでも同じスピードになるようにするのです。
60fps(1秒間に60回の描画)が、標準的な速度とされています。すると、16.666……ミリ秒に1回の描画でちょうど良い速度となります。メイン・ループ1回につき1回の描画を行いますから、await 16とすれば約60fpsになります。
myship_x += myship_dx if myship_x == 0 | myship_x == 608 { myship_dx = -myship_dx }
myship_xにmyship_dxを足しこみます。これで、自機の描画位置を少しずつ変えていくわけです。
左端(x座標が0)か右端(x座標が640 - 32 = 608)に来たら自機が動く方向を反転します。それには、myship_dxの正負を反転すればよいのです。
画面左端のx座標が0、画面の幅が640ですから、右端のx座標は639です。ですから、640というのは画面外の、右端より1ドット右のx座標です。自機の幅が32ドットですから、それより32ドット左のx座標が、自機が右端にいる時の左上隅のx座標となります。
redraw 0
以降の描画を画面に反映させない、という指示です。
color 0, 0, 0 boxf 0, 0, 639, 479
画面を黒く塗りつぶします。これは、描画されているものを消すために行います(「画面をクリアする」といいます)。
boxf 矩形の左上x座標, 矩形の左上y座標, 矩形の右下x座標, 矩形の右下y座標
指定された色で、指定された座標の、塗りつぶされた矩形(正方形、長方形)を描きます。
画面が640×480ですから、右下隅の座標は(639, 479)です。
cls 4
としても画面を黒色でクリアできますが、cls命令を実行すると、フォントやカラー設定が初期状態に戻ってしまいますので注意してください。
pos myship_x, 416 gmode 2 celput 1
(myship_x, 416)に自機の絵を描きます。
redraw 1
redraw 0以降の描画内容を画面に反映させます。今までは仮想的な画面を描き変えていたとも言えます。描き変えた結果を、ここで実際の画面に反映させるのです。なぜそんな事をするかというと、描き変えている途中の様子が見えてしまうと、画面がチラついて汚くなってしまうからです。