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

LWJGL+ GUI - Выход из рендерного цикла для работы в GUI без потери окна

30.11.2015, 21:00. Показов 1706. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Учусь использовать OpenGL в Java. И у меня возникла небольшая проблемка, окно LWJGL запускается с гуи, и если уже запустился рендер (исполняется пока до тех пор пока не нажму Esc или пока не закрою окно), то никакие действия с ГУИ я больше не могу проводить(ведь цикл продолжается). Нужно как-небудь выйти из цикла рендера и при этом не потерять окна. Вот код:
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
public class LWJGL {
    private boolean boxselected = false;
    private List<Box> cubes = new ArrayList<Box>(16);
 
    public LWJGL() {
        try {
            Display.setDisplayMode(new DisplayMode(640, 480));
            Display.setTitle("Java OpenGL program");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }
 
        // Initialization OpenGL
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 640, 0, 480, 1, -1);
        glMatrixMode(GL_MODELVIEW);
 
        float translate_x = 0;
        float translate_y = 0;
        
        while (!Display.isCloseRequested()) {       // Менял на while (Display.isActive()) { не помогло
            // Render
            glClear(GL11.GL_COLOR_BUFFER_BIT);
            
            glPushMatrix();
 
            glTranslatef(translate_x, translate_y, 0);
            
 
            
            if (Keyboard.isKeyDown(Keyboard.KEY_SPACE) && Mouse.getX() > 0
                    && Mouse.getY() < 640 && Mouse.getY() > 0
                    && Mouse.getY() < 480) {
                translate_x+=Mouse.getDX();
                translate_y+=Mouse.getDY();
            }
            
            int mouseX=(int)(Mouse.getX()-translate_x);
            int mouseY=(int)(Mouse.getY()-translate_y);
            
            while (Keyboard.next()) {
                if (Keyboard.isKeyDown(Keyboard.KEY_C)) {
                    cubes.add(new Box(mouseX, mouseY));
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
                    glPushMatrix();
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_L)) {
                    glPopMatrix();
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_R)) {
                    glLoadIdentity();
                    glClear(GL11.GL_COLOR_BUFFER_BIT);
                }           
            }
 
            for (Box box : cubes) {
                if (Mouse.isButtonDown(0)
                        && box.inbound(mouseX, mouseY)
                        && !boxselected) {
                    boxselected = true;
                    box.selected = true;
                    //System.out.println("You pressed boxXXX!");
                }
                if (!Mouse.isButtonDown(0)) {
                    boxselected = false;
                    box.selected = false;
                }
 
                if (box.selected) {
                    box.update(Mouse.getDX(), Mouse.getDY());
                }
 
                box.draw();
            }
            
            glPopMatrix();
            
            Display.update();
            Display.sync(60);
 
        
 
            if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
                Display.destroy();
                System.exit(0);
            }
            
            
 
        }
 
            Display.destroy();
            System.exit(0);
    }
Спасибо за совет!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2015, 21:00
Ответы с готовыми решениями:

LWJGL и GUI - Выход из рендерного цикла для роботы в GUI без потери окна
Всем привет! Учусь использовать OpenGL в Java. И у меня возникла небольшая проблемка, окно LWJGL запускается с гуи, и если уже запустился...

Выход из цикла по кнопке в GUI
Добрый день, форумчане Возникли сложности при написании в общем-то простой программки на GUI. Идея заключалась в следующем. По нажатию...

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

1
0 / 0 / 1
Регистрация: 26.03.2013
Сообщений: 37
02.12.2015, 01:34  [ТС]
Ну в общем проблему я решил, нужно было засунуть рендер в отдельный поток(Thread) что я и сделал. Вот код:

Сам класс рендера:
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
import static org.lwjgl.opengl.GL11.*;
 
import java.awt.Font;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
import org.lwjgl.opengl.*;
import org.lwjgl.*;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.newdawn.slick.Color;
import org.newdawn.slick.TrueTypeFont;
 
 
public class LWJGL implements Runnable {
    private TrueTypeFont font;
    /** Boolean flag on whether AntiAliasing is enabled or not */
    private boolean antiAlias = false;
    private boolean status, boxselected=false;
    private boolean mooveR, mooveU;
    private List<Box> cubes = new ArrayList<Box>(16);
 
    public LWJGL() {
    }
 
    public void init() {
        // load a default java font
        Font awtFont = new Font("Times New Roman", Font.BOLD, 24);
        font = new TrueTypeFont(awtFont, antiAlias);
 
    }
 
    public void render() {
        Color.white.bind();
        font.drawString(100, 50, "Box", Color.yellow);
    }
 
    public boolean getStatus() {
        return GUI.status;
    }
 
    public void run() {
        try {
            Display.setDisplayMode(new DisplayMode(640, 480));
            Display.setTitle(GUI.s);
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }
        System.out.println("rogram executing");
        // Initialization OpenGL
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 640, 0, 480, 1, -1);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        glMatrixMode(GL_MODELVIEW);
 
