★の表示
★の表示と移動
次に今回のゲームの敵キャラにあたる★を表示します。
最終的に★は大量に出しますが、とりあえずは1個だけ出したいと思います。
プログラム的には●を表示したのと変わりありません。
一気に書いちゃいましょう。
;スクリーンを作成
screen 0, 800, 480
;自機の位置
player_x = 100
player_y = 200
;星の位置
star_x = 800
star_y = rnd(480-32)
;フォントの設定
font "MS ゴシック", 32
*メインループ
(一部省略)
;星の移動
star_x –= 5
;星の表示
color 255, 255, 0
pos star_x, star_y
mes "★"
await 16
goto *メインループ
気にすべき点は、★の最初の位置ですね。
★は上の図の赤い部分から出てきます。
star_xには800を代入しています。
スクリーンの横幅が800なので、最初の位置を800にしておけば、
画面外から★が出てきます。
star_yはランダムな値になっています。
スクリーンの高さが480なのでrand(480)としたいところですが、
そうしてしまうと画面外に出てしまう可能性があります。
ここで指定するのは★の左上の位置です。
もし、star_yが480だと下図のようになります。
こうなってしまっては★が見えなくなってしまうので、
ランダムの最大値からフォントサイズである32を引いています。
これで、★の縦方向の位置はスクリーン内のいずれかになります。
ちなみに「rand(480-32)」と書いていますが、
当然「rand(448)」と書いても同じです。
本当のランダム
★はランダムな位置から出てくるはずなんですが、
何度も実行してると同じ位置から出てくるのに気づきましたか?
実はコンピューターというのはとても生真面目な性質なので
「適当な数」と言われても何らかの計算をして求めているんですね。
で、特に何もしないと、毎回同じ値を「ランダムな値」として出してきます。
そこで、プログラムの先頭に、この1行を追加してください。
;乱数の初期化
randomize
;スクリーンを作成
これを入れると、rand関数は毎回違う値を出してきます。
rand関数を使う場合は、必ずこのrandomizeを先頭の方に書いてください。
移動速度もランダム
毎回違う位置から★が出てくるようになったところで、
速度もランダムにしてみましょう。
今は5ドットずつ動いていますが、2~6ドットずつ動くようにしましょう。
特に難しくないですね?
;星の位置
star_x = 800
star_y = rnd(480-32)
;星の速度
star_speed = rnd(5) + 2
;フォントの設定
font "MS ゴシック", 32
*メインループ
(一部省略)
;星の移動
star_x -= star_speed
速度が毎回変わるので、移動速度を入れる変数を用意します。
“数”が“変”わる場合は「変数」を使うんですね。
左端までいったら・・・
★が左端まで移動したら、また右端のランダムな位置から、
ランダムな速度で出てくるようにしましょう。
左端についたかどうかは、star_xの値を見れば分かりますね?
star_xが0になっていれば左端まで来たということです。
ただし、star_xが0になった時に星を右端に移動させると、
左端についた瞬間に★が消えてしまい、違和感があります。
そこで、すこし通り過ぎてから右端に移動させるようにしましょう。
フォントサイズが32なので、star_xが-32より小さくなっていれば、
確実に画面の左端へ消えた後になります。
;星の表示
color 255, 255, 0
pos star_x, star_y
mes "★"
;★が左端に出た
if(star_x < -32){
star_x = 800 ;ふたたび右端へ
star_y = rnd(480-32) ;高さはランダム
star_speed = rnd(5) + 2 ;速度もランダム
}
await 16
goto *メインループ
これで、永遠に★が出てくるようになったと思います。
今回のポイント
-
rnd関数を使うときはプログラムの先頭の方に「randomize」と書く。