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

Плавное передвижение picturebox

20.12.2016, 08:11. Показов 3306. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, проблема такая, picturebox'ы очень плохо перемещаются, изображения в них высокого разрешения. Помогите реализовать плавное движение пиечебоксов.

Код программы
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading; //Именно это пространство имен поддерживает многопоточность
 
namespace lab8
{
    public partial class Form1 : Form
    {
        //Graphics g = CreateGraphics();
        string winer;
        public bool enab = true, st = false, pr = false;
        Random random;
        Thread[] threads;
        object sync;
        int z = 5, q = 0;
        int stop = 1295;
        DateTime dt;
 
        public Form1()
        {
            InitializeComponent();
            random = new Random();
            sync = new object();
 
            threads = new Thread[]
            {
                new Thread(new ParameterizedThreadStart(Movement)) { IsBackground = true },
                new Thread(new ParameterizedThreadStart(Movement)) { IsBackground = true },
                new Thread(new ParameterizedThreadStart(Movement)) { IsBackground = true }
            };
        }
        private void button1_Click(object sender, EventArgs e)
        {
            /*st1.Visible = true;
            Thread.Sleep(1000);
            st1.Visible = false;
            st2.Visible = true;
            Thread.Sleep(1000);
            st2.Visible = false;*/
            label1.Text = "";
            q = 0;
            stop = 1295;
            if (st == false)
            {
                PictureBox[] pbs = { pictureBox1, pictureBox3, pictureBox5 };
                pictureBox1.Left = 5;
                pictureBox3.Left = 5;
                pictureBox5.Left = 5;
                dt = DateTime.Now;
                for (int i = 0; i < threads.Length; i++)
                {
                    threads[i].Start(pbs[i]);
                }
                //button1.Enabled = false;
                button2.Enabled = true;
                st = true;
            }
            else
            {
                pictureBox1.Left = 5;
                pictureBox3.Left = 5;
                pictureBox5.Left = 5;
                dt = DateTime.Now;
                for (int i = 0; i < threads.Length; i++)
                {
                    try
                    {
                        threads[i].Suspend();
                    }
                    catch { }
                }
                for (int i = 0; i < threads.Length; i++)
                {
                    threads[i].Resume();
                }
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            q = 0;
            int mx = 1;
            if (pictureBox1.Left > mx) { mx = pictureBox1.Left; }
            if (pictureBox3.Left > mx) { mx = pictureBox3.Left; }
            if (pictureBox5.Left > mx) { mx = pictureBox5.Left; }
            stop = mx;
            label1.Text = winer;
        }
        void Movement(object picturebox)
        {
            int x = 8;
            PictureBox pb = (PictureBox)picturebox;
            while (true)
            {
                Thread.Sleep(x);  // задержка потока повремени
                int offset = 0;
                offset = random.Next(2, 4);
                pb.BeginInvoke(new Action(delegate
                {
                    pb.Left += offset;
                    //this.Refresh();
                }));
                if ((pb.Left >= stop) && (q == 0))
                {
                    q = 1;
                    z = Convert.ToInt32(pb.Tag) + 1;
                    TimeSpan vr1 = DateTime.Now - dt;
                    winer = ("Победил игрок №" + z.ToString() + "\n" + "Время - " + vr1.Seconds + "." + vr1.Milliseconds.ToString().PadLeft(3, '0') + "\n");
 
                    for (int i = 0; i < threads.Length; i++)
                        if (threads[i].ManagedThreadId != Thread.CurrentThread.ManagedThreadId)
                        {
                            threads[i].Suspend();
                        }
                    Thread.CurrentThread.Suspend();
                }
            }
        }  
    }
 
}


Добавлено через 1 час 56 минут
Подскажите в чем проблема? при нажатии кнопки старт из за того что форма имеет backgroundimage некорректно работают потоки и форма перекрывает picturebox с машинами
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2016, 08:11
Ответы с готовыми решениями:

AnimateWindow Плавное передвижение при клике
Не могу сделать плавное появление при нажатие на кнопки, должно появиться окошко GroupBox (их...

Передвижение PictureBox
Есть pictureBox1, на нем pictureBox2 и pictureBox3 . по событию mauseDown pictureBox2 , в...

Передвижение картинки по PictureBox
пробую работать с графикой. следующая задача: в picturebox поместил изображение- карта России....

Передвижение Picturebox-ов по клику
У меня на форме есть 36 Picturebox-в. При нажатии на один из них, должны передвигаться по X и Y(в...

7
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
20.12.2016, 09:53 2
sp70, опишите задачу словами, возможно у Вас подход не верный.
0
309 / 317 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
20.12.2016, 12:57 3
sp70, Пикчурбокс предназначен для другого. Рисуйте картинку на форме или контроле по заданным координатам.
0
548 / 479 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
20.12.2016, 13:09 4
Для перемещеия пикчербоксов использую таймер (очень удобно для анимационной картинки)
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
20.12.2016, 14:08 5
Цитата Сообщение от zna926 Посмотреть сообщение
Для перемещеия пикчербоксов использую таймер (очень удобно для анимационной картинки)
Это иллюзия удобства рисуйте как советует sldp,
0
548 / 479 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
20.12.2016, 15:40 6
Sanya Sa. Думаю, Вы ошибаетесь.
рикчербокс движется, не оставляя следов, а картинка на форме?
0
911 / 815 / 333
Регистрация: 03.02.2015
Сообщений: 5,265
Записей в блоге: 9
20.12.2016, 15:44 7
zna926, ну хз - Вам решать. Все рвно рано или поздно придете к вот этому Архитектура ПО в WinForms (FAQ & HowTo)
0
309 / 317 / 119
Регистрация: 29.10.2011
Сообщений: 1,006
20.12.2016, 17:41 8
Цитата Сообщение от zna926 Посмотреть сообщение
рикчербокс движется, не оставляя следов, а картинка на форме?
картинка также будет перерисовываться при каждом обновлении того, на чем вы ее рисовали.

zna926, Просто пикчурбокс, как и другие контролы, тяжеловесный. "Тягать" его не лучший вариант. Да и предназначен он для другого. Если вам нужно сделать просто анимацию передвижения, например, шарика, то ок. Но стоит сделать шаг влево, шаг вправо, то сразу начнутся проблемы. И допустим примитивно подобие игры теннис у вас получиться реализовать перемещая контролы, но уже с арканоидом возникнут проблемы. По этому, чтоб не тратить попросту свое время, то лучше начать с правильно архитектуры, как советовали выше. Ибо мы не пикчурбокс должны передвигать или еще что-то. Мы должны двигать объекты. Шарики, например. Сталкивать их между собой и т.п.. А в графическом интерфейсе просто выводить их состояние. По этому нельзя делать движение объектов смещая их на константу по координатам. Потому что при разной частоте кадров скорость движения будет разная, а такого нельзя допустить(если игра не тянет, то она не слоумо идет, а рывками). Надо просто вспомнить физику и рассчитывать расстояние исходя и скорости и времени между кадрами.
0
20.12.2016, 17:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2016, 17:41
Помогаю со студенческими работами здесь

Передвижение PictureBox по форме курсором
Здравствуйте. Как можно перемещать курсором picturebox по форме?

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

Передвижение объекта по pictureBox клавиатурой
Приветствую! Столкнулся с проблемой,не могу двигать нарисованный мною квадрат по...

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


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

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