        float translate_x = 0;
        float translate_y = 0;
        float x = 50, y = 100;
        mooveR = true;
        mooveU = true;
        while (!Display.isCloseRequested()) {
            // Render
            glClear(GL11.GL_COLOR_BUFFER_BIT);
            glLoadIdentity();
            glTranslatef(translate_x, translate_y, 0);
            if (x + 26 > 640) {
                mooveR = false;
            } else if (x - 26 < 0) {
                mooveR = true;
            }
            if (y + 26 > 480) {
                mooveU = false;
            } else if (y - 26 < 0) {
                mooveU = true;
            }
            if (mooveR) {
                x += 0.5;
            } else {
                x -= 0.5;
            }
            if (mooveU) {
                y += 0.5;
            } else {
                y -= 0.5;
            }
            glColor3f(1.0f, 1.0f, 0f);
            glBegin(GL_QUADS);
            glVertex2f(x - 25, y + 25);
            glVertex2f(x + 25, y + 25);
            glVertex2f(x + 25, y - 25);
            glVertex2f(x - 25, y - 25);
            glEnd();
            //System.out.printf("x = %f, y = %f \n", x, y);
            
            
 
            if (Keyboard.isKeyDown(Keyboard.KEY_SPACE) && Mouse.getX() > 0
                    && Mouse.getY() < 640 && Mouse.getY() > 0
                    && Mouse.getY() < 480) {
                translate_x += Mouse.getDX();
                translate_y += Mouse.getDY();
            }
 
            int mouseX = (int) (Mouse.getX() - translate_x);
            int mouseY = (int) (Mouse.getY() - translate_y);
 
            //System.out.println("X = " + mouseX + "; Y = " + mouseY);
 
            while (Keyboard.next()) {
                if (Keyboard.isKeyDown(Keyboard.KEY_C)) {
                    cubes.add(new Box(mouseX, mouseY));
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
                    translate_x = mouseX;
                    translate_y = mouseY;
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_L)) {
 
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_R)) {
                    glLoadIdentity();
                }
            }
            
            for (Box box : cubes) {
 
                if (Mouse.isButtonDown(0) && box.inbound(mouseX, mouseY)
                        && !boxselected) {
                    boxselected = true;
                    box.selected = true;
                    // System.out.println("You presed a boxXXX!");
                }
                if (!Mouse.isButtonDown(0)) {
                    boxselected = false;
                    box.selected = false;
                }
 
                if (box.selected) {
                    box.update(Mouse.getDX(), Mouse.getDY());
                }
 
                box.draw();
            }
            
            Display.update();
            Display.sync(60);
 
            if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
                Display.destroy();
                System.exit(0);
            }
 
        }
 
        Display.destroy();
        System.exit(0);
    }
 
    private static class Box {
        public int x, y;
        public boolean selected = false;
        private float colorRed, colorGreen, colorBlue;
 
        Box(int x, int y) {
            this.x = x;
            this.y = y;
 
            Random rg = new Random();
            colorRed = rg.nextFloat();
            colorGreen = rg.nextFloat();
            colorBlue = rg.nextFloat();
 
        }
 
        boolean inbound(int mouseX, int mouseY) {
            if (mouseX < x + 25 && mouseX > x - 25 && mouseY < y + 25
                    && mouseY > y - 25)
                return true;
            else
                return false;
        }
 
        void update(int dx, int dy) {
            x += dx;
            y += dy;
        }
 
        void draw() {
            glColor3f(colorRed, colorGreen, colorBlue);
            glBegin(GL_QUADS);
            glVertex2f(x - 25, y + 25);
            glVertex2f(x + 25, y + 25);
            glVertex2f(x + 25, y - 25);
            glVertex2f(x - 25, y - 25);
            glEnd();
        }
    }
}
и создание екземпляра у меня на кнопке висит:
Java
1
2
3
4
5
6
public void actionPerformed(ActionEvent e) {
            try{
            if(e.getSource()==b1){ 
                Thread paint = new Thread(new LWJGL());
                paint.start();
            }
За спагетти-код не ругайте, я так только для себя попрактиковатся писал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2015, 01:34
Помогаю со студенческими работами здесь

[ubuntu] Как запустить qt-gui программу без gui-интерфейся из консоли?
Как запустить qt-gui программу без gui-интерфейса из консоли?

Как запустить GUI приложение (например, notepad.exe) без отображения GUI?
Добрый день. Интересует есть ли такая возможность, как запустить GUI приложение (например, notepad.exe) без отображения GUI?

Выход из цикла без остановки его работы
Дан код, при выполнение работы он ожидает нажатие клавиши. Я хочу узнать, как сделать так, чтобы при работе он не ожидал нажатия клавиши, а...

Создать GUI для работы с графиками
Добрый день! В общем впервые пишу на Python. Есть некий график, хотел бы создать для него графический интерфейс, для ввода параметров....

Тема для курсовой работы, с использованием БД и GUI
Помогите пожалуйста выбрать не сложную но интересную тему для курсача по проге. Требуется написать на C# с использованием БД, и создать...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются: OwenLogic v. 2. 10. 366 EasyBuilder Pro. . .
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
Тестирование Pull Request в Kubernetes с GitHub Actions и GKE
Mr. Docker 02.06.2025
Мы все знаем, что тестирование на локальной машине или в изолированном CI-окружении — это не совсем то же самое, что тестирование в реальном кластере Kubernetes. Контекстно-зависимые ошибки, проблемы. . .
Оптимизация CMake для ускорения сборки
bytestream 02.06.2025
Вы когда-нибудь ловили себя на мысле, что пока ваш проект компилируется, можно успеть сварить кофе, прочитать главу книги или даже сбегать в соседний офис? Если да, то добро пожаловать в клуб. . .
JS String.prototype.localeCo­mpare()
mr_dramm 02.06.2025
скопировано из этой темы чтобы не потерялось. localeCompare без указания локали для сравнения строк под капотом использует Intl. Collator , который работает согласно Unicode Collation Algorithm. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »