Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
1
.NET 4.x

Подбор времени для таймера для передвижение объекта за точное время

09.12.2018, 14:39. Просмотров 446. Ответов 19
Метки нет (Все метки)

Здравствуйте. Как подобрать время таймера и скорость передвижение например pictorebox за точное время
Например дано 3 секунды за которое должен быть передвинут pictorebox
Должен быть передвинут на 472 пикселя
Не могу подобрать формулу. Не силен в матиматике. Просто при подборе формул получается дробное значение а ни таймер ни картинку нельзя передвигать на дробное значение.
Ну если делать на неточное то хотя бы чтобы погрешность бы была небольшая.
Мне нужно формулой чтобы можно было применить к любойму размеру. Тоесть размер формы можно менячть и размер картинки тоже будет менятся.
И это не игра. Это для програмы анимацимя запуска нужна.
Вообще хотелось бы анимацию подогнать под 60 кадров в секунду но если учитывать что таймер устроен так что 1000 = 1 секунда то значение получается дробным. Не знаю. Свой таймер чтоли пилить. Знать бы как.
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2018, 14:39
Ответы с готовыми решениями:

"Будильник". Задается время включения звукового сигнала и интервал времени для таймера
помогите исправить код, не повторяет повтор сигнала через заданное время Задание: Создать...

Реализовать алогритм с точностью до скенунды определяющий точное время для установки на клиенте
Для того чтобы компы поддерживали актуальное время, они могут обращаться к серверам точного времени...

Сохранение времени для таймера
Здравствуйте, создавая секундомер в Windows Forms,столкнулся с такой проблемой, что после нажатия...

Реализовать работу таймера для обратного отсчета времени
При запуске главной формы нажимаем кнопку "Начать" -> должна появиться форма "Указать время в...

19
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 15:30 2
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
дано 3 секунды за которое должен быть передвинут pictorebox
Должен быть передвинут на 472 пикселя
хотелось бы анимацию подогнать под 60 кадров в секунду
Анимация — это функция зависимости значения от времени.
Бросьте обычный таймер на форму и пусть он себе тикает с интервалом 16 мс.
С запуском таймера запускайте и Stopwatch, чтобы он давал более точное значение прошедшего времени — на его основе и вычисляйте текущее значение/

Ниже — пример простой линейной анимации (метод TimerElapsed привяжите к событию Tick таймера):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
readonly Stopwatch timeline = new Stopwatch();
 
private void StartAnimation()
{
    timeline.Restart();
    animationTimer.Start();
}
 
private void TimerElapsed(object sender, EventArgs e)
{
    var elapsed = timeline.Elapsed;
            
    var duration = TimeSpan.FromSeconds(3);
    if (elapsed >= duration)
        elapsed = duration;
 
    pictureBox.Left = (int)Animate(elapsed.TotalMilliseconds, 0, 482, duration.TotalMilliseconds);
}
 
double Animate(double time, double start, double change, double duration)
{
    return start + change * time / duration;
}
Если нужно ослабление, то просто меняете реализацию Animate (или создаете делегат на нужную реализацию).
Ниже — пример квадратичного на старте и финише:
C#
1
2
3
4
5
6
7
8
9
double Animate(double time, double start, double change, double duration)
{
    time /= duration / 2;
    if (time < 1)
        return change / 2 * time * time + start;
 
    time--;
    return -change / 2 * (time * (time - 2) - 1) + start;
}
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 15:51  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Анимация — это функция зависимости значения от времени.
Бросьте обычный таймер на форму и пусть он себе тикает с интервалом 16 мс.
С запуском таймера запускайте и Stopwatch, чтобы он давал более точное значение прошедшего времени — на его основе и вычисляйте текущее значение/
Ниже — пример простой линейной анимации (метод TimerElapsed привяжите к событию Tick таймера):
Можете написать что из себя представляют значения Elapsed и duration
и что за 482? На сколько пикселей передвинуть нужно? Но у меня 472.
Да и буду передвигать 2 картинки. Собственно картинки выступают в роли шторок сцены и раздвигаются как двери лифта.
0
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 15:56 4
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Можете написать что из себя представляют значения Elapsed и duration
Первое — количество времени, прошедшее с начала анимации.
Второе — время, за которое анимация значения должна завершиться.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
и что за 482?
Значение, взятое с потолка.
Измените на 472 — не стесняйтесь играться с примером.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Да и буду передвигать 2 картинки. Собственно картинки выступают в роли шторок сцены и раздвигаются как двери лифта.
Не проблема — в обработчик таймера добавьте второй вызов Animate для второй картинки с нужными для нее значениями.
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 17:20  [ТС] 5
1 Картинка размещается на 0 и идет к - 472 вторая картинка размещается на 480 и идет к (480+472) это по оси координат x по y неизменно
0
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 17:31 6
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
1 Картинка размещается на 0 и идет к - 472 вторая картинка размещается на 480 и идет к (480+472)
Пропишите соответствующие вызовы в TimerElapsed:
C#
1
2
picture1.Left = (int)Animate(elapsed.TotalMilliseconds, 0, -472, duration.TotalMilliseconds);
picture2.Left = (int)Animate(elapsed.TotalMilliseconds, 480, 472, duration.TotalMilliseconds);
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 17:47  [ТС] 7
а start я так пологаю с какой позиции начинается?
0
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 17:49 8
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
а start я так пологаю с какой позиции начинается?
С переданной в виде аргумента при вызове метода.
В вашем случае — 0 и 480 для первой и второй картинки соответственно.
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 17:54  [ТС] 9
А как вообще определяется когда нужно прекратить анимацию?
0
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 18:12 10
Alexandr_7, значением переменной duration.
В примере выше - 3 секунды.
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 18:14  [ТС] 11
Цитата Сообщение от kolorotur Посмотреть сообщение
Alexandr_7, значением переменной duration.
В примере выше - 3 секунды.
Ну там полдучается цекличность? МИне цикличность не нужна. Только 1 раз при старте ну и возможнри закрытии в обраном направлении.
0
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 19:03 12
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Ну там полдучается цекличность? МИне цикличность не нужна.
Господи, а что вам мешает запустить этот код и проверить лично?
Или вы боитесь, что я вам диск отформатирую? Не бойтесь, не отформатирую.
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 19:19  [ТС] 13
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private void tmrAnim_Tick(object sender, EventArgs e)
        {
            if (IDAnim == 0)
            {
                if (_LengthSecStartSoundStream > 0) _LengthSecStartSoundStream--;
                else
                {
                    _StartSoundStream = Bass.BASS_StreamCreateFile(Application.StartupPath + @"\data\Sound\L_Move_Background.ogg", 0, 0, BASSFlag.BASS_DEFAULT);
                    _C_LengthSecStartSoundStream = (int)Bass.BASS_ChannelBytes2Seconds(_StartSoundStream, Bass.BASS_ChannelGetLength(_StartSoundStream));
                    _LengthSecStartSoundStream = _C_LengthSecStartSoundStream;
                    Bass.BASS_ChannelPlay(_StartSoundStream, false);
                    tmrAnim.Interval = 16;
                    IDAnim++;
                    timeline.Start();
                    //timeline.Reset();
                }
            }
            else if (IDAnim == 1)
            {
                if (_LengthSecStartSoundStream > 0)
                {
                    var elapsed = timeline.Elapsed;
 
                    var duration = TimeSpan.FromSeconds(_C_LengthSecStartSoundStream);
                    if (elapsed >= duration)
                        elapsed = duration;
 
                    pb_Background[0].Left = (int)L.Additional_DHE.Animate(elapsed.TotalMilliseconds, 0, -472, duration.TotalMilliseconds);
                    pb_Background[1].Left = (int)L.Additional_DHE.Animate(elapsed.TotalMilliseconds, 480, 472, duration.TotalMilliseconds);
 
                    _LengthSecStartSoundStream--;
                }
                else
                {
                    timeline.Stop();
                    tmrAnim.Stop();
                }
            }
        }
