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

Добавить кнопку (барьер) для шарика

19.10.2015, 00:39. Показов 1610. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу в Windows Form. По экрану летает шарик. Нужно, чтобы по щёлчку мыши на экране появлялись барьеры(кнопки). Не понимаю как реализовать это.
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
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;
 
namespace Program1
{
    public partial class Form1 : Form
    {
        
        public List<Button> buttons=new List<Button>();
        private int xSpeed;
        private int ySpeed;
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true;
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer, true);
            ySpeed=3;
            xSpeed=3;
        }
            private void timeMoving_Tick(object sender, EventArgs e)
        {
            btnBall.Location = new System.Drawing.Point(btnBall.Location.X + xSpeed, btnBall.Location.Y + ySpeed);
            
            if (btnBall.Location.X >= 745) xSpeed = -2;
            if (btnBall.Location.X <= 1) xSpeed = 2;
            if (btnBall.Location.Y <= 0) ySpeed = 2;
            if (btnBall.Location.Y >= 524) ySpeed = -2;
            
            Invalidate();
        }
 
 
 
          
 
            private void Barrier(object sender, MouseEventArgs e)
            {
                Button btn = new Button();
                buttons.Add(btn);
                
                //buttons.Add(new Button();
                
                btn.Visible = true;
                btn.Location = MousePosition;
                btn.Size = new Size(50, 50);
                ////this.Controls.Add(Button),
                btn.BackColor = Color.Green;
         
                
            }
 
       
 
       
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2015, 00:39
Ответы с готовыми решениями:

Добавить элемент "барьер" в конец массива
Добрый вечер! Как в конец динамического массива добавить элемент х что вводит пользователь? Мне надо создать массив из n элементов,...

охранный ИК барьер периметра для сигнализации
Я хотел повторить вот такую схему http://www.mostirkit.ru/main/set.php?code_id=17593 Она мне необходини для охранной сигнализации...

Добавить кнопку для выбора exe файла
Столкнулся я с одной проблемой, у меня никак не хочет получатся. И так надеюсь вы мне поможете. Этот код запускает .exe но только в...

11
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.10.2015, 10:41
Лучший ответ Сообщение было отмечено Jokez как решение

Решение

