private void Undo() { lock (_lockObject) { undoToolStripMenuItem.Enabled = false; foreach (Block b in _settingsPack.Blocks) { float rad = 1.5f * Math.Max(painterControl1.Width, painterControl1.Height); float renderSize = _cellSize * b.ScaleCoefficient; PointF center = new PointF(1f * painterControl1.Width / 2, 1f * painterControl1.Height / 2); float x = b.X - center.X + renderSize / 2; float y = b.Y - center.Y + renderSize / 2; PointF to = new PointF(); if (Math.Abs(x) > Math.Abs(y)) { to.Y = y / Math.Abs(x) * rad + center.X - renderSize / 2; to.X = rad * Math.Sign(x) + center.X - renderSize / 2; } else { to.X = x / Math.Abs(y) * rad + center.X - renderSize / 2; to.Y = rad * Math.Sign(y) + center.X - renderSize / 2; } b.TargetPoint = to; } _disappearingBlocks.AddRange(_settingsPack.Blocks); _settingsPack.Blocks = Fun.CloneList(_settingsPack.PreviousStep, false); foreach (Block item in _settingsPack.Blocks) { item.Location = CoordOfCell(item.TargetCell); item.ScaleCoefficient = 0; item.RenderIndex = item.Index; } _settingsPack.Score = _settingsPack.PreviousScore; _settingsPack.PreviousStep = null; } }
/// <summary> /// Обработчик нажатия клавиш /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MainForm_KeyDown(object sender, KeyEventArgs e) { bool moved; List <Block> prStep = Fun.CloneList(_settingsPack.Blocks, false); long prScore = _settingsPack.Score; lock (_lockObject) { //Update(0.01);; moved = false; foreach (Block b in _settingsPack.Blocks) { if (!b.Processed && b.IsMain) { moved |= MoveBlock(b, Fun.ConvertKeyToDirection(e.KeyCode)); } } foreach (Block b in _settingsPack.Blocks) { b.Processed = b.NowMerged = false; } _settingsPack.Blocks.Sort(); } if (moved) { GenerateNew(); _settingsPack.PreviousScore = prScore; _settingsPack.PreviousStep = prStep; undoToolStripMenuItem.Enabled = true; } UpdateCaption(); }