2011-02-07 15 views
1

Я пытаюсь сделать что-то редактор Tile-Map в C# с использованием графических урн (самый простой способ я мог думать, чтобы бросить плитки в форму)C# Динамическая форма Помощь

код, который создает изображение боксы:

public void Generate_Tiles(int width, int height) 
     { 
      for (int x = 0; x < width; x++) 
      { 
       for (int y = 0; y < height; y++) 
       { 
        System.Windows.Forms.PictureBox picturebox = new PictureBox(); 
        picturebox.BackColor = SystemColors.ActiveCaption; 
        picturebox.Cursor = Cursors.Cross; 
        picturebox.Location = new System.Drawing.Point((x*32) + 4, (y*32) + 4); 
        picturebox.Name = x+y+"tile"; 
        picturebox.Size = new System.Drawing.Size(32, 32); 
        picturebox.TabIndex = 0; 
        picturebox.TabStop = false; 
        picturebox.Click += new System.EventHandler(TileBox_Clicked)); 
        map.Controls.Add(picturebox); 
       } 
      } 
      MessageBox.Show("Done"); 
     } 

Эта часть работы, до тех пор, как я использовать небольшое количество изображений коробок в то время (8 на 8, кажется, максимум, что он хочет показать в приличном количестве времени)

Я хочу выполнить некоторые действия, когда пользователь нажимает на указанный снимок, поэтому у меня есть click method, вот где я сталкиваюсь с проблемами, все ящики с изображениями называются ... picture-box. Насколько я могу судить, я не могу сказать, какой графический ящик пользователь нажал.

Возможно, мне понадобится переделать способ динамической формы, так как я не могу получить очень много ящиков для изображений, но я думаю, что основная проблема все равно будет присутствовать, пока я хочу, чтобы она была динамичной (что я do), не все плиточные карты будут одинакового размера.

Ive никогда не делал ничего подобного, и я искал способы переопределить событие onclick ..., которое я не смог найти, и я не смог найти хороший мозаичный движок, который обновлен до использования (за исключением XNA, но это немного над вершиной для простого редактора плитки, я думаю)

Im, вероятно, идет в противоположном направлении, чем то, что мне нужно делать.

ответ

3

Отправителем в вашем обработчике событий будет PictureBox, который был нажат.

void TileBox_Clicked(object sender, EventArgs e) 
    { 
     PictureBox pictureBox = sender as PictureBox; 
     if(pictureBox != null) 
     { 
      //do stuff with your pictureBox 
     } 
    } 
+0

...и, ради полноты, вы, вероятно, захотите убедиться, что ваш кастинг работает, проверяя mull после этого шага - вы можете случайно связать событие Click другого объекта с этим методом (хотя это может быть только я, который делает такие вещи ;)) ... – ZombieSheep

+0

@ZombieSheep Да; проверка на нуль будет ожидаться ... отредактировано для «полноты»;) –

+0

> _> Наверное, я забыл, что имя объекта, являющегося PictureBox, не имеет значения, если объект, являющийся отправителем, относится конкретно к объекту, который мне нужен, что i THOUGHT, заключалось в том, что попытка изменить 1 picturebox через отправителя изменила бы их все, но теперь, когда я думаю об этом, у всех их есть уникальные указатели ... – RyanTimmons91

1

Не можете ли вы просто передать объект-отправитель PictureBox в обработчик событий и работать с ним?

0

Первый параметр обработчика событий является клике управления (который будет PictureBox.

private void pictureBox1_Click(object sender, System.EventArgs e) 
{ 
    PictureBox pb = (PictureBox)sender; 

    // ... 
} 
0

Я принял этот подход с редактором карты плитки, а также. Как уже говорили другие, вы можете используйте параметр отправителя и передайте его в PictureBox, чтобы получить объект PictureBox, который был нажат. Но я думаю, вы найдете (возможно, у вас уже есть), что приличный размер карты действительно замедлит работу.

Вы можете пересмотреть XNA. Кажется сложным, и не так просто получить что-то работающее, просто создавая кучу объектов PictureBox, но это быстро, и я t вы можете получить 2D-карту, отображаемую достаточно быстро. Вы также можете расширить его, например, если вы хотите, чтобы ваша карта имела разные редактируемые слои (ландшафт и т. Д.).

+0

Мы действительно пошли с компиляцией каждой плитки в одно большое изображение, 256/256 загружается достаточно быстро, и тот факт, что он перерисовывается с каждым редактированием фрагментов, не слишком мешает процессу редактирования, мы планируем сделать его 3d вместо потокового просмотра через XNA, но на данный момент мы хотим использовать базовую систему для наших игровых разработчиков, затем мы будем беспокоиться о том, чтобы он выглядел хорошо для конечных пользователей: D – RyanTimmons91

0

На самом деле существует множество способов сделать это. Я думаю, что проще всего использовать sender вашего обработчика события, который будет указывать вам обратно к щелкнули кнопку:

private void PictureBox_Click(object sender, EventArgs e) 
{ 
    var box = sender as PictureBox; 
    if (box != null) 
    { 
     //... 

Вы также можете создавать и добавлять обработчики событий динамически, что представляет собой интересный вариант:

 //... 
     for (int x = 0; x < width; x++) 
     { 
      for (int y = 0; y < height; y++) 
      { 
       System.Windows.Forms.PictureBox picturebox = new PictureBox(); 

       pictureBox.Click += new Action<object, EventArgs>(
        (sender, e) => { doStuff(pictureBox); } 
       ); 

В приведенном выше коде doStuff получает в качестве параметра pictureBox, поэтому он знает, к какому объекту он должен работать.

Смежные вопросы