【程式設計-C#】打磚塊遊戲 – 處理物件及畫面美工
(圖片來源)
OpenGameArt, 遊戲圖案與音效
1.繪製基本畫面
【程式碼】【專案檔:BrickBreakout – 1】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BrickBreakout
{
public partial class Form1 : Form
{
PictureBox[,] bricks; //磚塊物件參考變數(二維)
PictureBox racket; //球拍變數
private int brick_height = 30; //磚塊高度
private int brick_space = 5; //磚塊間的空間大小
private int brick_width; //磚塊寬度,等視窗放到最大後,再計算,12塊磚塊,填滿整個視窗寬邊
public Form1()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None; //將視窗的邊框設成"無",使視窗的邊框(連同標題列)消失
this.TopMost = true; //將視窗設為最上層
this.Bounds = Screen.PrimaryScreen.Bounds; //將視窗設為全螢幕
bricks = new PictureBox [6, 12]; //建立二維的磚塊物件參考,用以指向PictureBox,注意,是指向PictureBox物件的參考,不是PictureBox物件本身
racket = new PictureBox(); //指向一個新建立的PictureBox物件
racket.Width = 200; racket.Height = 30; racket.BackColor = Color.DarkGreen; //球拍寬度、高度、顏色
racket.Left = (this.Bounds.Width - racket.Width) / 2; //球拍水平位置,置中於視窗
racket.Top = this.Bounds.Height - racket.Height - 10; //球拍垂直位置,置於視窗底部
this.Controls.Add(racket); //將球拍物件加入Form1的控制項集合
brick_width = (this.Bounds.Width - 13 * brick_space) / 12; //計算每一排,12個磚塊,每1個磚塊的寬度
for (int i = 0; i <= 5; i++) //6列,12行的磚塊
{
for (int j = 0; j <= 11; j++)
{
bricks[i, j] = new PictureBox(); //產生每一個磚塊PictureBox物件
switch (i)
{
case 0:
case 1: bricks[i, j].BackColor = Color.Red; break; //設定每一列磚塊物件的顏色
case 2:
case 3: bricks[i, j].BackColor = Color.Yellow; break;
case 4:
case 5: bricks[i, j].BackColor = Color.DarkBlue; break;
}
bricks[i, j].Height = brick_height; //磚塊的高度
bricks[i, j].Width = brick_width; //磚塊的寬度
this.Controls.Add(bricks[i, j]); //將磚塊PictureBox物件加入Form1控制項集合
}
}
place_bricsk(); //喚用place_bricsk方法,排列所有的磚塊
}
private void place_bricsk()
{
for (int i = 0; i <= 5; i++)
{
for (int j = 0; j <= 11; j++)
{
bricks[i, j].Left = brick_space + (brick_width + brick_space) * j;
bricks[i, j].Top = brick_space + (brick_height + brick_space) * i;
}
}
}
}
}
【程式碼 – 20180510版本】【專案檔:打磚塊遊戲】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 打磚塊遊戲
{
public partial class Form1 : Form
{
PictureBox 球拍 = new PictureBox();
PictureBox[,] 磚塊陣列 = new PictureBox[8, 12];
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
int 畫面寬度 = this.Bounds.Width;
int 畫面高度 = this.Bounds.Height;
int 間隔 = 5;
球拍.Width = 200; 球拍.Height = 30; 球拍.Load("bar.png"); 球拍.SizeMode = PictureBoxSizeMode.StretchImage;
球拍.Left = (畫面寬度 - 球拍.Width) / 2;
球拍.Top = ( 畫面高度 - 球拍.Height - 10);
this.Controls.Add(球拍); //將球拍物件加入表單控制項集合
//建立6x12個磚塊,並將這些磚塊放入磚塊陣列
int 磚塊寬度 = (畫面寬度 - 間隔) / 12 - 間隔;
int 磚塊高度 = 30;
String[] 磚塊陣列色彩集合 = new String[] { "brick-blue.png",
"brick-blue.png",
"brick-green.png",
"brick-green.png",
"brick-orange.png",
"brick-orange.png",
"brick-red.png",
"brick-red.png"};
for (int i = 0; i <= 7; i++)
{
for (int j = 0; j <= 11; j++)
{
PictureBox 磚塊 = new PictureBox();
磚塊.Width = 磚塊寬度; 磚塊.Height = 磚塊高度;
磚塊.Left = 間隔 + (磚塊寬度 + 間隔) * j;
磚塊.Top = 間隔 + (磚塊高度 + 間隔) * i;
磚塊.Load(磚塊陣列色彩集合[i]); 磚塊.SizeMode = PictureBoxSizeMode.StretchImage;
this.Controls.Add(磚塊);
磚塊陣列[i, j] = 磚塊;
}
}
}
}
}
2.建立與置換美工圖
Google一張我們可以使用的Free圖案,用Photoshop描繪邊緣複製來建立美工圖
接著,要示範把底下的球拍置換用美工軟體畫好的圖案,圖片背景必須是去背的,也就是透明背景。
【做法及程式碼】
1.將圖檔加入專案,從方案總管->按右鍵->加入->現有項目->選擇影像檔
並設定美工圖檔的屬性”複製到輸出目錄”的值為”一律複製”。
2.程式碼
racket = new PictureBox(); //指向一個新建立的PictureBox物件
racket.Load("bar.png"); //載入美工圖檔,bar.png
racket.SizeMode = PictureBoxSizeMode.AutoSize; //將球拍PictureBox物件的尺寸模式設為AutoSize,使球拍大小自動調整成美工圖案的大小
racket.Left = (this.Bounds.Width - racket.Width) / 2; //球拍水平位置,置中於視窗
racket.Top = this.Bounds.Height - racket.Height - 10; //球拍垂直位置,置於視窗底部
3.加上球、及磚塊的圖案
方案總管裏加入所有用到的圖案資源:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BrickBreakout
{
public partial class Form1 : Form
{
PictureBox[,] bricks; //磚塊物件參考變數(二維)
PictureBox racket,ball; //球拍與球變數
private int brick_height = 30; //磚塊高度
private int brick_space = 3; //磚塊間的空間大小
private int brick_width; //磚塊寬度,等視窗放到最大後,再計算,12塊磚塊,填滿整個視窗寬邊
Point OriginCursorPosition;
public Form1() //建構子,這支程式執行時,以物件方式存在於系統中,此建構子為其物件初始方法
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None; //將視窗的邊框設成"無",使視窗的邊框(連同標題列)消失
this.TopMost = true; //將視窗設為最上層
this.Bounds = Screen.PrimaryScreen.Bounds; //將視窗設為全螢幕
//球拍
racket = new PictureBox(); //指向一個新建立的PictureBox物件
racket.Load("bar.png"); //載入美工圖檔,bar.png
racket.SizeMode = PictureBoxSizeMode.AutoSize; //將球拍PictureBox物件的尺寸模式設為AutoSize,使球拍大小自動調整成美工圖案的大小
racket.Left = (this.Bounds.Width - racket.Width) / 2; //球拍水平位置,置中於視窗
racket.Top = this.Bounds.Height - racket.Height - 10; //球拍垂直位置,置於視窗底部
this.Controls.Add(racket); //將球拍物件加入Form1的控制項集合
//ball,球
ball = new PictureBox(); //指向一個新建立的PictureBox物件
ball.Load("ball.png"); //載入美工圖檔,ball.png
ball.SizeMode = PictureBoxSizeMode.AutoSize; //將球PictureBox物件的尺寸模式設為AutoSize,使球大小自動調整成美工圖案的大小
ball.Left = (this.Bounds.Width - ball.Width) / 2; //球水平位置,置中於視窗
ball.Top = racket.Top - ball.Height; //球垂直位置,置於球拍之上
this.Controls.Add(ball); //將球物件加入Form1的控制項集合
//brick, 磚塊,建立8列12行的磚塊牆
bricks = new PictureBox[8, 12]; //建立二維的磚塊物件參考,用以指向PictureBox,注意,是指向PictureBox物件的參考,不是PictureBox物件本身
brick_width = (this.Bounds.Width - 13 * brick_space) / 12; //計算每一排,12個磚塊,每1個磚塊的寬度
for (int i = 0; i <= 7; i++) //8列,12行的磚塊
{
for (int j = 0; j <= 11; j++)
{
bricks[i, j] = new PictureBox(); //產生每一個磚塊PictureBox物件
switch (i)
{
case 0:
case 1: bricks[i, j].Load("brick-blue.png");break;//設定每一列磚塊物件的顏色
case 2:
case 3: bricks[i, j].Load("brick-red.png"); break;
case 4:
case 5: bricks[i, j].Load("brick-green.png"); break;
case 6:
case 7: bricks[i, j].Load("brick-orange.png"); break;
}
bricks[i, j].SizeMode = PictureBoxSizeMode.StretchImage; //圖案依PictureBox的大小進行縮放設定
bricks[i, j].Height = brick_height; //磚塊的高度
bricks[i, j].Width = brick_width; //磚塊的寬度
this.Controls.Add(bricks[i, j]); //將磚塊PictureBox物件加入Form1控制項集合
}
}
place_bricsk(); //喚用place_bricsk方法,排列所有的磚塊
}
private void place_bricsk()
{
for (int i = 0; i <= 7; i++)
{
for (int j = 0; j <= 11; j++)
{
bricks[i, j].Left = brick_space + (brick_width + brick_space) * j;
bricks[i, j].Top = brick_space + (brick_height + brick_space) * i;
}
}
}
}
}





