Обнаружение столкновений с дублированным полем изображений

#c# #duplicates #collision #picturebox #detection

Вопрос:

Для моей школы я должен сделать небольшой проект. Цель проекта состоит в том, чтобы сделать игру, которая порождает разные прямоугольники, и вы должны нажимать на них.

Если вы нажмете на них, вы получите очки, и прямоугольник будет заменен новым. И с каждым тиком таймера флажок становится все больше.

Мы должны использовать коробки с картинками.

Теперь мой вопрос таков:

Как я могу сделать обнаружение, чтобы указать поле изображения, которое совпадает с границей панели или с другим полем изображения.

Проблема в том, что графические поля дублируются.

Итак, как я могу решить эту проблему?

Это мой код:

 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 BoxClicker
{
    public partial class Form1 : Form
    {

        private Random rndColor = new Random();
        private Random rndCreation = new Random();


        public Form1()
        {
            InitializeComponent();
        }

        private void CreateBox()
        {
            PictureBox gamebox = new PictureBox();
            gamebox.Size = new Size(20, 20);
            gamebox.Location = new Point(rndCreation.Next(0, pnlSpiel.Width - 30), rndCreation.Next(0, pnlSpiel.Height - 30));
            gamebox.BackColor = Color.FromArgb(rndCreation.Next(0, 255), rndCreation.Next(0, 255), rndCreation.Next(0, 255));
            pnlSpiel.Controls.Add(gamebox);
            gamebox.Click  = pictureBox1_Click;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < numValues.Value; i  )
            {
                CreateBox();
            }

            tmrResize.Start();

            txtNotification.Text = "Klicke auf die erscheinenden Boxen um Punkte zu sammeln!";
            btnStart.Visible = false;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            CreateBox();

            PictureBox gamebox = sender as PictureBox;
            int addPoints = gamebox.Width;
            txtPoints.Text = (Convert.ToInt32(txtPoints.Text)   addPoints).ToString();
            if ((Convert.ToInt32(txtBiggestBox.Text) < addPoints))
            {
                txtBiggestBox.Text = (Convert.ToString(addPoints));
            }
            pnlSpiel.Controls.Remove(sender as PictureBox);
        }

        private void button1_Click_1(object sender, EventArgs e)
        {

            if (tmrEasterEgg.Enabled)
            {
                tmrEasterEgg.Stop();
                BackColor = Color.LightGray;
            }
            else
            {
                tmrEasterEgg.Start();
            }
        }

        private void tmrEasterEgg_Tick(object sender, EventArgs e)
        {
            Color randomColor = Color.FromArgb(rndColor.Next(256), rndColor.Next(256), rndColor.Next(256));
            BackColor = randomColor;
        }

        private void tmrResize_Tick(object sender, EventArgs e)
        {
            for (int i = 0; i < pnlSpiel.Controls.Count; i  )
            {
                PictureBox gamebox = pnlSpiel.Controls[i] as PictureBox;
                gamebox.Size = new Size(gamebox.Size.Width   1, gamebox.Size.Height   1);
            }
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            pnlSpiel.Controls.Clear();
            txtNotification.Text = "Das Spiel wurde zurückgesetzt";
            txtPoints.Text = "0";
            btnStart.Visible = true;
        }
    }
}

 

Ответ №1:

Вы можете включить обнаружение столкновений в свой CreateBox метод. И решите, добавлять туда объект или нет. Подобный этому:

 private void CreateBox()
{
    Rectangle bounds = new Rectangle(rndCreation.Next(0, pnlSpiel.Width - 30),
        rndCreation.Next(0, pnlSpiel.Height - 30),
        20, 20);

    bool pBDoIntersect = false;
    foreach (Control picturebox in pnlSpiel.Controls)
    {
        if (bounds.IntersectsWith(picturebox.Bounds))
        {
            pBDoIntersect = true;
        }
    }

    if (!pBDoIntersect)
    {
        PictureBox gamebox = new PictureBox();
        gamebox.Size = new Size(bounds.Width, bounds.Height);
        gamebox.Location = new Point(bounds.X, bounds.Y);
        gamebox.BackColor = Color.FromArgb(rndCreation.Next(0, 255), rndCreation.Next(0, 255), rndCreation.Next(0, 255));
        pnlSpiel.Controls.Add(PB);
        gamebox.Click  = pictureBox1_Click;
    }
    else
    {
        // spawn in another place?
    }
}
 

Комментарии:

1. Эй, спасибо тебе за твой ответ. Но я думаю, что вы не поняли моего вопроса. Цель не в том, чтобы они не могли породиться друг в друге. Моя проблема в том, что я должен создать код, который определяет, когда коробка сталкивается с другой коробкой. Потому что коробки становятся больше с каждым тиком таймера. Поэтому я должен сделать обнаружение, чтобы сделать для «txtNotification» уведомление, когда коробки сталкиваются друг с другом во время их роста. Ты меня понимаешь? Но я все равно буду реализовывать ваш код, потому что он тоже полезен. Большое спасибо

2. Я думаю, что понимаю вас, если вы хотите добавить текст в текстовое поле, когда поле столкнется, вы можете добавить этот код в if(pBDoIntersect)

3. Я сделал это так, как ты говорил. Я вставил следующий код в метод createBox: if (pBDoIntersect) { txtNotification.Text = "Die Boxen sind kollidiert"; } Но таким образом он получает текстовое сообщение только тогда, когда поле появляется в другом поле, я думаю. И это не то, чего я хочу. Он должен получить сообщение, когда они столкнутся, пока коробки стендов находятся в «фазе роста». Ссылка на скриншот Здесь вы можете видеть, что на нем нет сообщения (сверху), когда они сталкиваются.

4. Обновление: Я узнал, что if(pBDoIntersect) работает только тогда, когда picturebox появляется за пределами «игровой панели», но это не то, что я хочу… Я думаю, что в этом разделе есть что изменить: bool pBDoIntersect = false; foreach (Control picturebox in pnlSpiel.Controls) { if (bounds.IntersectsWith(picturebox.Bounds)) { pBDoIntersect = true; } } Но что я должен там изменить, чтобы он работал с другими коробками изображений, а не с панелью?