Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 10
1

Плавное перемещение по координатам

13.03.2019, 17:04. Показов 5955. Ответов 9

Author24 — интернет-сервис помощи студентам
Пытался симулировать физику, реализовывал падение с высоты. Столкнулся с тем, что при увеличении скорости объект телепортируется, а мне нужно, чтобы он просто быстрее перемещался, подскажите, как сделать

Добавлено через 1 минуту
Код, если нужно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (e.KeyData == Keys.Enter)
            {
                while(true)
                {
                    Thread.Sleep(100);
                    if (pictureBox1.Top < 1100)
                    {
                        SpeedY += g; // g - что-то вроде ускорение свободного падения
                        pictureBox1.Top += SpeedY;// Вертикальная скорость
                    }
                    else
                    {
                        SpeedY = 0;
                        pictureBox1.Top += SpeedY;
                        
                        break;
                    }
                }
                
            }
Добавлено через 42 секунды
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2019, 17:04
Ответы с готовыми решениями:

Как задать плавное перемещение картинки в PictureBox (или перемещение самого PictureBox) из точки А в точку Б по прямой?
Необходимо задать плавное перемещение по прямой линии из &quot;А&quot; в &quot;Б&quot; по нажатию &quot;Button&quot;

Плавное перемещение контролов
Создаю редактор классов. Таблица состоит из группы контролов (panel, textbox,label,button). Так же...

Плавное перемещение прямоугольника по PictureBox
Здравствуйте! У меня есть программа для работы с фотографией. Она вырезает фото с помощью...

Плавное перемещение картинки по форме
Как дописать код для плавного перемещения картинки ? Цикл в этом случае помог плохо. Код:...

9
548 / 479 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
13.03.2019, 17:14 2
Сначала нужно выучить основные законы физики и правильно определять скорость падения(не забывайте о времени)
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 10
13.03.2019, 17:41  [ТС] 3
Я понимаю, что возможно с точки зрения физики я делаю что-то не так, но с точки зрения программирования, как мне сделать плавное перемещение так, чтобы с "разной скоростью" оно происходило то быстрее, то медленнее

Добавлено через 24 минуты
Подправил код, добавил второй объект
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
 if (e.KeyData == Keys.Enter)
            {
                while(true)
                {
                    Thread.Sleep(100);
                    if (pictureBox2.Top < 1100)
                    {
                        SpeedYSecond += ((massSecond * g) - (fs * VSecond)) / massSecond;
                        pictureBox2.Top += SpeedYSecond;
                    }
                    else
                    {
                        break;
                    }
                    if (pictureBox1.Top < 1100)
                    {
                        SpeedYfirst += ((massfirst * g) - (fs * Vfirst)) / massfirst;
                        pictureBox1.Top += SpeedYfirst;
                    }
                    else
                    {
                        break;
                    }
                }
                
            }
0
548 / 479 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
13.03.2019, 17:53 4
Для этого удобно использовать Таймер, который меняя частоту срабатывания, может изменять и скорость перемещения объекта
1
13 / 11 / 2
Регистрация: 07.03.2019
Сообщений: 29
13.03.2019, 17:53 5
Не очень понятно, но тут уже подход не очень. Thread.Sleep(100) замораживает поток и никакие виндовые события не отрабатывают. Нужно сделать Timer с минимальным интервалом, и по событию Tick менять pictureBox1.Top.

Дополню. Timer.Tick может отрабатывать неравномерно, поэтому нужно запоминать время последнего вызова и пропорционально увеличивать сдвиг.
1
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,418
13.03.2019, 19:40 6
Лучший ответ Сообщение было отмечено LBw как решение

Решение

LBw, можно сделать так. Условно приравняйте 1 м/с к 1 пикс/сек.
Идеально гладко бегать шарик начинает к ~20 пикс/с. Если скорость меньше - увы, перемещать шарик меньше чем на пиксель не позволяют технологии
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
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true;
            TrackBar tr = new TrackBar() { Location = new Point(0, 0), Minimum = 1, Maximum = 100, Width = 200, Height = 60 };
            tr.ValueChanged += Tr_ValueChanged;
            this.Controls.Add(tr);
            Run();
        }
 
        private void Tr_ValueChanged(object sender, EventArgs e)
        {
            Speed = ((TrackBar)sender).Value;
        }
        private async void Run()
        {
            while (true)
            {
                X++;
                await Task.Delay(1000/Speed);
                Invalidate();
            }
        }
        int Speed = 1;
        int x;
        int X
        {
            get => x;
            set=> x = value > 300 ? 0 : value;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.FillEllipse(Brushes.Red, X, 100, 10, 10);
            e.Graphics.DrawString(Speed.ToString()+" pix/sec", new Font("Arial", 10, FontStyle.Regular), Brushes.Red, 10, 130);
        }
    }
Форма пустая
1
13 / 11 / 2
Регистрация: 07.03.2019
Сообщений: 29
13.03.2019, 19:47 7
FillEllipse вроде как может принимать float - можно и не попиксельно отображать.
1
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,418
13.03.2019, 19:59 8
xewelus, я имею ввиду на физическом уровне. Вот у меня на мониторе в ширину 1920 точек, т.е. 1920 положений шарика, как мне отобразить больше?) Ответ - никак
0
13 / 11 / 2
Регистрация: 07.03.2019
Сообщений: 29
13.03.2019, 20:22 9
Ну если задать нецелое число, то сработает сглаживание, так что движение будет выглядеть гораздо плавнее.

Добавлено через 1 минуту
И кстати для ускорения отображения полезно задавать в Invalidate нужный прямоугольник для перерисовки, чтобы не перерисовывался весь экран.

Добавлено через 20 минут
Ну и вот еще что стоит прописать, чтобы было по-взрослому:

C#
1
2
3
4
5
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.UpdateStyles();
А в методе Paint:

C#
1
2
3
                Graphics g = e.Graphics;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.CompositingQuality = CompositingQuality.HighQuality;
0
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,418
13.03.2019, 21:28 10
xewelus, ну вообще да, если инкременировать 0.1f и включить все настройки выглядит значительно лучше. Движется плавно.
0
13.03.2019, 21:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2019, 21:28
Помогаю со студенческими работами здесь

Плавное перемещение элемента с контрола на контрол
Есть panel1 и panel2, на panel1 есть button1. Нужно во время выполнения программы перенести...

Организовать плавное и медленное перемещение объекта
Как в данном случае организовать плавное и медленное перемещение объекта Picturebox2 с картинкой???...

Плавное перемещение (button) из FlowLayoutPanel1 в FlowLayoutPanel2
Здравствуйте уважаемы разработчики Столкнулся с одной проблемой в которой пока неполучается...

Как сделать плавное перемещение нарисованной фигуры по форме?
Здравствуйте, у меня есть задача: Передвижение фигур. Вообщем выполняю её так: создаю стартовую...

Запретить перемещение кнопок к указанным координатам
Всем привет! В моей программе некоторые кнопки могут двигаться. Как сделать что бы они могли...

Плавное перемещение картинок в форме
Привет всем форумчанам. Вобщем нужна помощь. Необходимо, чтоб при наведении на изображение мышью,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru