#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; } }
Но что я должен там изменить, чтобы он работал с другими коробками изображений, а не с панелью?