Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
raybred
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 11
1

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

27.07.2017, 19:50. Просмотров 833. Ответов 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
Ответы с готовыми решениями:

Timer
Народ, подскажите пожалуйста как с использованием таймера сделать так, чтобы...

Timer
Нужно сделать таймер... есть System.Timers.Timer , пробовал его заставить...

Timer + IO
Есть такой код, который падает с эксепшеном: Что не так? Падает, когда я...

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

Работа с timer
Не понимаю почему после каждого нажатия кнопки button1, интервал между...

13
proghelp4you
58 / 58 / 34
Регистрация: 09.07.2017
Сообщений: 475
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 / 34
Регистрация: 09.07.2017
Сообщений: 475
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 / 34
Регистрация: 09.07.2017
Сообщений: 475
27.07.2017, 22:17 6
Лучший ответ Сообщение было отмечено raybred как решение

Решение

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
98 / 102 / 62
Регистрация: 19.11.2015
Сообщений: 380
Завершенные тесты: 3
27.07.2017, 22:37 8
RenderingTimer - это твой таймер
1
proghelp4you
58 / 58 / 34
Регистрация: 09.07.2017
Сообщений: 475
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 / 34
Регистрация: 09.07.2017
Сообщений: 475
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 / 34
Регистрация: 09.07.2017
Сообщений: 475
27.07.2017, 23:40 13
Лучший ответ Сообщение было отмечено raybred как решение

Решение

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

Progressbar and timer
всем привет...такои вопрос не могу решитъ...как заставити загрузится в течение...

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

c# Timer и другое
Есть приложение, в котором 100 тыс миллионов кнопок. Практически каждая кнопка...


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

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

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