今回はちょっと前(2002年9月10日現在)に掲示板でスロットの質問があり、
講座で作ってみようかな、と言うことになり作り始めたのがキッカケです。
まずはいつものようにスクリーンショットから…。

前回までのようにとりあえず基本スクリプトを書き後で説明をしていきたいと思います。
buffer 2,40,440 font "MS ゴシック",40 color 255,255,150 repeat 11 boxf 1,cnt*40+1,39,cnt*40+40-1 loop color pos 0, 0 : mes "★" pos 0, 40 : mes "▲" pos 0, 80 : mes "♪" pos 0,120 : mes "◆" pos 0,160 : mes "●" pos 0,200 : mes "■" pos 0,240 : mes "▼" pos 0,280 : mes "◎" pos 0,320 : mes "×" pos 0,360 : mes "※" pos 0,400 : mes "★" screen 0,160,100 dim roll,3 dim move,3 font "MS ゴシック",12 : objmode 2 objsize 40,20 repeat 3 pos 40*cnt+(cnt+1*10),60 : button "STOP",rollstop loop *main repeat repeat 3 redraw 0 pos 40*cnt+(cnt+1*10),10 : gcoPY 2,0,roll.cnt*10,40,40 redraw if move.cnt=0 : roll.cnt- : if roll.cnt<=0 : roll.cnt=40 ; 動いてるロールは回転する loop wait 1 ; 数値を増やすと遅くなる if move=1 & (move.1=1) & (move.2=1) : break ; すべてのロールが止められたらループを抜ける loop ; 当たり判定をココに入れる goto *main *rollstop move.stat=1 goto *main
では説明に入ります。
まず試していただければ(見るだけでも)わかるかと思いますが当たり判定をしていません。
何が揃おうと関係ないのです。それだけでなくずれてしまいきちんと止めるのも難しいと思います。
一応ロール回転はきちんと続いており一枚一枚パッとは表示されていませんね。
3つ全部揃う当たりの種類は10種類となっていますが絵柄は11個ありますよね?
この「★」は一番初めのモノと同じです。
なぜこんなことをするのかと言うと、もし画像サイズが400の「※」までだとしたら、
一番初めの画面にパッと切り替わることとなるからです。一度自分の目で確かめてみるとわかります。
次に「rollstop」ラベルを見てください。
TIPS「オブジェクト編」にある押されたボタンが何かというやり方を使っています。
それでは次にコレを改良したいと思います。
「main」ラベルだけを次のように変更してください。
*main repeat repeat 3 redraw 0 pos 40*cnt+(cnt+1*10),10 : gcoPY 2,0,roll.cnt*5,40,40 redraw if move.cnt=0 : roll.cnt-=5 if move.cnt=1 : if roll.cnt\8!=0 : roll.cnt- if roll.cnt<=0 : roll.cnt=80 loop wait 6 ; 数値を増やすと遅くなる if move=1 & (move.1=1) & (move.2=1) : break loop ; 当たり判定 goto *main
きちんと画像が表示されたらストップがかかるようにしたものです。
また「stop」ボタンを押して完全にストップするのがピタッと止まるのではなく
徐々に速度を落とし停止させるために全体的な回転速度を変更しました。
ウェイトの時間を変えるだけではマズイので移動する間隔(さっきは1だったのを6に変更)も変えています。
コレでどうでしょう?少しはスロットらしくなったのではないではしょうか?
さぁ仕上げの当たり判定に入ってみましょうか。
全体的に少し変更します(ほんのちょっとです)ので全体のスクリプトを表示します。
#define KIND 12 ; 画像の種類
#define PX 40 ; 画像Xサイズ
#define PY 40 ; 画像Yサイズ
movement=PY/8 ; 移動量
dim roll,3
dim move,3
dim dispmark,3 ; 結局何の画像が表示されているか
dim point,KIND ; 当たった時に入手するポイント
point=999,600,400,200,200,100,100,50,50,50,50
dim mark,KIND ; 何の画像か
mark=0,1,2,3,3,5,5,7,7,7,7,-1 ; 最後の-1はポイント表示のところには表示しないための番号
sdim pict,2,KIND
pict="★","▲","◆","●","●","■","■","▼","▼","▼","▼","★"
buffer 2,PX,PY*KIND
font "MS ゴシック",PX
repeat KIND
color 255,255,150 : boxf 1,cnt*PY+1,PX-1,cnt*PY+PY-1 : color
pos 0,PY*cnt : mes pict.cnt
loop
screen 0,PX+15*3+134,PY+115
title "スロットゲーム"
font "MS ゴシック",12 : objmode 2
objsize PX,20
repeat 3
pos PX*cnt+(cnt+1*15),PY+30 : button "STOP",rollstop
loop
posPX+(2*15),PY+80 : button"再開",start
color 255,255,150 : boxf PX+15*3+15,15,PX+15*3+120,140 : color
tmp=-1 ; 次のアタリ役表示用に使用しています(使いまわしの変数)
tmp.1=0 ; 上に同じく表示用に使用しています(コチラは表示位置用)
repeat KIND
if mark.cnt==tmp|(mark.cnt==-1) : continue : else : tmp=mark.cnt
pos PX+15*3+30,tmp.1*20+20 : mes ""+pict.tmp+""+pict.tmp+""+pict.tmp+" "+point.tmp
tmp.1+
loop
*main
repeat
repeat 3
redraw 0
pos PX*cnt+(cnt+1*15),15 : gcoPY 2,0,movement*roll.cnt,PX,PY
redraw
if move.cnt=0 : roll.cnt-=movement
if move.cnt=1 : if roll.cnt\(PY/movement)!=0 : roll.cnt- : else : move.cnt=2
if roll.cnt<=0 : roll.cnt=KIND-1*PY/movement
loop
wait 3
if move=2&(move.1=2)&(move.2=2) : break
loop
repeat 3
tmp=roll.cnt/8
dispmark.cnt=mark.tmp ; 表示している画像番号
loop
goto *judge
*rollstop
move.stat=1
goto *main
*judge
if dispmark.0==dispmark.1&(dispmark.1==dispmark.2) {
repeat KIND
if dispmark==cnt : dialog "「"+pict.dispmark+"」がアタリました!\n入手ポイント : "+point.dispmark
} else {
dialog "ハズレでした"
}
stop
*start
repeat 3
move.cnt=0
loop
goto *main
先ほどのものよりいろいろな場所に変数が出てきていてわかりにくくなっていると思います。
なぜ数値でなく変数で指定しているのかと言うと後で拡張しやすいようにするためです。
こうしておかないと、例えば表示している画像の大きさを変えたいとなった時に、
いろいろな場所を修正しなくてはならず大きさを変更するだけでも非常に面倒です。
数値では指定している場所すべてを変えなくてはおかしくなってしまいますが、
変数だと一箇所変えるだけですべてが変わってくれるので便利ですよね。
内容の説明に入ります。
今回のものは画像の種類を減らして同じものを増やしています。
これは出る確率が同じで得点だけ違うのは不公平(?)だ、と言うことで得点の低いものほど出やすくしています。
アタリ役は3つすべてが同じ画像と言うのだけですので判定がとても楽チンです。
当たった時○ポイントもらえる、と出てきますが実際にはポイント制度を設けていませんので
当たっても表示されるだけで何ももらえません...。
後はコレの画像を自分で書いた画像に変えたり、開始・停止音を鳴らしたりしてゴージャスにしてください(^^;
すぐに実行できる用のスクリプトはコチラ。ポイントをスコアとして使用しています。
あ、初めのPX,PYを変えるだけで全体サイズが自動で変更されるようにしましたのでご確認ください。
画像をフォントのまま変更しない場合、PXとPYは同じ数値にしてください。異なるとブサイクですので(--;
それとコレの場合数値を8で割り切れるものにしないとエラーが出てしまいます。
スロット作りたい人はコレを元に頑張ってみてください...では。