2015-12-30 30 views
2

int [,] board = new int [6,7]; PictureBox boardpb = new PictureBox(); PictureBox [] pb = new PictureBox [42]; 圖片表,紅色,藍色; int c = 0;將圖像移動到具有透明孔的另一圖像後面

public Form1() 
    { 
     InitializeComponent(); 

     red = Properties.Resources.red; red = (Image)(new Bitmap(red, new Size(110, 110))); 
     blue = Properties.Resources.blue; blue = (Image)(new Bitmap(blue, new Size(110, 110))); 
     table = Properties.Resources.Board; table = (Image)(new Bitmap(table, new Size(700, 700))); 

     boardpb.Location = new Point(0, 0); 
     boardpb.Image = table; 
     boardpb.Size = table.Size; 
     boardpb.BackColor = Color.Transparent; 
     boardpb.MouseClick += new MouseEventHandler(Human_Play); 
     this.Controls.Add(boardpb); 
    } 

    void PlayCircle(int x, int y, Image im) //plays a red/blue circle in the corresponding (y,x) position 
    { 
     pb[c] = new PictureBox(); 
     pb[c].Location = new Point((int)(-2 + 98.8 * x), (int)(83 + 94.4 * y)); 
     pb[c].Image = im; 
     pb[c].Size = im.Size - new Size(10, 10); 
     pb[c].BackColor = Color.Transparent; 
     pb[c].MouseClick += new MouseEventHandler(Human_Play); 
     boardpb.Controls.Add(pb[c]); 
     c++; 
    } 

    int Y(int x) // gives the lowest empty space in the column, or -1 if the column is full. 
    { 
     for (int y = 5; y >= 0; y--) 
      if (board[y, x] == 0) return y; 
     return -1; 
    } 

    void Human_Play(object sender, MouseEventArgs e) 
    { 
     int x, y; 
     x = (Cursor.Position.X)/99; 
     if ((x <= 6) && (x >= 0)) 
     { 
      y = Y(x); 
      if (y != -1) 
      { 
       PlayCircle(x, y, red); 
       board[y, x] = -1; 
      } 
     } 
    }` 

我正在使用WinForms C#製作連接4遊戲到我的uni項目。當試圖讓棋子落入棋盤時,他們就像在隱藏桌子後面的棋盤線下移動棋盤一樣。 任何想法如何使碎片圖像移動到電路板後面,但仍然能夠通過電路板孔看到(如以下鏈接中的圖片)? PS:董事會和2件圖片確實有透明背景。 在此先感謝^^ http://mathworld.wolfram.com/images/gifs/connect4.gif 更新:我添加了代碼。 (表格,紅色,藍色在我的資源中是3張圖片) 如何編輯此代碼,以便將這些代碼放在主板後面而不是彈出?

+1

請描述你的編碼方法來解決這個問題更多的東西......感謝名單 –

+1

它發生,我認爲你可能只需要2動畫一個紅色和一個黑白通過細胞。 –

+0

你解決了你的問題嗎? – TaW

回答

0

你有兩個選擇:

  • 繪製使用GDI +命令FillRectangleFillEllipse的所有圖形。
  • 使用控件可以保存網格和圖塊的位圖。

我想你想嘗試第二種選擇。

但是,在Winforms透明度僅支持嵌套控件。然而,直接方法會重疊控制,因此無法工作。

相反,您需要nest底部控制在遊戲區域和上面的每一層在下面的一個。既然你只需要在一塊以上的一層,即網格,你就必須將網格嵌套在一塊。

這是可能的,但不是很自然,至於這個工作,你必須讓這塊作品足夠大,以保持整個網格,並在動畫過程中的每個位置。因此,如果您在每次移動開始時設置它,它必須是電路板高度的兩倍和全寬。

然後在Timer.Tick中,您將該部分向下移動,並將網格嵌套在其中,直到該部分找到它的位置。

最後將棋子劃分成PictureBox板的Image。使BackgroundImage顯示相同的網格,以便您可以在爲下一步移動設置之前隱藏該部分。

所以,你將開始在c列中移動位置(c, height * 2)的位置(board.width, board.height*2)的位圖上的紅色或黑色圓圈,並將其分配給PictureBox movingPiece

您已經準備好一個位圖來保存網格,並將它作爲PictureBox grid的圖像進行分類。現在你窩在三個控件:

movingPiece.Parent = board; 
grid.Parent = movingPiece; 

在蜱您移動PICE DOEN和電網它包含了:

void timer1_Tick(object sender, EventArgs e) 
{ 
    movingPiece.Top++; 
    grid.Top--; 
    // if finalposition etc.. 
} 
  • 方案二是簡單IMO:在BackgroundImage創建網格,將套件畫成Image。在Tick&Paint事件中通過在重疊位置填充一個Circle和一個Rectangle來生成動畫。

我會爲此而去;它是不是更自然的理解和少得多的像素得到移動,以便它可能更快太..

+0

...至少2個選項。如何在綠色屏幕前錄製通過REAL連接4單元的光盤。這個片段可以被使用很多次,因爲有必要... –

+0

大聲笑,是的,這聽起來像另一個不錯的;-) – TaW

+0

我不能做這些。我的板子不是長方形的,它是一個圖像。而在第一種選擇中,大尺寸的電影盒只能用於一件作品,它會隱藏其他作品。 –

1

只需在棋子後畫棋盤。

如果您使用板子的圖像,只要確保存在透明度通道即可。你可以找到更多的解釋on MSDN

如果您使用矢量線畫圖板,只要您不在孔中畫任何東西,就不會出現問題。

+0

爲了加快繪圖過程,Tarek可以僅繪製一次棋盤,並將棋子的像素限制/遮蔽到棋盤圖像透明的座標處。 –

+0

我不能畫出棋盤後,他們必須摔倒,當用戶點擊董事會的一列。 我檢查了msdn鏈接,它運行的很好,但如果使用該代碼,我無法將板塊從頂部移動到底部。 這件作品應該放在一個picturebox裏面 –

+1

因爲你可能會被限制使用特定的技術,所以我們可能會看到確切的作業。但是,Axel的意思是,當您繪製並重繪光盤時,您可以通過重繪網格線來完成每次重繪。這樣網格線總是顯示在前面。 –

0

另一種選擇:

  1. 繪製電路板(或負載從圖像),伴或不透明度。 WinForms中的大多數控件(窗體,面板,picturebox等)都支持BackgroundImage或一些其他大容量圖像加載作爲基礎層。

  2. 在棋盤上正確繪製每個棋子的頂部,但是剪裁/遮罩/操作圓形棋子,以便只有正確的圓形部分通過棋盤上的「洞」顯示出來。你只需要知道棋盤圖像中洞的位置就可以計算出來,並且它會使棋子看起來好像它們在棋盤內「一樣」,就像它們在現實中一樣。

+0

因爲我的板子有圓形孔,所以會很困難:/我只是想把棋子放在棋盤後面 –

+0

然後你可以做相反的事情:首先畫出所有棋子(和正常的圓圈一樣),然後覆蓋棋盤。我知道這是你的原始問題,但不知道如何去做 - 似乎有一個可行的例子[這裏](http://lextendo.blogspot.com/2012/10/transparent-picturebox-overlay-in .html)使用父/子pictureboxes來實現分層,儘管之前沒有使用過這種特殊的技術。 – SlimsGhost

+0

@TarekGhamrawi - 實際上,從董事會中排除區域似乎相當直接 - 在您的情況下,排除「漏洞」,使其透明。你可能想看看[this](http://stackoverflow.com/questions/13039699/system-drawing-invert-region-build-out-of-path)。我認爲,如果您繪製修剪過的圖像或其反轉版本(「孔」未被繪製),您可以獲得所需的圖像。 – SlimsGhost