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

PictureBox почему-то ускоряет движение

23.10.2013, 21:38. Показов 1083. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал проект, в котором при нажатии клавиши 'w' создается и двигается PictureBox по форме. Движение реализовано с помощью таймера. При нажатии клавиши 'r' пропадает изображение и PictureBox должен возвращаться на прежнюю позицию. При повторном нажатии 'w' PictureBox снова должен появляться и начинать движение. Проблема в том, что при каждом нажатии 'w' 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
public class Bullet : System.Windows.Forms.Control
    {
        int y = 300;
 
        public void CreateBullet(Form fm)
        {
            if (AbstractClass.keyPress == 'w')
            {
                AbstractClass.bullet.Location = new System.Drawing.Point(300, y);
                AbstractClass.bullet.Size = new System.Drawing.Size(8, 8);
                AbstractClass.bullet.TabIndex = 0;
                AbstractClass.bullet.Load("UpBullet.bmp");
                AbstractClass.bullet.Parent = fm;
                BulletFly();
            }
 
            if (AbstractClass.keyPress == 'r')
            {
                y = 300;
                BulletDestroy();
            }
        }
 
        private void BulletFly()
        {
            AbstractClass.timer.Tick += new EventHandler(timer_Tick);
            AbstractClass.timer.Interval = 50;
            AbstractClass.timer.Enabled = true;
        }
 
        private void timer_Tick(object sender, EventArgs e)
        {
            y++;
            AbstractClass.bullet.Location = new System.Drawing.Point(300, y);
        }
 
        private void BulletDestroy()
        {
            AbstractClass.bullet.Image = null;
            AbstractClass.timer.Enabled = false;
            AbstractClass.timer.Dispose();
        }
    }

Код Form1:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            AbstractClass.keyPress = e.KeyChar;
 
            Controls.Add(AbstractClass.pict);
            AbstractClass.pict.CreateBullet(this);
        }
    }

Заранее благодарен!
Вложения
Тип файла: zip BulletFly.zip (174.6 Кб, 6 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2013, 21:38
Ответы с готовыми решениями:

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

Движение PictureBox
Необходимо, чтобы picturebox двигался вверх, пока не достигнет определенной координаты, и...

Движение pictureBox по форме
добрый день, хотелось бы узнать, как реализовать движение pictureBox по форме? private...

Движение PictureBox по оси X
Как реализовать движение Picture box за курсором только по оси X ?

2
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
24.10.2013, 10:33 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void CreateBullet(Form fm)
        {
            if (AbstractClass.keyPress == 'w')
            {
                if(AbstractClass.bullet.Image == nul)
                {
                AbstractClass.bullet.Location = new System.Drawing.Point(300, y);
                AbstractClass.bullet.Size = new System.Drawing.Size(8, 8);
                AbstractClass.bullet.TabIndex = 0;
                AbstractClass.bullet.Load("UpBullet.bmp");
                AbstractClass.bullet.Parent = fm;
                BulletFly();
            }
            }
...
или так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
         
public void CreateBullet(Form fm)
        {
            if (AbstractClass.keyPress == 'w')
            {
                if(!AbstractClass.timer.Enabled)
                {
                AbstractClass.bullet.Location = new System.Drawing.Point(300, y);
                AbstractClass.bullet.Size = new System.Drawing.Size(8, 8);
                AbstractClass.bullet.TabIndex = 0;
                AbstractClass.bullet.Load("UpBullet.bmp");
                AbstractClass.bullet.Parent = fm;
                BulletFly();
            }
            }
...
и вообще, если вызываешь timer.Dispose() при BulletDestroy(), то наверное его желательно пересоздать, до того как использовать заново?

C#
1
2
3
4
5
6
7
private void BulletFly()
        {
            AbstractClass.timer = new неведомое.пространство.имён.Timer()
            AbstractClass.timer.Tick += new EventHandler(timer_Tick);
            AbstractClass.timer.Interval = 50;
            AbstractClass.timer.Enabled = true;
        }
1
38 / 13 / 6
Регистрация: 12.06.2013
Сообщений: 24
24.10.2013, 11:11  [ТС] 3
timer.Dispose() убрал, ибо никакого эффекта от него не увидел (кстати, кто сможет объяснить почему?)
Ускорятся перестал после следующей модификации метода BulletFly():
Кликните здесь для просмотра всего текста
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
public class Bullet : System.Windows.Forms.Control
    {
        int y = 300;
        int count = 0;
 
        public void CreateBullet(Form fm)
        {
            if ((AbstractClass.keyPress == 'w') && (AbstractClass.timer.Enabled == false))
            {
                AbstractClass.bullet.Location = new System.Drawing.Point(300, y);
                AbstractClass.bullet.Size = new System.Drawing.Size(8, 8);
                AbstractClass.bullet.TabIndex = 0;
                AbstractClass.bullet.Load("UpBullet.bmp");
                AbstractClass.bullet.Parent = fm;
                BulletFly();
            }
 
            if (AbstractClass.keyPress == 'r')
            {
                y = 300;
                BulletDestroy();
            }
        }
 
        private void BulletFly()
        {
            if (count == 0)
            {
                AbstractClass.timer.Tick += new EventHandler(timer_Tick);
                AbstractClass.timer.Interval = 50;
            }
            count++;
            AbstractClass.timer.Enabled = true;
        }
 
        private void timer_Tick(object sender, EventArgs e)
        {
            y++;
            AbstractClass.bullet.Location = new System.Drawing.Point(300, y);
        }
 
        private void BulletDestroy()
        {
            AbstractClass.bullet.Image = null;
            AbstractClass.timer.Enabled = false;
            Controls.Remove(AbstractClass.bullet);
        }
    }

Похоже, с каждым вызовом метода BulletFly() добавлялся еще один обработчик события timer.Tick и именно поэтому шло ускорение
0
24.10.2013, 11:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2013, 11:11
Помогаю со студенческими работами здесь

Движение pictureBox за курсором
Здравствуйте, нужна ваша помочь. Что мне нужно: Мне нужно что бы за месть курсора на форме была...

Движение шаров в picturebox
При нажатии на кнопку в пикчербоксе должны начать двигаться шары. Программа запускается но при...

Движение картинки pictureBox кнопками
Доброго дня суток!Прошу вашей помощи, вот накодил, но картинка не двигается.В чем у меня...

Генерация picturebox'ов-пулек и их движение
Имеется игра, в которой при нажатии пробела происходит "выстрел" imageBox'ом, но возникла проблема...


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

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