Вот так к примеру, только вместо кнопок(хз зачем они тут) шарик рисованый:
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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication18
{
    public partial class Form1 : Form
    {
        List<IDrawable> drawList = new List<IDrawable>();
        Ball ball = new Ball(new Point(100, 150), 20);
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            foreach(var obj in drawList)
            {
                obj.Draw(e.Graphics);
            }
        }
        public Form1()
        {
            ball.movetimer.Tick += (s, e) =>
            {
                ball.InvalidatePosition(this.ClientRectangle, drawList);
                this.Invalidate(new Rectangle(ball.Rect.X - Math.Abs(ball.Speed_horizontal), ball.Rect.Y - Math.Abs(ball.Speed_vertical), ball.Rect.Width+ Math.Abs(ball.Speed_horizontal)*2, ball.Rect.Height+ Math.Abs(ball.Speed_vertical)*2));
            };
            drawList.Add(ball);
            InitializeComponent();
        }
 
        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            if (ball.Rect.Contains(e.Location))
            {
                Random r = new Random();
                Barrier bar;
                bool ok = true;
                do
                {
                    ok = true;
                    bar = new Barrier(new Rectangle(r.Next(0, this.ClientRectangle.Width), r.Next(0, this.ClientRectangle.Height), r.Next(10, 50), r.Next(10, 50)));
                    foreach(IDrawable obj in drawList) { if (obj.Rect.IntersectsWith(bar.Rect)) { ok = false; } }
                } while (!ok);
                drawList.Add(bar);
                this.Invalidate(bar.Rect);
            }
        }
    }
    interface IDrawable
    {
        Rectangle Rect { get; }
        void Draw(Graphics g);
    }
    class Ball : IDrawable
    {
        public int Speed_vertical=1;
        public int Speed_horizontal=1;
        public Timer movetimer = new Timer() { Interval = 20,Enabled=true};
        public Rectangle Rect { get; private set; }
        public Ball(Point location,int diametr)
        {
            this.Rect = new Rectangle(location, new Size(diametr, diametr));
        }
        public void Draw(Graphics g)
        {
            var brush = new SolidBrush(Color.Red);
            g.FillEllipse(Brushes.Red, Rect);
        }
        public void InvalidatePosition(Rectangle gamefield, List<IDrawable> barrlist)
        {
            if (Rect.Top <= gamefield.Top || Rect.Bottom >= gamefield.Bottom)
            {
                Speed_vertical = -Speed_vertical;
            }
            if (Rect.Left <= gamefield.Left || Rect.Right >= gamefield.Right)
            {
                Speed_horizontal = -Speed_horizontal;
            }
            foreach (IDrawable barr in barrlist)
            {
                if (barr == this) continue;
                if (Rect.IntersectsWith(barr.Rect))
                {
                    int count = 0;
                    for (int i = barr.Rect.Left; i < barr.Rect.Right; i++)
                    {
                        if (Rect.Contains(new Point(i, barr.Rect.Top)) || Rect.Contains(new Point(i, barr.Rect.Bottom)))
                        {
                            if (count < Math.Abs(Speed_vertical)) count++;
                            else {Speed_vertical = -Speed_vertical; count = 0; break;}
                        }
                    }
 
                    for (int i = barr.Rect.Top; i < barr.Rect.Bottom; i++)
                    {
                        if (Rect.Contains(new Point(barr.Rect.Left, i)) || Rect.Contains(new Point(barr.Rect.Right, i)))
                        {
                            if (count < Math.Abs(Speed_horizontal)) count++;
                            else {Speed_horizontal = -Speed_horizontal; break;}
                        }
                    }
                }
            }
            Rect = new Rectangle(new Point(Rect.X + Speed_horizontal, Rect.Y + Speed_vertical), Rect.Size);
        }
        private void DetectIntersections(Rectangle targetrect)
        {
 
        }
    }
 
    class Barrier : IDrawable
    {
        public Rectangle Rect { get; private set; }
        public Barrier(Rectangle rect)
        {
            Rect = rect;
        }
 
        public void Draw(Graphics g)
        {
            var brush = new SolidBrush(Color.Black);
            g.FillRectangle(Brushes.Blue, Rect);
        }
    }
}
Добавлено через 1 минуту
Тыкаете на шарик-появляются барьеры в случайном месте.
0
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 54
19.10.2015, 16:50  [ТС]
Ваш код сложен

C#
1
2
3
4
5
6
7
8
9
10
 private void Barrier(object sender, MouseEventArgs e)
            {
 
 
                do
                {
                    bar.Add(
                     new System.Drawing.Rectangle(MousePosition.X, MousePosition.Y, 50, 50));
                    
                } while (e.X >= 40 && e.X <= 244);
Да, кнопки тут ни к чему. Сразу надо рисовать прямоугольники. Теперь проблема, что их не видно(или они не создаются?). начинаю тыкать по экрану и в один момент происходит ошибка переполнения.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.10.2015, 17:14
Цитата Сообщение от Jokez Посмотреть сообщение
Ваш код сложен
Как раз таки мой код примитивен, совсем в 2 строки это сделать не получится. Если что непонятно-задавайте конкретные вопросы.
Цитата Сообщение от Jokez Посмотреть сообщение
Теперь проблема, что их не видно(или они не создаются?). начинаю тыкать по экрану и в один момент происходит ошибка переполнения.
Данный кусок кода вообще ни о чем не говорит. В какой-то массив в цикле добавляются какие-то прямоугольники. Причем цикл бесконечен пока мышь не движется, а соответственно все зависнет и потом вылетит с эксепшеном.
0
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 54
19.10.2015, 17:24  [ТС]
Точно, цикл бесконечный.. Вставлял условие, чтобы проверить работу

Но почему даже, если они добавляются их не видно на экране? Как реализовать, чтобы было видно, с шариком же прокатило создание из пары строк.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.10.2015, 17:41
Цитата Сообщение от Jokez Посмотреть сообщение
Но почему даже, если они добавляются их не видно на экране? Как реализовать, чтобы было видно, с шариком же прокатило создание из пары строк.
А с каких делов он должен там появиться, если в коде нигде не сказано ничего на эту тему Гляньте мой код, отрисовка идет на объекте Graphics формы, в переопределенном методе OnPaint.
Цитата Сообщение от Jokez Посмотреть сообщение
с шариком же прокатило создание из пары строк.
Шарика не заметил, заметил только кнопку, стандартная отрисовка которой уже описана в ее событии майкрофтом, а вот если вы хотите свой шарик нарисовать, то это надо делать как указано выше. Кроме того ваш код вообще практически ничего не делал-кнопка просто двигалась вниз и все. А шарик должен, очевидно, отскакивать от препятствий и стенок формы.
0
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 54
19.10.2015, 17:50  [ТС]
Мой шарик отскакивает от стенок)

