У меня есть TableLayoutPanel внутри формы, и этот TableLayoutPanel имеет пять элементов управления Picturebox внутри некоторых ячеек. Что я хотел бы сделать, так это переместить эти поля изображений в разные ячейки на основе списка координат, переданного в качестве аргумента. С точки зрения пользователя, эти графические блоки исчезнут из одной ячейки и снова появятся в другой (точно так же, как главный персонаж в основной игре с плиткой, где персонаж исчезает в одной ячейке и снова появляется в соседней ячейке). Метод обновления находится внутри класса Form и вызывается методом из другого класса. Проблема в том, что он не отображает каждое движение. Он просто показывает начальные позиции всех Picturebox'ов с последующим обновлением, а затем конечное положение. Он должен отображать PictureBoxes в каждой координате, прежде чем он перейдет к окончательной координате. Я пробовал Thread.Sleep (), но он не работает. Как мне решить эту проблему?
public partial class CheckerBoard : Form
{
....
....
public void update(Position k, List<Position> p)
{
p1_picturebox.Visible = false;
p2_picturebox.Visible = false;
p3_picturebox.Visible = false;
p4_picturebox.Visible = false;
p5_picturebox.Visible = false;
// Load images in new positions
this.board.Controls.Add(k_picturebox, k.col, knight.row);
this.board.Controls.Add(p1_picturebox, p[0].col, p[0].row);
this.board.Controls.Add(p2_picturebox, p[1].col, p[1].row);
this.board.Controls.Add(p3_picturebox, p[2].col, p[2].row);
this.board.Controls.Add(p4_picturebox, p[3].col, p[3].row);
this.board.Controls.Add(p5_picturebox, p[4].col, p[4].row);
------UPDATED---------
this.Invalidate();
Thread.Sleep(3000);
}
}
ОБНОВЛЕНИЕ Я исправил свой код в соответствии с предложениями. Однако проблема все еще сохраняется. Кажется, что он перерисовывает всю tablelayoutpanel вместо того, чтобы перемещать блок изображения из одной ячейки в другую. Я вижу обновление tablelayoutpanel.
private void replay(State currentState)
{
DispatcherTimer timer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(0.5)
};
timer.Tick += (o, e) =>
{
List<Position> pos = new List<Position>();
foreach(Position p in currentState.pawns)
{
pos.Add(p);
}
this.update(currentState.knight, pos);
currentState = currentState.next;
if (currentState == null)
{
timer.IsEnabled = false;
//this.prepareDisplay();
}
};
timer.IsEnabled = true;
}
public void update(Position knight, List<Position> pawns)
{
// Load images in new positions
this.board.Controls.Remove(knight_picturebox);
this.board.Controls.Add(knight_picturebox, knight.col, knight.row);
for(int i=0; i < pawns.Count; i++)
{
//this.board.Controls.Add(this.picBoxList[i], pawns[i].col, pawns[i].row);
this.picBoxList[i].WaitOnLoad = true;
this.board.Controls.Remove(this.picBoxList[i]);
this.board.Controls.Add(this.picBoxList[i], pawns[i].col, pawns[i].row);
}
}
ОБНОВЛЕНИЕ с помощью suspendLayout иhanceLayout улучшается перерисовка. Но мне интересно, можно ли не перерисовывать макет таблицы, а только графические блоки, чтобы казалось, что движутся только графические блоки.
this.Update();
перед сном. Но дальше нужно научиться пользоваться таймером. Затем мы узнаем, как выглядит игровой цикл. - person Hans Passant   schedule 16.02.2016