今回はカードが流れるように移動する演出を加えます。

MovingCardクラス

最初に移動するカードの座標とイメージを管理するためのクラスをつくります。コンストラクタの引数はカード、カードが移動を開始する座標、移動を終了する座標、カードの幅と高さです。

カードのイメージですがコンストラクタに引数として渡したカードのCardImageプロパティをコピーして使います。

カードを移動させるための処理を示します。最初に出発点と終着点は引数として渡されているので、ここからX、Y座標がどれだけ移動するかを求めます。4回の移動で終着点に移動させたいので全体の移動分の4分の1が1回の移動処理で移動する量となります。何回移動したかを数えてこれを最初の座標に加えれば現在の座標がわかります。

そして_updateCountとMaxUpdateCountが同じになったら移動は完了したことになります。

移動中のカードを描画するメソッドを示します。これといって捻りはありません。

カードを移動させるためのTimerとイベント処理

次にこのMovingCardクラスをForm1クラスで使います。

最初にタイマーをもうひとつ作ります。これはカードが滑るように移動して見える処理をするために必要です。

Timer.Tickイベントが発生したらMovingCardsに格納されているオブジェクトを移動させます。すでに目的地に到着したオブジェクトはリストから取り除きます。

カードを描画する処理ですが、MovingCardsに格納されているオブジェクトのイメージは最後に描画します。移動しているカードが一番手前にみえるようにしたいからです。

プレイヤーが場に出されているカードを出すときは、移動対象のカードと現在の座標と移動先の座標などを引数にMovingCardオブジェクトを生成します。そしてこれをMovingCardsに格納します。

コンピュータがカードを出すときの処理も修正が必要です。あとTimer1.Intervalに大きめの値を入れて実際にプレイしてみましたが、山札から場へカードを移動させるときも遅くなるので、この処理はすぐに終わるようにしました。0.75秒とTimer1.Intervalのうち短い側を採用します。

移動しているカードを描画する処理

カードを出すときの処理を修正します。カードが移動している最中なのに出されたカードは台札の上に表示されるのはおかしいです。実際に動かしてみるまではカードの移動速度も速いしたいした問題ではないだろうと考えていたのですが、実際にテストをしてみると非常に違和感があります。

そこで台札の一番上のカードと同じカードがMovingCardsのなかにあるときは二番目のカードを表示させることにします。