Значит можно обойтись без rectangle и создавать кнопки.
Только как сделать цикл добавления этих кнопок по щелчку на экран - я не дорубаю.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.10.2015, 18:01
Цитата Сообщение от Jokez Посмотреть сообщение
Значит можно обойтись без rectangle и создавать кнопки.
Только как сделать цикл добавления этих кнопок по щелчку на экран - я не дорубаю.
Зачем извращаться? Так трудно преопределить метод OnPaint? Тем более что готовый код лежит выше, а отскакивание от препятствий вам так или иначе придется делать, так или иначе придется определять, с какой стороны прилетел шарик и тд. По уму тут, конечно, физика должна быть сложнее, в моем коде самая примитивная.
Цитата Сообщение от Jokez Посмотреть сообщение
Мой шарик отскакивает от стенок)
Стоит чуть сменить размер формы-уже нет.
0
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 54
20.10.2015, 17:34  [ТС]
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
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;
 
namespace Program1
{
    public partial class Form1 : Form
    {
        List<IDrawable> drawList = new List<IDrawable>();
        
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            foreach (var obj in drawList)
            {
                obj.Draw(e.Graphics);
            }
        }
 
        private static int xSpeed=3;
        private static int ySpeed=3;
        public Form1()
        {
            InitializeComponent();
            DoubleBuffered = true;
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer, true);
            ySpeed = 3;
            xSpeed = 3;
            
        }
        private void timeMoving_Tick(object sender, EventArgs e)
        {
            btnBall.Location = new System.Drawing.Point(btnBall.Location.X + xSpeed, btnBall.Location.Y + ySpeed);
            if (btnBall.Location.X >= 745) xSpeed = -2;
            if (btnBall.Location.X <= 1) xSpeed = 2;
            if (btnBall.Location.Y <= 0) ySpeed = 2;
            if (btnBall.Location.Y >= 524) ySpeed = -2;
 
            Invalidate();
        }
 
        
 
        interface IDrawable
        {
            Rectangle Rect { get; }
            void Draw(Graphics e);
        }
 
        
 
        class Barrier : IDrawable
        {
            public Rectangle Rect { get; private set; }
            public Barrier(Rectangle rect)
            { Rect = rect; }
            public void Draw(Graphics e)
            {
 
                e.FillRectangle(Brushes.Green, Rect);
            }
            
            
        }
 
        private void MouseClick_bar(object sender, MouseEventArgs e)
        {
 
 
            Barrier bar;
            bool ok = true;
            do
            {
                ok = true;
                bar = new Barrier(new Rectangle(MousePosition.X, MousePosition.Y, 40, 40));
                
                foreach (IDrawable obj in drawList)
                {
                   
                    if (obj.Rect.IntersectsWith(bar.Rect)) { ok = false; } }
 
            } while (!ok);
            drawList.Add(bar);
           
 
            this.Invalidate(bar.Rect);
 
           
            
        }
    }
}
Переделал частично по вашему коду. Теперь хотя бы появляются эти барьеры. Проблема с реализацией отталкивания от них. Можно ли используя мой код это сделать? Шарик у меня создаётся в конструкторе - овалом.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
20.10.2015, 19:42
Ну в моем коде все это реализовано-а вы взяли и вырезали Естественно, работать оно не будет.

