En iyi yanıtlayıcılar
Çarpışma Kontrolü

Soru
-
Merhabalar, C#'da oyun gibi bir şey yapmak istiyorum içerik şu; 1-2-3-4-5 şeklinde numaralandırılmış nesnelere aşağıdaki nesneler dokunacak ve dokunduğu anda yukarıdaki nesneler yanıp sönecek ben bunları eklettim fakat çoklu çarpışma kontrolünü yapamadım bir türlü 2 boyulu dizi tanımlayıp yapmaya çalıştım fakat yapamadım. Not: aşağıdaki nesneler çalışma anında ekleniyor ekrana. Çarpışma olayını bana nasıl yapabileceğim hakkında yardımcı olabilecek var mı
Yanıtlar
-
Basit optimizasyona açık pseudo kod yazdım.List<Rectangle> rectangles; //Ben şuanki duruma uygın olduğu için dikdörtgen seçtim bunu Button vb. çevirebilirsin
bool DoHitTest(Rectangle r1,Rectangle r2);//Gövedesini yazmadım internette birçok basit algoritma var. void SolveCollision() { for(int i = 0;i < rectangles.Count;i++) { Rectangle a = rectangles[i]; for(int j = 0;j < rectangles.Count;j++) { Rectangle b = rectangles[i]; if(b != a) { if(DoHitTest(a,b)) { //Birşey yap } } else continue; } } }
- Yanıt Olarak İşaretleyen İlker Galip 19 Nisan 2020 Pazar 11:15
-
Rectangle.IntersectsWith kullanabilirsiniz (ben olsam Button yerine Rectangle eklerdim). Ornek:
void Main() { int buttonCount = 15; Form f = new Form {Height = 600, Width=800}; for (int i = 0; i < buttonCount; i++) { var b = new Button { Height = 40, Width = 40, Text = $"{i + 1}", Name = $"b{i}", Top = (i % 3 * 160) + 40, Left = (i / 3 * 160) + 40, Font = new Font("Verdana", 6)}; f.Controls.Add(b); } var defColor = f.Controls["b1"].BackColor; System.Windows.Forms.Timer t = new System.Windows.Forms.Timer { Interval = 300 }; Random r = new Random(); t.Tick += (sender, e) => { var buttons = f.Controls.OfType<Button>(); var rectangles = new Dictionary<Button, Rectangle>(); foreach (var b in buttons) { var dirX = r.Next()%2; var dirY = r.Next()%2; var x = r.Next(20) * (dirX == 0 ? 1 : -1); var y = r.Next(20) * (dirY == 0 ? 1 : -1); if (b.Top + y >= 0 && b.Top + y < f.Height) b.Top += y; if (b.Left + x >= 0 && b.Left +x < f.Width) b.Left += x; rectangles.Add(b, new Rectangle(b.Left, b.Top, 40, 40)); b.BackColor = defColor; } var hits = rectangles.Where(re => rectangles.Any(rec => rec.Key != re.Key && re.Value.IntersectsWith(rec.Value))); foreach (var hit in hits) { hit.Key.BackColor = Color.Red; } }; t.Enabled = true; f.Show(); }
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız.
- Düzenleyen CetinBasozEditor 19 Nisan 2020 Pazar 17:52
- Yanıt Olarak İşaretleyen İlker Galip 19 Nisan 2020 Pazar 18:21
Tüm Yanıtlar
-
Basit optimizasyona açık pseudo kod yazdım.List<Rectangle> rectangles; //Ben şuanki duruma uygın olduğu için dikdörtgen seçtim bunu Button vb. çevirebilirsin
bool DoHitTest(Rectangle r1,Rectangle r2);//Gövedesini yazmadım internette birçok basit algoritma var. void SolveCollision() { for(int i = 0;i < rectangles.Count;i++) { Rectangle a = rectangles[i]; for(int j = 0;j < rectangles.Count;j++) { Rectangle b = rectangles[i]; if(b != a) { if(DoHitTest(a,b)) { //Birşey yap } } else continue; } } }
- Yanıt Olarak İşaretleyen İlker Galip 19 Nisan 2020 Pazar 11:15
-
-
buttons= new Button[2, _aksCount]; for (int i = 0; i <= buttons.GetUpperBound(0); i++) { for (int j = 0; j <= buttons.GetUpperBound(1); j++) { buttons[i, j] = new Button(); buttons[i, j].Width = 23; buttons[i, j].Height = 23; buttons[i, j].Top = top; top += 70; buttons[i, j].Left = left; buttons[i, j].Text = "*"; buttons[i, j].Name = i.ToString() + j.ToString(); this.Controls.Add(buttons[i, j]); } left += 139; top = 350; } }
kusura bakmayın ben bu aşağıdaki nesneleri 2 boyutlu nesneler şeklinde eklediğim için
Button b = buttons[j]; bu kodu yazamıyorum bu nesneler için 2. boyutlu dizi kullandım
-
Button[] numerics = new Button[8]; //Numeric buttonları bu diziye doldur. void SolveCollision() { if(numerics != null && buttons != null) for(int k = 0;k < 8;k++) { Button a = numerics[k]; for (int i = 0; i < buttons.GetLength(0); i++) for (int j = 0; j < buttons.GetLength(1); j++) { Button b = buttons[i,j]; if(DoHitTest(a,b)) { // } } } }
-
Rectangle.IntersectsWith kullanabilirsiniz (ben olsam Button yerine Rectangle eklerdim). Ornek:
void Main() { int buttonCount = 15; Form f = new Form {Height = 600, Width=800}; for (int i = 0; i < buttonCount; i++) { var b = new Button { Height = 40, Width = 40, Text = $"{i + 1}", Name = $"b{i}", Top = (i % 3 * 160) + 40, Left = (i / 3 * 160) + 40, Font = new Font("Verdana", 6)}; f.Controls.Add(b); } var defColor = f.Controls["b1"].BackColor; System.Windows.Forms.Timer t = new System.Windows.Forms.Timer { Interval = 300 }; Random r = new Random(); t.Tick += (sender, e) => { var buttons = f.Controls.OfType<Button>(); var rectangles = new Dictionary<Button, Rectangle>(); foreach (var b in buttons) { var dirX = r.Next()%2; var dirY = r.Next()%2; var x = r.Next(20) * (dirX == 0 ? 1 : -1); var y = r.Next(20) * (dirY == 0 ? 1 : -1); if (b.Top + y >= 0 && b.Top + y < f.Height) b.Top += y; if (b.Left + x >= 0 && b.Left +x < f.Width) b.Left += x; rectangles.Add(b, new Rectangle(b.Left, b.Top, 40, 40)); b.BackColor = defColor; } var hits = rectangles.Where(re => rectangles.Any(rec => rec.Key != re.Key && re.Value.IntersectsWith(rec.Value))); foreach (var hit in hits) { hit.Key.BackColor = Color.Red; } }; t.Enabled = true; f.Show(); }
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız.
- Düzenleyen CetinBasozEditor 19 Nisan 2020 Pazar 17:52
- Yanıt Olarak İşaretleyen İlker Galip 19 Nisan 2020 Pazar 18:21
-
-
kusura bakmayın takıldığım bir kısım daha oldu hit esnasında bir rastgele bir değer üretmek istiyorum fakat timer içerisinde olduğu için hit bitene kadar değer üretiyor. Şöyle bir kodla denedim bu seferde sadece bir kere değer üretiyor 2. bir hitte değer gelmiyor
int randomWeight = rnd.Next(0, 500); if (write == false) { listBox1.Items.Add("Weight= " + randomWeight + " kg"); write = true;}//bu write değişkeni global değişken
var hits = rectangles.Where(re => rectangles.Any(rec => rec.Key != re.Key && re.Value.IntersectsWith(rec.Value))); foreach (var hit in hits) { hit.Key.BackColor = Color.Red; }
bu kodu kullanarak yaptım hittesti
foreach (var hit in hits) {
//kodu buraya yazıyorum sadece bir kere üretiyor hit.Key.BackColor = Color.Red; }
her hitte nasıl değer ekleyebilirim yardımcı olabilir misiniz?
- Düzenleyen İlker Galip 21 Nisan 2020 Salı 12:13
-
Kusura bakmayın anlamadım ne demek istediğinizi.
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız. -
-
Dedigim gibi. ne demek istediğiniz anlasilmiyor, bilmece gibi soru soruyorsunuz, ben size kodla cevap veriyorum ama siz nedense zahmet edip ornek vermiyorsunuz, hikaye anlatıyorsunuz. N defa okudum anlayabilmek icin, umarım doğrular anlamisimdir:
void Main() { int buttonCount = 15; Form f = new Form { Height = 600, Width = 800 }; for (int i = 0; i < buttonCount; i++) { var b = new Button { Height = 40, Width = 40, Text = $"{i + 1}", Name = $"b{i}", Top = (i % 3 * 160) + 40, Left = (i / 3 * 160) + 40, Font = new Font("Verdana", 6), Tag = 0 }; f.Controls.Add(b); } var defColor = f.Controls["b1"].BackColor; System.Windows.Forms.Timer t = new System.Windows.Forms.Timer { Interval = 300 }; Random r = new Random(); var lastHits = new List<string>(); t.Tick += (sender, e) => { var buttons = f.Controls.OfType<Button>(); var rectangles = new Dictionary<Button, Rectangle>(); foreach (var b in buttons) { var dirX = r.Next() % 2; var dirY = r.Next() % 2; var x = r.Next(20) * (dirX == 0 ? 1 : -1); var y = r.Next(20) * (dirY == 0 ? 1 : -1); if (b.Top + y >= 0 && b.Top + y < f.Height) b.Top += y; if (b.Left + x >= 0 && b.Left + x < f.Width) b.Left += x; rectangles.Add(b, new Rectangle(b.Left, b.Top, 40, 40)); b.BackColor = defColor; } var hits = rectangles.Where(re => rectangles.Any(rec => rec.Key != re.Key && re.Value.IntersectsWith(rec.Value))); foreach (var hit in hits) { if (!lastHits.Contains(hit.Key.Name)) { hit.Key.Tag = (int)hit.Key.Tag + 10; } hit.Key.BackColor = Color.Red; } lastHits = hits.Select(h => h.Key.Name).ToList(); f.Text = string.Join(",",buttons.Select(b => b.Tag)); }; t.Enabled = true; f.Show(); }
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız. -
kusura bakmayın yeterince açıklayıcı yazamadım sanırım
void compare() { int randomWeight = rnd.Next(0, 500); listBox1.Items.Add("Weight= " + randomWeight + " kg"); } private void timer1_Tick(object sender, EventArgs e) { var wheelsControl = wheels.Where(p => p.Text == "*"); foreach (var wheelsC in wheelsControl) { wheelsC.Location = new Point(wheelsC.Location.X, wheelsC.Location.Y + -5); } collisonDetection(); } void collisonDetection() { var recWheel = new Dictionary<Button, Rectangle>(); foreach (Button wheel in wheels) { recWheel.Add(wheel, new Rectangle(wheel.Left, wheel.Top, 23, 23)); wheel.BackColor = defcolor; } var hits = recWheel.Where(re => recWheel.Any(rec => rec.Key != re.Key && re.Value.IntersectsWith(rec.Value))); foreach (var hit in hits) { hit.Key.BackColor = Color.Red; compare();//bu kısımda rastgele bir ağılık üretilecek ve listboxa yazacak fakat ben
burada rastgele bir değer ürettiğimde aşağıdaki resimdeki gibi bir sürü değer çıkıyor ben nesneler birbirine her değdiğinde bir tane değer üretmesini istiyorum
} }
bunu bir türlü yapamadım veriler timer içerisinde üretildiği için bir sürü değer geliyor.
- Düzenleyen İlker Galip 21 Nisan 2020 Salı 13:45
-
Benim yazdigimda olmayan ne, bir anlasam. Sizin yazdiginiz calistirilabilen bir kod degil, bakin ben size kopyala&yapistir ve calistir kod veriyorum (sadece using'leri eklemiyorum).
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız.
- Düzenleyen CetinBasozEditor 21 Nisan 2020 Salı 14:02