さて、ではバグをとるためにお勉強していきましょう
ちくしょう、そういう手で来るのか...新しいパターンだ。
これから解説をしていくことにしましょう。
--グローバル宣言を行います。これは後に続くハンドラにも有効です。
--このようにハンドラの外に書く方法も便利ですよ。
--cardListとはカードの番号を格納しているリストです。
--myListとは自分がめくったカードの番号を入れます。これを用いて当たり判定を行います
--uraCardCastとは裏向けのカードのキャストです。別にグローバルにする必要はないのですが
--もしもキャストの増減によって番号が変化したときに備えて、ここで宣言しています。
--waitTimeとはひっくり返すまでの待ち時間を制限しています。
global cardList,myList,uraCardCast,waitTime
--
on startMovie
--1から20までのカードをパペットにして、さらに裏向けのキャストにしておきます
repeat with m=1 to 20
puppetSprite m,TRUE
set the castNum of sprite m to uraCardCast
updatestage
end repeat
--それぞれの値を設定しておきます
set cardList=[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10]
set myList=[0,0]
set uraCardCast=11
set waitTime=3
--ここで後に述べるハンドラshaffleを呼び出し、カードを混ぜます
shaffle
end
緑色の部分を変更すれば、色々設定が変わるのですね。
そうです!さて、次はshaffleハンドラですが、これは説明は済んでいますね。じゃ、次はスコアスクリプト……あの裏向けカードに書いたスクリプトを検証してみましょう。
on mouseUp
--先ほどのスクリプトとは違う場所に書いているので、グローバル宣言が必要です
global CardList,MyList
--the clickOnとはクリックしたキャストのスプライト番号を返します
--それをmySpNumという変数にぶち込みます
put the clickon into mySpNum
--ここからが難しいですよ!
--myList……つまりめくったカードのスプライト番号を格納しているリストですが
--それの1項目が0ならば……つまり何もめくっていないときですね。
if getat(Mylist ,1) = 0 then
--myListの1番目に、変数mySpNum(さっき作ったばかりですよ)を入れます。
setAt mylist, 1, mySpNum
--スプライト番号myspNumの画像をカードリストに入っているキャストと交換します
--これでめくれているように見えるのです
--カードリストの番号がキャストの番号にそのまま使えるところがポイントです
set the castNum of sprite mySpNum to getAt (CardList,mySpNum )
else
--そうでない場合……つまり2枚目をめくっているときは
--myListの2項目にそのスプライト番号を入れます。
setAt Mylist , 2,mySpNum
--同様に表を向けます
set the castNum of sprite mySpNum to getAt (CardList,mySpNum )
updatestage
--判定のルーチンにとばします。
hantei
end if
end
確かに言われてみれば「ふ〜ん」って感じのスクリプトですね。でもわかるだけマシなのかしら(笑)
そうですよ。おぽろげながら理解する程度でも十分大丈夫ですよ。まずは理解して、それをまねていくことから考えましょうね。さて、次の課題ですが、2枚ひっくり返ったカードが合っているかどうかの判断ですね。さぁ、じっくりと理解していきましょう!太字のif文と斜体字のrepeat文がポイントですよ!
on hantei
--myListの中身が互いに違っている時は……
if getAt(cardList,getAt(myList,1))<>getAt(cardList,getAt(myList,2)) then
startTimer
repeat while the mouseUp
if the timer < waitTime*60 then
nothing
else
set the castNum of sprite getAt(myList,1) to uraCardCast
set the castNum of sprite getAt(myList,2) to uraCardCast
updatestage
end if
end repeat
set the castNum of sprite getAt(myList,1) to uraCardCast
set the castNum of sprite getAt(myList,2) to uraCardCast
updatestage
else
beep 2
end if
set myList=[0,0]
end
ううむ、難しいけど、がんばって理解してみるわ!