Добавлено через 2 минуты
И не надо тут ничего создавать в конструкторе-такие вещи в нем не делаются
0
1 / 1 / 0
Регистрация: 07.12.2014
Сообщений: 54
28.10.2015, 14:43  [ТС]
C#
1
2
3
4
5
ball.movetimer.Tick += (s, e) =>
            {
                ball.InvalidatePosition(this.ClientRectangle, drawList);
                this.Invalidate(new Rectangle(ball.Rect.X - Math.Abs(ball.Speed_horizontal), ball.Rect.Y - Math.Abs(ball.Speed_vertical), ball.Rect.Width + Math.Abs(ball.Speed_horizontal) * 2, ball.Rect.Height + Math.Abs(ball.Speed_vertical) * 2));
            };
Будьте добры, объясните эту часть кода

C#
1
if (barr == this) continue;
C#
1
for (int i = barr.Rect.Left; i < barr.Rect.Right; i++)
И это для чего?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
28.10.2015, 15:57
C#
1
2
3
4
5
ball.movetimer.Tick += (s, e) => 
            {
                ball.InvalidatePosition(this.ClientRectangle, drawList);
                this.Invalidate(new Rectangle(ball.Rect.X - Math.Abs(ball.Speed_horizontal), ball.Rect.Y - Math.Abs(ball.Speed_vertical), ball.Rect.Width + Math.Abs(ball.Speed_horizontal) * 2, ball.Rect.Height + Math.Abs(ball.Speed_vertical) * 2));
            };
Это обработчик события Tick таймера, который отвечает за движение мяча. Сначала вычисляется его новая позиция(ball.InvalidatePosition), потом перерисовывается та часть формы, на которой отображен мяч(this.Invalidate).
C#
1
if (barr == this) continue;
Поскольку массив объектов, который подается в метод, содержит и сам мяч, то нужна эта проверка, дабы он не пытался отскакивать от самого себя.
Цитата Сообщение от Jokez Посмотреть сообщение
for (int i = barr.Rect.Left; i < barr.Rect.Right; i++)
Это из кода, который проверяет столкновение мяча с другим объектом. Этот цикл проходится по точкам границы объекта и проверяет, не задевает ли их мяч. Если задевает-то он должен отскочить в нужную сторону, в зависимости от того, какая граница задета.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2015, 15:57
Помогаю со студенческими работами здесь

Arkanoid, добавить отскок шарика от линии
Есть вот такой код https://jsfiddle.net/22L757rm/1/. Как сделать что бы шарик отлетал от линии? &lt;div id=&quot;pole&quot;&gt; ...

Потенциальный барьер в нормальном активном режиме для транзистора
Объясните пожалуйста, как будет выглядеть график потенциального барьера в нормальном активном режиме работы биполярного транзистора

Уравнение Шредингера для частицы в потенциальном ящике. Потенциальный барьер
Всем доброго времени суток! Помогите разобраться, т.к. физика не мой конек:( Кинетическая энергия электрона в два раза превышает...

В существующее приложение на access добавить кнопку на форму для добавления данных
Добрый день! Имеется написанное не мной приложение на access с БД. Необходимо на форму добавить кнопку при нажатии на которую...

Как добавить кнопку для запуска приложения от root на панель Unity Launcher?
Как добавить кнопку для запуска приложения от root на панель Unity Launcher???


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru