Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 15

Как заставить шарик двигаться используя цикл?

22.07.2015, 19:01. Показов 7091. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем дня.
Есть прога которая рисует круг при нажатии мышки и теперь мне нужно заставить этот круг двигатся и отбиватся от краев.Это нужно зделать с помощью цыкла(или цыклов).Только я вот не понимаю какой и как цыкл здесь задействовать .
Вот часть кода где я описываю панельку где рисую круг и событие(нажатие мышки) при котором появляется круг.
Если нужно будет скину весь код.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pan = new Panel() {
            
            public void paint(Graphics g) {
                
    Color newColor = new Color((int) (Math.random() * 255), (int) (Math.random() * 255),(int) (Math.random() * 255));
                    g.setColor(newColor);
                    g.fillOval(X, Y, r, r);
                            
            }   
        };
          pan.addMouseListener(new MouseAdapter() {
                
                public void mousePressed(MouseEvent e) {
                    
                
                    r = 70;
                    X = e.getX() - r / 2;
                    Y = e.getY() - r / 2;
                    pan.repaint();
                }
            });
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2015, 19:01
Ответы с готовыми решениями:

Как заставить двигаться шарик?
Я создаю на форме шарики, и мне нужно заставить их двигаться, как это сделать??

Как заставить шарик двигаться по правильной траектории?
Здравствуйте!Препод сказал,что шарик летает неправильно,подскажите,что не так....

Как заставить шарик двигаться по экрану, как в невесомости?
Здравствуйте таварищи програмисты, у меня возникла идея написать прогу что бы шарик двигался по экрану как в невесомости т.е шарик должен...

6
126 / 113 / 56
Регистрация: 05.12.2012
Сообщений: 463
23.07.2015, 00:41
Не совсем понятно, по какому принципу должен двигаться Ваш круг? Хаотично? Рисоваться ровно за стрелке? Как Вы выбираете направление? (с последним есть готовое решение, правда на JS, сам недавно баловался, там моя голова за мышкой ползает и крутится )
А вообще, если вы будете делать циклом, то, вероятно, нужно будет делать задержку итераций цикла, останавливая поток (Thread.sleep(100500), что бы шарик перемешался не "почти моментально", что не есть хорошо, на мой взгляд. А если без задержки делать, то, мне кажется, картинка отрисовывается медленнее, чем идут итерации цикла. Советую вам делать движения таймером, в стандартных библиотеках есть их как минимум два разных, вроде в util и еще где-то, в awt мб...

Опишите Ваше движение шарика подробнее и найдем нужное решение

Добавлено через 11 минут
Вспомнил! Еще когда-то давно написал мини игру на джаве (не помню как ее называют), там две полосочки шарик отбивают. Игра человек-компьютер. Там тоже движения шарика прописывал, и он и от стен отскакивает (боковых). Вроде, теоремой косинусов пользовался для направления (топорное решение, через Пифагора лучше, реализовано в прошлом примере с головой). Могу скинуть код, если поможет, но писал только когда начал учить математику и программирование, так что разбираться там будет трудно.
1
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 15
23.07.2015, 03:39  [ТС]
Мне нужно его заставить двигатся и все равно куда ,можна и просто в сторону,а потом назад,но что б постоянно. Может помните заставку в винде где пузырьки в режиме ожидании бегали, только мне не нужно хаотично(пока).Мне подскажите пожалуйста как это зделать что б я увидел как мой шарик бегает по панели(допустим по одной линии) и отбивался от краев этой панели. Шас почитаю про таймеры и попробую может получится. Я просто подумал что здесь нужен цыкл(бесконечный) который будет постоянно рисовать(ну как то так)

Добавлено через 1 час 27 минут
Короче зделал вот такую ахинею

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     pan.addMouseListener(new MouseAdapter() {
                
                public void mousePressed(MouseEvent e) {
                    
                for (int i = 0;i<400;i++){ // 400 - это размер панели
                    r = 70;
                    X = e.getX() - r / 2 +i;
                    Y = e.getY() - r / 2  ;  
                    if(X==400 || Y==400){
                    i = 1;
                    X = e.getX() - r / 2-i ;
                    Y = e.getY() - r / 2 ;
                    }
                    if(X==0 || Y==0){
                       i = 1;
                        X = e.getX() - r / 2+i ;
                        Y = e.getY() - r / 2 ;
                        }
                //  text.setText(X + "");
                //  text1.setText(Y + "");
                    
                    pan.update(pan.getGraphics());
и он начал вроде двигаться но очень быстро(мелькает и от места где я его создал(круг) до конца панели и обратно) , блин ,а как его зделать плавнинько хз
Хоть двигаеться

Добавлено через 30 минут
Ха вставил туда еще
Java
1
2
3
4
5
6
                            try {
                        Thread.sleep(3);
                    } catch (InterruptedException e1) {
                    
                        e1.printStackTrace();
                    }
и начал медленее двигатся ,но мерцать не перестал)

Добавлено через 45 минут
И последнее творение на сегодня
Java
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
 pan.addMouseListener(new MouseAdapter() {
                
                public void mousePressed(MouseEvent e) {
                    int m=0,p=1;
                    r=70;
                    X = 0;
                    Y = 100;
                    
            //      pan.update(pan.getGraphics());
                for (int i = 0;i<4;i++){
                 
                            if(X==0){
                          i=1;
                           do{
                           X++;
                           try {
                                Thread.sleep(3);
                            } catch (InterruptedException e1) {
                            
                                e1.printStackTrace();
                            }
                           pan.update(pan.getGraphics());
                       } while(X<330);
                  }
                  if(X==330){
                       i=0;
                        do{
                            X--;
                             try {
                                    Thread.sleep(3);
                                } catch (InterruptedException e1) {
                                
                                    e1.printStackTrace();
                                }
                            pan.update(pan.getGraphics());
                        }while(X>0);
                    }
                    text.setText(X + "");
                    text1.setText(Y + "");
                  
                
                  
                }
                }
            });
Теперь он у меня бегает туда и сюда,но блин мерцание не пропало

Вот весь мой код
Java
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
128
129
130
131
132
import java.awt.*;
import java.awt.event.*;
 
public class Circles {
 
    public static void main(String[] args) {
        
        PaintEx e = new PaintEx();
    
        e.launch();
        
        
    }
}
 
class PaintEx {
    private Panel pan, pan1, pan2;
    String x, y, R;
    private Frame f;
    private Label lab;
    int s, r, X, Y;
    private TextField text, text1, text2;
    private Button b;
 
    public PaintEx() {
        b = new Button("Go");
        pan1 = new Panel();
        pan2 = new Panel();
        text = new TextField("", 10);
        text1 = new TextField("", 10);
        text2 = new TextField("", 10);
        lab = new Label("Circle");
    }
 
    public void launch() {
       
    
        pan = new Panel() {
            
            
            public void paint(Graphics g) {
                
                    
 
                    Color newColor = new Color(0,0,255); //(int) (Math.random() * 255), (int) (Math.random() * 255),(int) (Math.random() * 255)
                    g.setColor(newColor);
                    g.fillOval(X, Y, r, r);
                    
                    
                  
                
                
            }
            
        
        //  public void update(Graphics g){
        //      paint (g);
        //      }
        
        
            
        };
         pan.addMouseListener(new MouseAdapter() {
                
                public void mousePressed(MouseEvent e) {
                    int m=0,p=1;
                    r=70;
                    X = 0;
                    Y = 100;
                    
            //      pan.update(pan.getGraphics());
                for (int i = 0;i<4;i++){
                 
                            if(X==0){
                          i=1;
                           do{
                           X++;
                           try {
                                Thread.sleep(3);
                            } catch (InterruptedException e1) {
                            
                                e1.printStackTrace();
                            }
                           pan.update(pan.getGraphics());
                       } while(X<330);
                  }
                  if(X==330){
                       i=0;
                        do{
                            X--;
                             try {
                                    Thread.sleep(3);
                                } catch (InterruptedException e1) {
                                
                                    e1.printStackTrace();
                                }
                            pan.update(pan.getGraphics());
                        }while(X>0);
                    }
                    text.setText(X + "");
                    text1.setText(Y + "");
                  
                
                  
                }
                }
            });
      
       
        f = new Frame("Moving circles");
        f.setLayout(new BorderLayout());
        f.add(pan, BorderLayout.CENTER);
        f.add(pan1, BorderLayout.SOUTH);
        f.add(pan2, BorderLayout.NORTH);
        pan1.add(text);
        pan1.add(text1);
        pan1.add(text2);
        pan1.add(b);
        pan2.setLayout(new BorderLayout());
        pan2.add(lab, BorderLayout.NORTH);
        f.setSize(400, 400);
        f.setVisible(true);
        
        
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
    }
}
может хто посмотрит и скажет откуда мерцание)


 Комментарий модератора 
Для выделения кода используйте тег JAVA а не другие теги.
0
0 / 0 / 1
Регистрация: 23.07.2015
Сообщений: 6
23.07.2015, 16:17
https://www.cyberforum.ru/java... ost7903380
Надеюсь цикл не принципиально ?
0
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 15
23.07.2015, 22:28  [ТС]
Спасибо впринцепе нет
0
126 / 113 / 56
Регистрация: 05.12.2012
Сообщений: 463
03.08.2015, 19:35
Если еще актуально...

Java
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
package movingball;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class MovingBall extends JPanel {
 
    BufferedImage img;
    int WIDTH;
    int HEIGHT;
    int X, Y, dx, dy, R;
 
    MovingBall() {
        WIDTH = 640;
        HEIGHT = 480;
 
        X = 0;
        Y = 0;
        dx = 1;
        dy = 1;
        R = 15;
 
        JFrame frame = new JFrame("movement");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setPreferredSize(new Dimension(WIDTH, HEIGHT));
        img = new BufferedImage(WIDTH + R, HEIGHT + R, BufferedImage.TYPE_INT_BGR);
 
        frame.add(this);
        frame.pack();
 
        javax.swing.Timer timer = new javax.swing.Timer(20, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (X + R < 0 | X + R > WIDTH) {
                    dx *= (-1);
                }
 
                if (Y + R < 0 | Y + R > HEIGHT) {
                    dy *= (-1);
                }
 
                X += dx;
                Y += dy;
 
                paintOnImg();
            }
        });
 
        timer.start();
 
        frame.setResizable(false);
        frame.setVisible(true);
 
    }
 
    public void paintOnImg() {
        Graphics g = img.createGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, WIDTH + R, HEIGHT + R); //cleaning the image;
 
        g.setColor(Color.RED);
        g.fillOval(X + R, Y + R, R, R);
 
        g.dispose();
 
        repaint();
    }
 
    @Override
    public void paint(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }
 
    @Override
    public void update(Graphics g) {
        paint(g);
    }
 
    public static void main(String[] args) {
        new MovingBall();
    }
}
Там с размерами изображения какая-то канитель получилось, т.к. на скорую руку: оно меньше, чем панель получалось. Поэтому размер я увеличил путем + R (идиотское решение).

Особенности: не мерцает, двигается плавно, от стен отскакивает.
1
67 / 65 / 61
Регистрация: 11.11.2015
Сообщений: 394
07.01.2017, 22:28
Если автор еще здесь, то что же все-таки с размерами можно сделать? А так Ваше решение отличное.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2017, 22:28
Помогаю со студенческими работами здесь

Нужно добавить кнопку, при нажатии на которую шарик перестает двигаться вправо-влево, и начинает двигаться вверх-вниз
Пожалуйста помогите переделать программу. Нужно добавить кнопку, при нажатии на которую шарик перестает двигаться вправо-влево, и начинает...

Как будет двигаться шарик в жидкости
Как будет двигаться шарик в жидкости, если он попал в нее со скоростью V1&gt;V0???

Как заставить двигаться обьект
Всем привет, у меня задача стоит такая: сделать так что бы при нажатии на фигурку она двигался в другом (Picturebox) и при ударе об...

Как заставить окна двигаться?
Добрый день уважаемые форумчане. Мне дали задание: создать 9 окон, с помощью регионов сделать их круглыми, в центре экрана поместить 1...

Как заставить картинки двигаться??????
Solid Works позволяет сделать анимацию спроектированной детали


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru