3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

 ちこくちこくぅ~😥️
 予定していた記事を前倒しで放出したり、プラグインの修正に時間食ったりしてぴんちなので、予告どおり雑にトランプのつづき・・・と思ったら、急に貯蔵庫のエディタが動かなくなったりしてぴんち~😱️(エディタはすでに直りました✨️)
 宿題をギリまでやらない人の末路なのねん💧️

テンテン神経衰弱

 新しい知見は特にありませんが、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
表示X20/倍率
表示Y20/倍率

画面幅カード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
        ここまで
        
もしアニメ中ならばカード再描画
        0.5秒待つ
        開いた札空配列
    ここまで
    クリック待ちオン
ここまで

 トランプを一次元配列で管理している場合だと、取った札のところには-1でも入れておいて、配列最大値が-1になったところでクリアとかにできるんですが、辞書型の場合どうするのがスマートなのかひらめかず、地道に取った枚数をカウントしています💧️

アニメーション

 アニメーションの間中すべてのカードを反復して描き換えるようにしています。
 開いたカードだけ書き換えればいいかと思ったら、反転に傾きをつけていることにより、その上下も書き換えないと残像が残っちゃうんですよねー。
 それに、今回はないけど、カード移動して他のカードの上を通る場合とかもあったり?

●カード再描画
    背景描画
    トランプ反復
        対象
        もし.角度0ならば:
            
カード反転描画
            もし.角度180ならば:
                
.角度.向き.向き*-1アニメ中1減らす
            違えば:
                
.角度.角度+6
        違えば:
            
もし.向きならば
                [.X,.Y]カード表示位置裏カード.絵柄裏カード.番号カード表示
            違えば
                [.X,.Y]カード表示位置.絵柄.番号カード表示
            ここまで
        もし.No-1ならば
            .サイズ.サイズ-0.05
            もし.サイズならば:
                
.サイズ0アニメ中1減らす
            [.X,.Y]カード表示位置
            [それ[0],それ[1],カードW,カードH]四角描画
            カード縮小描画
        ここまで
    ここまで
    もしアニメ中ならばアニメID画面更新処理取消
    違えばアニメID「カード再描画」画面更新時実行
ここまで

 描画更新時実行でアニメーションして、角度が180まで行ったら画面更新処理取消というつもりでしたが、アニメーション中に別のカードがクリックされて、取り消し前に再びカード再描画が呼ばれるとカオスなことになるので・・・イマイチよい方法が思いつかず、地味にアニメ中のカードをカウントし、すでにアニメ中のカードがあれば呼ばず、アニメが終了したら減らしていき、アニメ中のカードが0になったら画面更新処理取消しています。
 いやぜったいなんかもっといい方法ある💧️

カード反転描画

 12日の記事のとうり。

●(札を)カード反転描画
    もし.向きならば:
        
上面裏カード下面
    違えば:
        
上面下面裏カード

    xy[.X,.Y]カード表示位置

    cosCOS((.角度ラジアン変換))絶対値
    sinSIN((.角度ラジアン変換))*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]カード表示
    #---
    キャンバス状態復元
ここまで

できました

 とりあえず動いて遊べるようになったので良しとする😅

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?