Чет не работает. Я по всякому timeline эксперементировал. Но Restart в нем нету. Возможно это в net 4.0 появилось но у меня пока 3.5 используется
0
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 19:29 14
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Возможно это в net 4.0 появилось но у меня пока 3.5 используется
Да, оно.
Замените на: timeline.Reset();
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 19:30  [ТС] 15
Цитата Сообщение от kolorotur Посмотреть сообщение
Да, оно.
Замените на: timeline.Reset();
Не помогает!
0
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 21:37 16
Alexandr_7, ну у вас там какие-то условия и прочие махинации - я понятия не имею что они делают.
Простой пример во втором сообщении замечательно работает.
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 22:50  [ТС] 17
IDAnim это индитефикатор анимации
0 анимация это ожидание когда закончится стартовый звук. Потом к слову и изменяется интервал таймера на 16 и вызывается timeline
0
Эксперт .NET
13726 / 10611 / 2795
Регистрация: 17.09.2011
Сообщений: 18,002
09.12.2018, 23:05 18
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Потом к слову и изменяется интервал таймера на 16 и вызывается timeline
Тогда не понятна логика работы переменной _LengthSecStartSoundStream.
Судя по имени и использованию — это время в секундах.
Почему вы ее тогда уменьшаете на единицу каждые 16мс, которые тикает таймер?
Если у вас ее значение, скажем, 3 секунды, то таймер тикнет всего 3 раза до того, как значение этой переменной стане равно нулю и вы остановите анимацию. То есть, получите анимации на 48 миллисекунд.
0
4004 / 2875 / 1255
Регистрация: 09.05.2015
Сообщений: 7,043
09.12.2018, 23:19 19
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Я по всякому timeline эксперементировал. Но Restart в нем нету.
Цитата Сообщение от kolorotur Посмотреть сообщение
Замените на: timeline.Reset();
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Не помогает!
Reset() это не то же самое что Restart(). Restart() это Reset() + Start().

https://referencesource.micros... tch.cs,109
0
28 / 15 / 4
Регистрация: 29.12.2015
Сообщений: 1,528
09.12.2018, 23:20  [ТС] 20
Ну да время звукового потока в секундах
Стартового звукового потока.
Цитата Сообщение от kolorotur Посмотреть сообщение
Почему вы ее тогда уменьшаете на единицу каждые 16мс, которые тикает таймер?
Ой блин. Вот и промашка. Мда. Ее надо уменьшать каждую секунду. А при 2 вхождении я использую интервал 16 мс.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2018, 23:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Пример для записи времени таймера в ячейку подключенной БД. Фотофиниш
Друзья, всем привет! Очень давно не заходил на форум, не программировал очень давно, растерял со...

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

Точное срабатывание таймера в начале минуты
Здравствуйте, пишу программу на c# в ней возникла проблема: Есть таймер на форме Запускается...

Логическая функцая для проверки, предшествует ли время t1 времени t2
Дано время, описанное следующим образом: Type time=Record h:0..23; m,s:0..59 End; Напишите:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.