Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 1
Регистрация: 26.03.2013
Сообщений: 37
1

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

30.11.2015, 22:11. Просмотров 418. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2015, 22:11
Ответы с готовыми решениями:

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

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

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

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

1
0 / 0 / 1
Регистрация: 26.03.2013
Сообщений: 37
02.12.2015, 01:35  [ТС] 2
Ну в общем проблему я решил, нужно было засунуть рендер в отдельный поток(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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2015, 01:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Вызов диалогового окна GUI для выбора файла с определенным расширением
Небольшое вступление. Я пользуюсь простейшим батником, который выглядит вот так: @echo on...

Приложение для доступа к БД программным путем без инструментов GUI
Вопрос задавался не раз. Извиняюсь за дублирование. Столкнулся с базами данных(делать было...


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

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

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