选择方阵矩形对角线上的单元格(按钮)

时间:2014-11-14 20:35:43

标签: c# algorithm animation

我正在编写wpf音乐键盘应用程序,其中我有16个按钮(以下是真实音乐板https://www.youtube.com/watch?v=3vC5TsSyNjU的示例)。

每个按钮播放不同的音乐样本。这很好用。 但是当用户处于空闲状态时,我想创建下图所示的简单动画。

enter image description here

动画从按钮1开始(将其背景颜色设置为白色,然后返回原始颜色)。

以下是动画的步骤:

  • 第1步:动画按钮:1
  • 第2步:动画按钮:2,Q
  • 第3步:动画按钮:3,W,A
  • 第4步:动画按钮:4,E,S,Z
  • 步骤5:动画按钮:R,D,X
  • 第6步:动画按钮:F,C
  • 第7步:动画按钮:V

我创建了函数 AnimatePad ,它按下按钮并在指定时间后启动背景颜色动画。此功能按预期工作。

为了实现上述步骤,我为每个按钮调用了 AnimatePad 功能。这是我正在使用的代码,这是我想要改进的。我目前已对此步骤进行了硬编码。如果我的按钮计数变化,我必须返回并更改此代码,这是一个坏主意。

        double beginMs = 0;
        var spd = 300;
        var interval = 40;
        var toColor = Color.FromRgb(255, 255, 255);
        AnimatePad(ref beginMs, spd, pads[0], toColor);

        beginMs += interval;
        AnimatePad(ref beginMs, spd, pads[1], toColor);
        AnimatePad(ref beginMs, spd, pads[4], toColor);

        beginMs += interval;                
        AnimatePad(ref beginMs, spd, pads[2], toColor);
        AnimatePad(ref beginMs, spd, pads[5], toColor);
        AnimatePad(ref beginMs, spd, pads[8], toColor);

        beginMs += interval;                
        AnimatePad(ref beginMs, spd, pads[3], toColor);
        AnimatePad(ref beginMs, spd, pads[6], toColor);
        AnimatePad(ref beginMs, spd, pads[9], toColor);
        AnimatePad(ref beginMs, spd, pads[12], toColor);

        beginMs += interval;                 
        AnimatePad(ref beginMs, spd, pads[7], toColor);
        AnimatePad(ref beginMs, spd, pads[10], toColor);
        AnimatePad(ref beginMs, spd, pads[13], toColor);

        beginMs += interval;                 
        AnimatePad(ref beginMs, spd, pads[11], toColor);
        AnimatePad(ref beginMs, spd, pads[14], toColor);

        beginMs += interval;                
        AnimatePad(ref beginMs, spd, pads[15], toColor);

所以我想要更通用的方法来选择动画按钮。

我敢肯定必须有一些算法。谢谢!

2 个答案:

答案 0 :(得分:2)

想象一下带有索引和索引总和的2d数组。 如果添加每个按钮的索引,您将获得总和。 例如, 0,0 项的总和为0. 2,1 索引和为3,依此类推。

在步骤1中选择具有索引和0的按钮,在步骤2中选择具有索引和1的按钮等。

enter image description here

我不知道垫阵列的类型是什么。如果它们只是按钮数组,那么我建议创建复杂类型。例如:

public class PadItem
{
    public Button Pad {get; set; }
    public int IndexSum {get; set; }
}

以下是样本:

for (int i = 0; i < 7; i++)
{
    var stepPads = pads.Where(p => p.IndexSum == i);
    beginMs += interval;
    foreach (var pad in stepPads)
    {
        AnimatePad(ref beginMs, spd, pad, toColor);
    }
}

答案 1 :(得分:1)

试试这个:

var n = (int) Math.Sqrt(pads.Length);
int i = 0, j = 0, k = 0;
for(i = 0; i < n; i++){
   k = i;
   AnimatePad(ref beginMs, spd, pads[k], toColor);
   for(j = 0; j < i; j++){
      k += n-1;          
      AnimatePad(ref beginMs, spd, pads[k], toColor);
   }
   beginMs += interval;
}
for(i = n-2; i >= 0; i--){       
   k = (n-i)*n - 1;
   AnimatePad(ref beginMs, spd, pads[k], toColor);
   for(j = 0; j < i; j++){
      k += n-1;
      AnimatePad(ref beginMs, spd, pads[k], toColor);
   }
   beginMs += interval;
}