none
Çarpışma Kontrolü RRS feed

  • 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ı

    19 Nisan 2020 Pazar 09:49

Yanıtlar

  • 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; } } }

    Basit optimizasyona açık pseudo kod yazdım.
    • Yanıt Olarak İşaretleyen İlker Galip 19 Nisan 2020 Pazar 11:15
    19 Nisan 2020 Pazar 10:31
  • 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.





    19 Nisan 2020 Pazar 17:47
    Yanıtlayıcı

Tüm Yanıtlar

  • 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; } } }

    Basit optimizasyona açık pseudo kod yazdım.
    • Yanıt Olarak İşaretleyen İlker Galip 19 Nisan 2020 Pazar 11:15
    19 Nisan 2020 Pazar 10:31
  • yardımcı olduğunuz için teşekkür ederim
    19 Nisan 2020 Pazar 11:14
  • 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

    19 Nisan 2020 Pazar 16:31
  • 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))
                   {
                       //
                   }   
               }     
        }
    
    }

    19 Nisan 2020 Pazar 17:46
  • 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.





    19 Nisan 2020 Pazar 17:47
    Yanıtlayıcı
  • teşekkür ederim 
    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?


    21 Nisan 2020 Salı 11:54
  • 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.

    21 Nisan 2020 Salı 12:31
    Yanıtlayıcı
  • iki nesne biribirine değdiği anda renk değiştiriyor ya renk değişiminin yanında reastgele bir değer üretecek fakat bu işlemi timer içerisinde yaptığım için bir sürü değer üretiyor bunu her hitte bir değer üretimi şeklinde nasıl yapabilirim
    21 Nisan 2020 Salı 12:34
  • 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.

    21 Nisan 2020 Salı 13:13
    Yanıtlayıcı
  • 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.


    21 Nisan 2020 Salı 13:44
  • 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.




    21 Nisan 2020 Salı 14:01
    Yanıtlayıcı