Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
raybred
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
#1

Не получается победить Timer - C#/.NET 4.x

27.07.2017, 19:50. Просмотров 190. Ответов 13
Метки нет (Все метки)

Заставил эллипс бегать к точке клика мыши, но вот остановить его движение - никак не получается.
Все варианты, типа "Timer.Stop()" и "Timer.Enable = false" перепробовал.. эллипс не поддаётся.
Доходя до нужной точки он трясётся как руки алкаша. Как заставить его замереть?

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
using System;
 
namespace MouseMove
{
    public partial class Form1 : Form
    {
        double _x; //координаты эллипса  
        double _y; //координаты эллипса
        double xM; //координаты мыши 
        double yM; //координаты мыши 
        double angle; //угол поворота
        double speed; //скорость движения
             
        public Form1()
        {
            InitializeComponent();
            _x = 50;
            _y = 50;
            angle = 0;
            speed = 30;            
        }
 
        //Ищем угол между координатами сферы и курсора мыши
        double GetAngle()
        {
            return Math.Atan2((_x - xM), (_y - yM));            
        }
               
        public void Form1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.FillEllipse(Brushes.Black, (int)_x, (int)_y, 100, 100); //рисуем эллипс
            e.Graphics.SmoothingMode =  System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //сглаживаем движение 
        }
 
        //Таймер 
        public void tmrMoving_Tick(object sender, EventArgs e) 
        {
                _x -= speed * Math.Sin(angle);
                _y -= speed * Math.Cos(angle);
                angle = GetAngle();
                Invalidate();            
        }
      
        //Событие Клик Мыши
        public void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            tmrMoving.Enabled = true;
           
                xM = e.X;
                yM = e.Y;
                        
            // Проверка не получается
           // if (GetAngle() == 0) { tmrMoving.Enabled = false; }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2017, 19:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос .NET 4.x Не получается победить Timer (C#):

Timer - C#
Нужно сделать таймер... есть System.Timers.Timer , пробовал его заставить работать.. всё не пойму как. Смотрел на этом форуме уже не один...

Timer - C#
Народ, подскажите пожалуйста как с использованием таймера сделать так, чтобы при нажатии на кнопку ее функция выполнялась с задержкой на 7...

Timer + IO - C#
Есть такой код, который падает с эксепшеном: Что не так? Падает, когда я использую таймер или поток. Без них работает. ...

Progressbar and timer - C#
всем привет...такои вопрос не могу решитъ...как заставити загрузится в течение часа....или там определёного времени... мне нужно штобы он...

Tasks/timer - C#
Есть несколько операций такого типа new Thread(() => { for (;;) { Thread.Sleep(111); ...

Работа с timer - C#
Не понимаю почему после каждого нажатия кнопки button1, интервал между событиями Tick сокращается. int b = 0; private void...

13
proghelp4you
58 / 58 / 28
Регистрация: 09.07.2017
Сообщений: 317
27.07.2017, 20:11 #2
raybred, у вас проверка стоит только при нажатии мышкой на форму, если она не срабатывает, то таймер работает бесконечно. В данном случаем в событии таймера Tick нужно прописать условие окончания движения, в котором как раз и будет остановка таймера.
1
raybred
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
27.07.2017, 20:24  [ТС] #3
В том то и дело, что я перепробовал все известные мне варианты, прописать условие не получилось.

Добавлено через 10 минут
Вот как выглядит анимация сейчас

http://gifok.net/image/83Tp
0
proghelp4you
58 / 58 / 28
Регистрация: 09.07.2017
Сообщений: 317
27.07.2017, 20:42 #4
raybred, а фигура должна двигаться по окружности?
1
raybred
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
27.07.2017, 22:00  [ТС] #5
Нет, она должна просто передвинуться к месту клика.
Предполагаю, что у меня шалит метод GetAngle(), но утихомирить его не получается...
0
proghelp4you
58 / 58 / 28
Регистрация: 09.07.2017
Сообщений: 317
27.07.2017, 22:17 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
raybred,
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
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
 
namespace WindowsFormsApplication
{
    public partial class MainForm : Form
    {
        private double userPointXCoordinate;
        private double userPointYCoordinate;
        private double circleXCoordinate;
        private double circleYCoordinate;
        private int circleRadius;
        private int stepsNumber;
        private double xOffset;
        private double yOffset;
 
        public MainForm()
        {
            circleXCoordinate = 0;
            circleYCoordinate = 0;
            stepsNumber = 10;
            circleRadius = 50;
 
            InitializeComponent();
        }
 
        public void MainForm_MouseClick(object sender, MouseEventArgs e)
        {
            userPointXCoordinate = e.X;
            userPointYCoordinate = e.Y;
            xOffset = (userPointXCoordinate - circleXCoordinate - circleRadius)/stepsNumber;
            yOffset = (userPointYCoordinate - circleYCoordinate - circleRadius)/stepsNumber;
 
            RenderingTimer.Enabled = true;
        }
 
        public void RenderingTimer_Tick(object sender, EventArgs e)
        {
            circleXCoordinate += xOffset;
            circleYCoordinate += yOffset;
 
            Invalidate();
 
            if (Math.Pow(userPointXCoordinate - circleXCoordinate - circleRadius, 2) + Math.Pow(userPointYCoordinate - circleYCoordinate - circleRadius, 2) <= Math.Pow(circleRadius, 2))
                RenderingTimer.Stop();
        }
 
        public void MainForm_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            e.Graphics.FillEllipse(Brushes.Black, (int)circleXCoordinate, (int)circleYCoordinate, 2*circleRadius, 2*circleRadius);
        }
    }
}
1
raybred
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
27.07.2017, 22:35  [ТС] #7
Потрясающе, спасибо!
Могу я попросить вас прислать проект - у меня проблема с RenderingTimer - помечает как ошибку..
Спасибо!!
0
1231231ghacking
97 / 101 / 38
Регистрация: 19.11.2015
Сообщений: 380
Завершенные тесты: 3
27.07.2017, 22:37 #8
RenderingTimer - это твой таймер
1
proghelp4you
58 / 58 / 28
Регистрация: 09.07.2017
Сообщений: 317
27.07.2017, 22:59 #9
raybred, да, это таймер, который расположен на форме.
0
raybred
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
27.07.2017, 23:04  [ТС] #10
С таймером разобрался, надо было всего лишь его добавить на поле.
Всё проинициализировалось, но теперь ругается на пути.. Буду разбираться

Не получается победить Timer

Добавлено через 3 минуты
Нашел, надо было в program.cs Form1 заменить на
C#
1
Application.Run(new MainForm());
Программа запускается, но эллипса не видно
0
proghelp4you
58 / 58 / 28
Регистрация: 09.07.2017
Сообщений: 317
27.07.2017, 23:08 #11
raybred, вот, это код для дизайнера формы:
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
namespace WindowsFormsApplication
{
    partial class MainForm
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.RenderingTimer = new System.Windows.Forms.Timer(this.components);
            this.SuspendLayout();
            // 
            // RenderingTimer
            // 
            this.RenderingTimer.Interval = 200;
            this.RenderingTimer.Tick += new System.EventHandler(this.RenderingTimer_Tick);
            // 
            // MainForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.DoubleBuffered = true;
            this.Name = "MainForm";
            this.Text = "Form";
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.MainForm_Paint);
            this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseClick);
            this.ResumeLayout(false);
        }
        #endregion
 
