A 'tremble' effect with while?

0

I'm using the following code inside a Timer:

void dt_Tick(object sender, EventArgs e)
        {
            double x, y;
            int cont = 0;
            x = tt.X;
            y = tt.Y;
            while(cont < 5)
            {
                tt.X += cont;
                tt.Y += cont;
                cont++;
            }
            while(cont > 0)
            {
                tt.X -= cont;
                tt.Y -= cont;
                cont--;
            }
            tt.X = x;
            tt.Y = y;
        }

It would be for a button, change the position of your X and Y to give an effect as if it were shaking, how do I do it? With this code it stops, taking out the last two lines, it just goes up on the screen.

I tried this way to make a rough effect:

 double x, y;
            int cont = 0;
            x = tt.X; //armazana varaivel X para manipulação
            y = tt.Y; //backup da variavel Y

            while (cont < 20)
            {
                if(dt.Interval.TotalSeconds % 2 == 0)
                {
                    tt.X = (20 - cont);
                }
                else
                {
                    tt.X = (20 - cont);
                }

                cont++;
            }
    
asked by anonymous 09.09.2015 / 06:29

1 answer

1

I'll give you an idea of how you would do this.

I'll do it in windows forms just to give you an idea.

private void button1_Click(object sender, EventArgs e)
        {
            int x;
            int by;
            int cont = 0;
            x = button1.Location.X; //armazana varaivel X para manipulação
            by = button1.Location.Y; //backup da variavel Y

            //vamos fazer o botão tremer 20 vezes decrementando ele para posição inicial
            //isso vai dar o efeito de tremida mais suave
            while (cont < 20)
            {
                //desloca 20 para a direita, depois vai deslocar 19 e por ai vai até a posição ser a inicial do botão
                button1.Location = new Point(x += (20 - cont), by);
                //aguarda 20 milisegundos para dar tempo de nosso cerebro interpretar e reconhecer o deslocamento
                System.Threading.Thread.Sleep(20);

                //desloca para o centro novamente
                button1.Location = new Point(x -= (20 - cont), by);
                //aguarda 20 milisegundos para dar tempo de nosso cerebro interpretar e reconhecer o deslocamento
                System.Threading.Thread.Sleep(20);

                //desloca 20 para a esquerda, depois vai deslocar 19 e por ai vai até a posição ser a inicial do botão
                button1.Location = new Point(x -= (20 - cont), by);
                //aguarda 20 milisegundos para dar tempo de nosso cerebro interpretar e reconhecer o deslocamento
                System.Threading.Thread.Sleep(20);

                //desloca para o centro novamente
                button1.Location = new Point(x += (20 - cont), by);
                //aguarda 20 milisegundos para dar tempo de nosso cerebro interpretar e reconhecer o deslocamento
                System.Threading.Thread.Sleep(20);

                cont++;
            }
        }

Ideally, do not use System.Threading.Thread.Sleep and rather store your logic inside a timer.

More importantly, between one offset and another you should pause for our brain to interpret visual information, otherwise it is so fast that it seems to us that it has not moved.

And also manipulate the shifts so that it does the shaking effect and not simply shift N pixels to the X axis and then reverse and good. This does not work.

You can create a windows form ai project and test the code or adapt it directly to your project.

    
09.09.2015 / 15:01