C# formu üzerine eklenen butonun kenarlara ve engellere temas edip sekmesiyle top oyunu bir adım daha ileri götürülmüştür.
Top sekme oyununun 1. ve 2. versiyonları aşağıdaki yazılarda açıklanmıştır:
- C# Örnekleri – Top Oyunu v1 – Form Kenarlarından Seken Top
- C# Örnekleri – Top Oyunu v2 – Engelden Seken Top
Form üzerinde kullanılan Panel nesnelerinin tamamı engel olarak algılanmaktadır. Dolayısıyla, form üzerinde Panel oluşturmak engel oluşturmak için yeterli olmaktadır. Bunun için tüm engelleri elde edebilecek, engelListele() adında bir metot tanımlanacaktır.
1 2 3 4 5 6 7 8 | private void engelListele() { foreach (var engel in this.Controls) { if (engel is Panel) engelCarpisma((Panel)engel); } } |
this.Controls ifadesi sayesinde mevcut form üzerindeki tüm nesnelere ulaşılabilmektedir. Farklı türdeki bu nesnelerin panel olup olmadığı ise IF şartı içinde kontrol edilmektedir.
Her bir engelin elde edilmesinden sonra, ilgili engel ile çarpışma olup olmadığının kontrolü de engelCarpisma() metodu ile kontrol edilmektedir. Bu metod, engel değişkeni aracılığı ile engelCarpisma() metoduna Panel nesnesi göndermektedir.
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 | private void engelCarpisma(Panel engel) { #region ENGELE SOLDAN ÇARPMA if (yatayYon == 1 && kare.Right == engel.Left && kare.Bottom >= engel.Top && kare.Top <= engel.Bottom) yatayYon *= -1; #endregion #region ENGELE SAĞDAN ÇARPMA else if (yatayYon == -1 && kare.Left == engel.Right && kare.Bottom >= engel.Top && kare.Top <= engel.Bottom) yatayYon *= -1; #endregion #region ENGELE ÜSTTEN ÇARPMA //ÜSTTEN if (dikeyYon == 1 && kare.Bottom == engel.Top && kare.Right >= engel.Left && kare.Left <= engel.Right) dikeyYon *= -1; #endregion #region ENGELE ALTTAN ÇARPMA //ALTTAN else if (dikeyYon == -1 && kare.Top == engel.Bottom && kare.Right >= engel.Left && kare.Left <= engel.Right) dikeyYon *= -1; #endregion } |
Yukarıdaki kodlar, önceki versiyonlarda anlatılan işlemleri gerçekleştirmektedir.
Birçok Engelden Seken Top Örneği Kaynak Kodları
Aşağıdaki kodlarda kare adında bir buton ve birkaç Panel içeren bir form bulunmaktadır. Bu formun kaynak kodları aşağıdaki gibidir:
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 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 ButonCarpisma { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int dikeyYon = 1, yatayYon = 1; private void Form1_Load(object sender, EventArgs e) { } private void timer1_Tick(object sender, EventArgs e) { kare.Left += yatayYon; kare.Top += dikeyYon; if (kare.Right >= this.Width || kare.Left <= 0) yatayYon *= -1; if (kare.Bottom >= this.Height || kare.Top <= 0) dikeyYon *= -1; engelListele(); } private void engelListele() { foreach (var engel in this.Controls) { if (engel is Panel) engelCarpisma((Panel)engel); } } private void engelCarpisma(Panel engel) { #region ENGELE SOLDAN ÇARPMA if (yatayYon == 1 && kare.Right == engel.Left && kare.Bottom >= engel.Top && kare.Top <= engel.Bottom) yatayYon *= -1; #endregion #region ENGELE SAĞDAN ÇARPMA else if (yatayYon == -1 && kare.Left == engel.Right && kare.Bottom >= engel.Top && kare.Top <= engel.Bottom) yatayYon *= -1; #endregion #region ENGELE ÜSTTEN ÇARPMA //ÜSTTEN if (dikeyYon == 1 && kare.Bottom == engel.Top && kare.Right >= engel.Left && kare.Left <= engel.Right) dikeyYon *= -1; #endregion #region ENGELE ALTTAN ÇARPMA //ALTTAN else if (dikeyYon == -1 && kare.Top == engel.Bottom && kare.Right >= engel.Left && kare.Left <= engel.Right) dikeyYon *= -1; #endregion } } } |