        private System.Windows.Forms.Timer RenderingTimer;
    }
}
1
raybred
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
27.07.2017, 23:32  [ТС] #12
Сверил и подправил.

Выдаёт теперь вот это:
The program '[21616] WindowsFormsApplication.exe: Program Trace' has exited with code 0 (0x0).
The program '[21616] WindowsFormsApplication.exe' has exited with code -1 (0xffffffff).

При этом нигде никаких противоречий не видит, ох..
Завтра попробую перенабрать самостоятельно весь код.
В любом случае спасибо за неоценимую помощь!
0
proghelp4you
58 / 58 / 28
Регистрация: 09.07.2017
Сообщений: 317
27.07.2017, 23:40 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
raybred, вот проект
1
Вложения
Тип файла: rar WindowsFormsApplication.rar (17.8 Кб, 1 просмотров)
raybred
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
27.07.2017, 23:40  [ТС] #14
Нашел баг...
Окно предыдущей компиляции висело. Надо же...
Всё работает, спасибо огромное за помощь!
0
27.07.2017, 23:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2017, 23:40
Привет! Вот еще темы с ответами:

timer и checkBox - C#
У меня простая задачка, но немогу справится из за ошибок. На форме один checkBox и txtBox. Если ставлю галочку то в поле должно отображатся...

.NET 4.x Пауза Timer - C#
В таймере есть несколько строчек кода. Как сделать что бы после выполнения первой строки он ждал 2 секунды. выполнял вторую ждал 2 секунды...

Threads + Timer - C#
у меня стоит задача выполнять какие-то действия в нескольких потока с какой-то периодичностью весь код я свел просто к модели дабы не...

c# Timer и другое - C#
Есть приложение, в котором 100 тыс миллионов кнопок. Практически каждая кнопка выполняет функцию загрузки какого-либо приложения: ...


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

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

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