今回から七並べゲームをつくります。まずは全部のカードを画面に表示させるところからはじめます。
まずカードのクラスを作成します。また七並べゲームではカードが置かれる位置は決まっています。またカードには4種類(ジョーカーを入れれば5種類、裏の状態をいれると6種類)あります。そこでカードの種類、番号、テーブルのうえに出されているのか否かを表すプロパティを作成します。
1 2 3 4 5 6 7 8 9 |
public enum CardMark { none = -1, joker = 0, spade = 1, hart = 2, dia = 3, club = 4, } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
public class Card { // カードの種類 public CardMark Mark { get; } = CardMark.none; // カードの番号 public int Number { get; private set; } = 0; // カードの位置(一番左なら0) public int Colum { get; private set; } // カードの位置(一番上なら0) public int Row { get; private set; } // カードは存在するか? public bool isExists { get; set; } = false; // カードが表示される位置(カードの左上の座標) public Point Point { get; private set; } // カードの大きさ(縦横のサイズ) Size size = new Size(60, 90); public Size Size { get { return size; } } } |
次に実際にカードが生成されたときの処理を考えます。
まずコンストラクタが必要です。カードは上からスペード、ハート、ダイヤ、クラブの順にします。カードの種類と番号でテーブルの上における位置も決まります。(プロパティのNumber、Mark、Colum、Rowがすべて決まる)
コンストラクタにはそのカードの種類と番号(エースが1、以下、2~10、ジャックが11、クイーンが12、キングが13)を渡します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class Card { public Card(CardMark mark, int number) { Colum = number - 1; Number = number; Mark = mark; if(Mark == CardMark.spade) Row = 0; if(Mark == CardMark.hart) Row = 1; if(Mark == CardMark.dia) Row = 2; if(Mark == CardMark.club) Row = 3; int x = (size.Width + 10) * Colum + 20; int y = (size.Height + 10) * Row + 20; Point = new Point(x, y); } } |
それからカードがあるなら表示させる必要があります。そのときに絵柄が必要です。フリーで利用できる素材はないかと検索してみたところ、以下のページを見つけました。
トランプ カードイラスト – No: 934665/無料イラストなら「イラストAC」
ここで見つけた画像をダウンロードしてリソースに追加します。
画像から必要な部分をトリミングします。一回トリミングしたらそれを保存しておけば2回目以降の処理がもたつくことがありません。最初だけ処理に時間がかかるため、表示に時間がかかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public class Card { Bitmap _bitmap = null; Bitmap Bitmap { get { if(_bitmap == null) _bitmap = GetBitmap(); return _bitmap; } } Bitmap GetBitmap() { Rectangle rect = new Rectangle(Point, Size); Bitmap bitmap = new Bitmap(Size.Width, Size.Height); var image = Properties.Resources.cardimage; int x, y = 0; x = 0; if(Mark == CardMark.spade) y = 1800; if(Mark == CardMark.hart) y = 1200; if(Mark == CardMark.dia) y = 600; if(Mark == CardMark.club) y = 0; x = 382 * (Number - 1); Rectangle srcRect = new Rectangle(new Point(x, y), new Size(354, 490)); Graphics graphics = Graphics.FromImage(bitmap); graphics.DrawImage(image, new Rectangle(0, 0, Size.Width, Size.Height), srcRect, GraphicsUnit.Pixel); graphics.Dispose(); return bitmap; } } |
以下はカードが存在するときに表示させるメソッドです。
1 2 3 4 5 6 7 8 9 10 11 |
public class Card { public void ShowCard(Graphics g) { if(isExists) { Rectangle rect = new Rectangle(Point, Size); g.DrawImage(Bitmap, rect); } } } |
では実際にカードを表示させましょう。最初は正しく動作するかテストするために全部のカードを表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public partial class Form1 : Form { List<Card> cards = new List<Card>(); public Form1() { InitializeComponent(); BackColor = Color.Green; Init(); ShowAllCards(); // すべてのカードを表示する } void Init() { for(int i =1; i<=13; i++) cards.Add(new Card(CardMark.spade, i)); for(int i = 1; i <= 13; i++) cards.Add(new Card(CardMark.hart, i)); for(int i = 1; i <= 13; i++) cards.Add(new Card(CardMark.dia, i)); for(int i = 1; i <= 13; i++) cards.Add(new Card(CardMark.club, i)); } void ShowAllCards() { foreach(Card card in cards) card.isExists = true; } } |
コンストラクタが実行されると4種類のカードを13枚ずつつくります。そしてList<Card>型フィールド変数のcards内に格納します。
Paintイベントが発生したらカードを描画させます。
1 2 3 4 5 6 7 8 |
public partial class Form1 : Form { private void Form1_Paint(object sender, PaintEventArgs e) { foreach(Card card in cards) card.ShowCard(e.Graphics); } } |
Form1_Paintが呼ばれていないのでしょうか?
カード表示が表示されないですね。
デザイナを使うか、コンストラクタ内で
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
または
this.Paint += this.Form1_Paint;
とする必要があります。
失礼いたしました。
Form1のプロパティ→プロパティの上部のイベントアイコンクリック→プロパティ一覧内にある、表示>Paintをダブルクリックで「Form1_Paint_1」が追加され、無事カードが表示されました。