ちこくちこくぅ~😥️
予定していた記事を前倒しで放出したり、プラグインの修正に時間食ったりしてぴんちなので、予告どおり雑にトランプのつづき・・・と思ったら、急に貯蔵庫のエディタが動かなくなったりしてぴんち~😱️(エディタはすでに直りました✨️)
宿題をギリまでやらない人の末路なのねん💧️
テンテン神経衰弱
新しい知見は特にありませんが、4日目のクジラ飛行机さまによる『なでしこで絵柄の綺麗なカードゲームを作るには?』で紹介されたトランプ表示ライブラリと、12日目の『キャンバスでもトランプはくるんとめくりたい!』の描画変換マトリクス追加を使ってトランプカードを反転させるアニメーションを使って実際にゲームにしてみます。
カードをくるんとめくるといえば、やっぱり神経衰弱ですよねぇ~🎶
ただの神経衰弱ではアレなので、テンテン神経衰弱にします。
普通の神経衰弱は、同じ番号の札を探してめくるものですが、テンテン神経衰弱は、各絵柄のA~9の36枚のカードを使い、一枚目の札と二枚目の札の番号の合計が10になるような組み合わせを探してめくるものです。
プログラム的にもゲーム的にも、別に全然大した差異はなかったですね😅️
さんすうで覚えさせられた「はんたいのかず」を覚えるのには役立つのではないでしょうか。(いまでもおもわずゆびがでます💧️)
トランプ表示ライブラリ
取り込みます。
!「貯蔵庫:playing_card.nako3」を取り込む。
今回は、なにがなんでもこちらを使ってやっていきますです。
トランプを作成
使用するのはA~9の36枚ですが、今回は実際同様に52枚一組のトランプを用意して、配列フィルタを使って必要なカードを残しています。
0から51までの配列連番作成して、トランプに代入。
裏カード=55の絵柄番号取得。
●(Nの)使用カード判定:
それは(N%13<9) # A~9まで
「使用カード判定」でトランプを配列フィルタして、トランプに代入。
トランプを配列シャッフル。
中身を辞書型にします~。
列数=6。
トランプを反復:
トランプ[対象キー]は空辞書。
トランプ[対象キー]["ID"]=対象キー。
トランプ[対象キー]["X"]=対象キー%列数。
トランプ[対象キー]["Y"]=対象キー/列数を切り捨て。
トランプ[対象キー]["No"]=対象。
トランプ[対象キー]["絵柄"]=対象/13を切り捨て。
トランプ[対象キー]["番号"]=対象%13+1。
トランプ[対象キー]["角度"]=0。
トランプ[対象キー]["向"]=裏。
それぞれのカードに角度と向き(見えている面)を持たせたので、連続して次々クリックしても、気分良くひっくり返すことができる・・・よてい。
画面
画面は元のカードサイズに合わせて大きく作り、スタイルで縮小。
タブンこれが一番簡単そう?
倍率=0.4。
表示X=20/倍率。
表示Y=20/倍率。
画面幅=カードW*列数+表示X*2。
画面高さ=カードH*列数+表示Y*2。
描画中キャンバス.幅属性=画面幅。
描画中キャンバス.高さ属性=画面高さ。
描画中キャンバスの「幅」に画面幅*倍率&「px」をDOMスタイル設定。
描画中キャンバスの「高さ」に画面高さ*倍率&「px」をDOMスタイル設定。
イベント
無効なクリックなら戻り、
描画中キャンバスをクリックした時には
もし、開始時間=空ならば、開始時間=システム時間。
# 無効なクリック
もし、クリック待ち=オフならば、戻る。
mx=マウスX/倍率。my=マウスY/倍率。
もし、(mx<表示X)または(mx>画面幅-表示X)または(my<表示Y)または(my>画面高さ-表示Y)ならば、戻る。# カード以外の場所
もし、開いた札[1]≠未定義ならば、戻る。# 二枚目の札が開かれている状態
x=(mx-表示X)/カードWを整数変換。
y=(my-表示Y)/カードHを整数変換。
クリックした札=トランプ[y*列数+x]。
もし、クリックした札["No"]=-1ならば、戻る。# すでにカードが無い状態
もし、(開いた札[0]≠未定義)ならば、:
もし、開いた札[0]["ID"]=クリックした札["ID"]ならば、戻る。# 一枚目が開かれている時に同じ場所
有効なクリックならカードをひっくり返す。
# 有効なクリック
開いた札へクリックした札を配列追加。
クリック待ち=オフ。
クリックした札.角度=6。
アニメ中を1増やす。
もし、アニメ中=1ならば、カード再描画。
角度を設定してカード再描画したら、カード再描画の中で各カードの情報を見て、反転のアニメーションが出来るようにしたかった。
判定
フツーの神経衰弱だと一枚目=二枚目で取れるところ、一枚目+二枚目=10で取れるってだけのことですね😅️
取れた場合には二枚ともサイズを設定して消し、取れなかった場合には角度を設定してひっくり返す。
# 判定
もし、開いた札[1]≠未定義ならば、# 二枚目
1秒待つ。
一枚目=開いた札[0]["番号"]。二枚目=開いた札[1]["番号"]。
アニメ中を2増やす。
もし、一枚目+二枚目=10ならば、
取った札数を2増やす。
開いた札を反復:
トランプ[対象.ID]["No"]=-1。
トランプ[対象.ID]["サイズ"]=1。
もし、取った札数≧36ならば:
1秒後には:
アニメIDの画面更新処理取消。
クリア。
違えば、
# 一致しない場合は二枚同時にひっくり返す
開いた札を反復:
対象.角度=6。
ここまで
もし、アニメ中=2ならば、カード再描画。
0.5秒待つ。
開いた札=空配列。
ここまで。
クリック待ち=オン。
ここまで。
トランプを一次元配列で管理している場合だと、取った札のところには-1でも入れておいて、配列最大値が-1になったところでクリアとかにできるんですが、辞書型の場合どうするのがスマートなのかひらめかず、地道に取った枚数をカウントしています💧️
アニメーション
アニメーションの間中すべてのカードを反復して描き換えるようにしています。
開いたカードだけ書き換えればいいかと思ったら、反転に傾きをつけていることにより、その上下も書き換えないと残像が残っちゃうんですよねー。
それに、今回はないけど、カード移動して他のカードの上を通る場合とかもあったり?
●カード再描画
背景描画。
トランプを反復
札=対象。
もし、札.角度≠0ならば:
札をカード反転描画。
もし、札.角度≧180ならば:
札.角度=0。札.向き=札.向き*-1。アニメ中を1減らす。
違えば:
札.角度=札.角度+6。
違えば:
もし、札.向き=裏ならば、
[札.X,札.Y]のカード表示位置に裏カード.絵柄の裏カード.番号をカード表示。
違えば、
[札.X,札.Y]のカード表示位置に札.絵柄の札.番号をカード表示。
ここまで。
もし、札.No=-1ならば、
札.サイズ=札.サイズ-0.05。
もし、札.サイズ<0ならば:
札.サイズ=0。アニメ中を1減らす。
[札.X,札.Y]のカード表示位置。
[それ[0],それ[1],カードW,カードH]に四角描画。
札をカード縮小描画。
ここまで。
ここまで。
もし、アニメ中=0ならば、アニメIDの画面更新処理取消。
違えば、アニメID=「カード再描画」を画面更新時実行。
ここまで。
描画更新時実行でアニメーションして、角度が180まで行ったら画面更新処理取消というつもりでしたが、アニメーション中に別のカードがクリックされて、取り消し前に再びカード再描画が呼ばれるとカオスなことになるので・・・イマイチよい方法が思いつかず、地味にアニメ中のカードをカウントし、すでにアニメ中のカードがあれば呼ばず、アニメが終了したら減らしていき、アニメ中のカードが0になったら画面更新処理取消しています。
いやぜったいなんかもっといい方法ある💧️
カード反転描画
12日の記事のとうり。
●(札を)カード反転描画
もし、札.向き=裏ならば:
上面=裏カード。下面=札。
違えば:
上面=札。下面=裏カード。
xy=[札.X,札.Y]のカード表示位置。
cos=COS((札.角度をラジアン変換))の絶対値。
sin=SIN((札.角度をラジアン変換))*0.15。
キャンバス状態保存。
#---
[カードW/2,0]に描画起点設定。
[cos,sin,0,1,xy[0],xy[1]]だけ描画変換マトリクス追加。
[-1*カードW/2,0]に描画起点設定。
もし、札.角度≦90ならば、
[0,0]に上面.絵柄の上面.番号をカード表示。
違えば、
[0,0]に下面.絵柄の下面.番号をカード表示。
ここまで。
#---
キャンバス状態復元。
ここまで
カード縮小描画
カードの中央を起点にして縮小。
っていうか拡大もできるんですが、取ったカードをしゅっと消すためのやつ。
●(札を)カード縮小描画
xy=[札.X,札.Y]のカード表示位置。
キャンバス状態保存。
#---
[カードW/2,カードH/2]に描画起点設定。
[札.サイズ,0,0,札.サイズ,xy[0],xy[1]]だけ描画変換マトリクス追加。
[-1*カードW/2,-1*カードH/2]に描画起点設定。
札.絵柄の札.番号を[0,0]にカード表示。
#---
キャンバス状態復元。
ここまで。
できました
とりあえず動いて遊べるようになったので良しとする😅