Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
true_newfag
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 10
#1

Как сделать так, что бы после начала игры, активным было OpenGL-окно, а не консольное? - C++

13.06.2014, 18:10. Просмотров 624. Ответов 4
Метки нет (Все метки)

Всем привет, у Меня тут такая проблемка, даже не знаю как искать ее решение в гугле, вот и решил написать сюда.
Я написал игру на с++ через OpenGL, дальше сделал меню через консоль, но вот незадача, когда игра стартует, активным окном остается окно консоли, и клавиши управления из-за этого не реагируют. Как сделать так, что бы после начала игры, активным было окно с игрой, а не консоль?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2014, 18:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать так, что бы после начала игры, активным было OpenGL-окно, а не консольное? (C++):

Как программно в c++ builder сделать неактивное окно(форму) активным? - C++ Builder
Как программно в c++ builder сделать неактивное окно(форму) активным? Ещё вопрос:Мне нужно изменять расположение 2-ой формы,но чтобы при...

сделать окно активным - C++ Builder
Ребята подскажите по такому вопросу. У меня есть форма на ней кнопка. Когда я нажимаю на эту кнопку, создаётся приложение ворд и...

Как сделать так, чтобы консольное приложение запускалось на любом пк? - Visual C++
Добрый вечер! Мне нужна помощь. Как сделать так, чтобы консольное приложение на с++ можно было открыть на любом пк? F5 не помогает, так...

Как сделать чтоб окно было развернуто на весь экран? - Visual C++
Какой стиль менять? Я добавил wcex.style= CS_HREDRAW | CS_VREDRAW | WS_MAXIMIZE; В рез-те компилируется, но окно сразу закрывается,...

Как сделать окно активным? - C++ WinAPI
господа как можно сделать окно активным? у меня окно в таком состаянии - ShowWindow (hwnd, SW_HIDE); а мне надо , что бы оно...

Сделать окно активным - C++ WinAPI
Всем привет. Столкнулся с такой проблемой. Нужно из программы проверять есть ли обновления, и если есть скачивать и заменять...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2014, 18:13 #2
SetForegroundWindow
0
true_newfag
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 10
13.06.2014, 18:29  [ТС] #3
Насколько Я понял, там для Win32 project и вроде как он не подходит для ConsoleApplication. Или Я не прав?

Добавлено через 8 минут
Код "меню" которое на самом деле обычная консоль
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
int main () { // основная функция main, из которой проходит инициализация всех функций.
    int a;
    cout << endl << "       WELCOME, TO SNAKE GAME v1.alfa by Jas 2014 " << endl << endl << endl << "1. START GAME " << endl;
    cin >> a;
    if (a == 1)
        cout
    <<system("cls") << " ***  BEFORE YOU START TO PLAY, LOOK AT THE CONTROL KEYS  ***" <<endl 
        << endl << "            Controly keys " << endl
        << " Arrow up - Move to top     "  << " Arrow down - Move to bottom " << endl
        << " Arrow left - Move to left  "  << " Arrow right - Move to right " << endl
        << " P - Pause game " << endl << " U - Unpause game     " <<  " Q - Close game " << endl 
        << endl << "            Snake's color :" << endl
        << " G - Set snake color on Green   "<< " R - Set snake color on Red " << endl
        << " B - Set snake color on Blue    " << " Y - Set snake color on Yellow " << endl 
        << endl << "            Snake's speed: " << endl
        << " 1 - Set snake speed on 50  " << " 2 - Set snake speed on 100  " << endl
        << " 3 - Set snake speed on 150 " << " 4 - Set snake speed on 200 " << endl
        << " 5 - Set snake speed on 250 " << " 6 - Set snake speed on 300 " << endl
        << " 7 - Set snake speed on 350 " << " 8 - Set snake speed on 400 " << endl
        << " 9 - Set snake speed on 450 "  << " 0 - Set snake speed on 500 " << endl
        << endl << "Press 1 to start game" << endl;
    cin >> a;
    if (a == 1) Start(1, __argv); // вызов функции Start.
 
};
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2014, 18:37 #4
Цитата Сообщение от true_newfag Посмотреть сообщение
Start(1, __argv); // вызов функции Start.
и что это за Start? это должно о чем-то говорить?
0
true_newfag
0 / 0 / 0
Регистрация: 11.02.2014
Сообщений: 10
13.06.2014, 18:49  [ТС] #5
Это функция, которая запускает игру. Вот весь код:

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
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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
 
// Mustafin Zhassulan CSSE 138R
//Practical work 02.06.14
// Snake game code
#include <iostream>
#include <fstream>
#include <time.h>
#include <GL/glut.h> // подключение графичесокй библиотеки OpenGL.
using namespace std;
 
int Q = 30, W = 20; // переменные содержащие информацию необходимые для построения высоте и ширины игрового поля.
int Scale = 25; // переменная сожержащая в себе инофрмацию масштабе одного "квадрата".
int w = Scale*Q;  // переменная сожержащая в себе инофрмацию о размере поля по ширине 750
int h = Scale*W; //переменная сожержащая в себе инофрмацию о размере поля по высоте 500
int dir; // переменная необходимая для хранения в себе, инофрмации о направлении змейки
int num = 4; // переменная задающая количество начальных блоков змейки.
int period = 0; // переменная отвечает за смену Яблока и Вишни.
int ms = 1000;  // переменная отвечающая за скорость игры.
int oms = 1; // переменная необходимая для реализации функции паузы и продолжения игры.
int Score = 0;
 
struct { // данная структура является непосредственно самой змейкой.
 
    int x, y; // переменная x   отвечает за координату по ширине, а y по высоте.
 
}
s[777]; //максимально возможное количество "квадратиков" из которых может состоять змейка.
 
class Fruit{ // класс содержащий в себе инофрмацию необходимую для создания таких элементов игры как Яблоко и Вишня.
 
public:
 
    int x, y; // переменные x и y отвечают за хранение информации о положении змейки по координатам.
 
    void New() { // функция которая задает случайные координаты каждой новой Вишне/Яблоку.
        x = rand() % Q; 
        y = rand() % W;
        for (int i = 0; i < 8; i++){
            if (i == 7) Score = Score + 70;
            else Score = Score + 10;
        }
    }
 
    void DrawApple(){ // функция реализующая рисовку  Яблока, по заданному размеру и цвету. 
 
        glColor3f(0.0, 1.0, 0.0); // функция OpenGL позволяющая задавать цвет объекту, в данном случае зеленый.
        glRectf(x*Scale, y*Scale, (x + 1)*Scale, (y + 1)*Scale); // функция OpenGL благодоря которой рисуется яблоко, в данном случе размером квадрат 1 на 1.
    }
 
    void DrawCherry(){ // функция реализующая рисовку  Вишни, по заданному размеру и цвету. 
 
        glColor3f(1.0, 0.0, 0.0); // функция библиотеки OpenGL позволяющая задавать цвет объекту, в данном случае красный.
        glRectf(x*Scale, y*Scale, (x + 1)*Scale, (y + 1)*Scale); // функция OpenGL благодоря которой рисуется вишня, в данном случе размером квадрат 1 на 1.
    }
 
}
m[1]; // объект класа Fruit, необходимый для создания фрукта на игровом поле.
 
class Snake{    // класс содержащий в себе инофрмацию необходимую для создания таких элементов игры как Яблоко и Вишня.
 
public:
    int q = 1; // переменная необходимая для реализации метода смены цвета Змейки, в зависимости от значения, цвет будет меняться.
 
    void SetRedColor(){ // функция, устанавливающая значение переменной q равной 2.
        q = 2; 
    };
 
    void SetBlueColor(){ // функция, устанавливающая значение переменной q равной 3.
        q = 3; 
    }
    
    void SetGreenColor(){  // функция, устанавливающая значение переменной q равной 1.
        q = 1;
    }
    
    void SetYellowColor(){ // функция, устанавливающая значение переменной q равной 4.
        q = 4;
    }
 
    void DrawSnake(){ // в данной функции описана логика смены цвета змейки.
        if (q == 1){ // в нижеследующих условиях описывается, логика смены цвета змейки, если значение перменной q равно 1, то змейка окрасится в зеленый цвет.
            glColor3f(0.0, 1.0, 0.0);
        }
        if (q == 2){
            glColor3f(1.0, 0.0, 0.0);
        }
        if (q == 3){
            glColor3f(0.0, 0.0, 1.0);
        }
        if (q == 4){
            glColor3f(1.0, 1.0, 0.0);
        }
 
        for (int i = 0; i < num; i++) { // в данном цикле реализуется рисовка змейки.
            glRectf(s[i].x*Scale, s[i].y*Scale, (s[i].x + 1)*Scale, (s[i].y + 1) * Scale);
        }
 
    }
}
aaa; // объект класса Snake.
 
void DrawGameField(){ // функция отвечающая за рисовку игрового поля.
 
    glColor3f(0.0, 1.0, 0.0); // задается цвет, рисуемых ниже линий, в данном случае черный.
 
    glBegin(GL_LINES); // все игровое поле покрыто линиями, за отрисовку которых отвечает эта функция.
 
    for (int i = 0; i < w; i += Scale){
        glVertex2f(i, 1); glVertex2f(i,h); // функция непосредственной прорисовки поля, от координат (i,0) до координат (i,h) с шагом в Scale прорисовываются вертикальные черные линии.
    }
 
    for (int j = 0; j < h; j += Scale){
        glVertex2f(1, j); glVertex2f(w, j); // функция непосредственной прорисовки поля, от координат (j,0) до координат (j,w) с шагом в Scale прорисовываются горизонтальные черные линии.
 
    }
 
    glEnd(); // завершение функции  отрисовки.
 
};
void DrawMenuField(){
    glColor3f(1.0, 0.0, 0.0); // задается цвет, рисуемых ниже линий, в данном случае черный.
 
    glBegin(GL_LINES); // все игровое поле покрыто линиями, за отрисовку которых отвечает эта функция.
 
    for (int i = 0; i < w; i += Scale){
        glVertex2f(i, -50); glVertex2f(i, 0); // функция непосредственной прорисовки поля, от координат (i,0) до координат (i,h) с шагом в Scale прорисовываются вертикальные черные линии.
    }
 
    for (int j = -50; j < 1; j += Scale){
        glVertex2f(0, j); glVertex2f(w, j); // функция непосредственной прорисовки поля, от координат (j,0) до координат (j,w) с шагом в Scale прорисовываются горизонтальные черные линии.
 
    }
 
    glEnd(); // завершение функции  отрисовки.
 
}
 
void Display(){ // функция отвечающая за все, что отображается на экране.
 
    glClear(GL_COLOR_BUFFER_BIT);
 
    DrawGameField(); // вызов ранее описанного метода.
    DrawMenuField();
 
    for (int i = 0; i < 1; i++){ // в данном цикле описыватся, что если переменная period равна 7, то должна вызываться функция прорисовки вишни.
        if (period == 7) {          
            m[i].DrawCherry(); 
        }
 
        else{ // в любом другом случае вызывается функция прорисовки яблока.
            m[i].DrawApple();
        }
}   
    aaa.DrawSnake(); // вызов функции прорисовки змеи.
 
    glFlush(); // функция немедленного вывода на экран.
 
};
 
 
 
void Tick(){ //метод, реализующий движение змейки, поглощение фрукта, наезд на границы и наезд змейки на саму себя.
    
        for (int i = num; i > 0; i--){ // цикл содержащий в себе описание логики поведения элементов змейки, следующих за головной.
 
            s[i].x = s[i - 1].x; // последний элемент змейки, ставонится на координаты предпоследнего и т.д.
            s[i].y = s[i - 1].y; // последний элемент змейки, ставонится на координаты предпоследнего и т.д.
 
        }
 
        if (dir == 0) s[0].y += 1; // если направление = 0, то координата змейки по вертикали увеличивается на одну единицу.
        if (dir == 1) s[0].x -= 1; // если направление = 1, то координата змейки по горизонтали уменьшается на одну единицу.
        if (dir == 2) s[0].x += 1; // если направление = 2, то координата змейки по горизонтали увеличивается на одну единицу.
        if (dir == 3) s[0].y -= 1; // если направление = 3, то координата змейки по вертикали уменьшается на одну единицу.
 
        for (int i = 0; i < 1; i++) // в данном цикле, описывается что происходит, когда координаты первого квадрата змейки совпадают с координатами фрукта.
            if ((s[0].x == m[i].x) && (s[0].y == m[i].y)){
            num++; m[i].New(); // увеличение блоков змейки, и вызов функции отрисовки нового фрукта.
            period += 1; // увеличение переменной period на 1
            if (period >= 8) period = 0; // если значение переменной period станет равно 8, то обнулить значение данной переменной.
            }
 
        if (s[0].x > Q-1) exit(0); // если головной элемент змейки выходит за рамки координатов игрового поля - завершить работу программы.
        if (s[0].x < 0) exit(0); // если головной элемент змейки выходит за рамки координатов игрового поля - завершить работу программы.
        if (s[0].y > W-1) exit(0); // если головной элемент змейки выходит за рамки координатов игрового поля - завершить работу программы.
        if (s[0].y < 0)exit(0); // если головной элемент змейки выходит за рамки координатов игрового поля - завершить работу программы.
 
        for (int i = 1; i < num; i++) 
        if (s[0].x == s[i].x && s[0].y == s[i].y) exit(0); // если головной элемент змейки  сталкивается с любым другим элементом змейки - завершить работу программы.
    
};
 
void Timer(int = 0){//
    
    Display(); // вызывается функция Display.
 
        if (oms==1) // если значение переменной oms = 0, то вызывать функцию Tick.
        Tick();
        else{ // в любом другом случае не делать ничего.
        }
 
    glutTimerFunc(ms, Timer, 0); // вызвать функцию, содержащую в себе функцию Timer.
 
};
 
void MenuKeys(unsigned char key, int a, int b){ //метод для назначения функционала клавиш.
 
    switch (key){
 
    case'y':aaa.SetYellowColor(); break; // при нажатии клавишы Y, вызывается метод SetYellowColor.
    case'r':aaa.SetRedColor(); break; // при нажатии клавишы R, вызывается метод SetRedColor.
    case'b':aaa.SetBlueColor(); break; // при нажатии клавишы B, вызывается метод SetBlueColor.
    case'g':aaa.SetGreenColor(); break; // при нажатии клавишы G, вызывается метод SetGreenColor.
    case 'p':oms = 0; break; // при нажатии клавишы P, переменной oms задается значение 0, что приведет к паузе в игре.
    case 'u':oms = 1; break; // при нажатии клавишы U, переменной oms задается значение 1, что приведет к продолжению игры.
    case 'q':exit(0); break; // при нажатии клавишы Q, вызывается метод exit, что приведет к завершению программы.
    case '1':ms = 50; break; // при нажатии клавишы 1, переменной ms задается значение 50, что приведет к изменению скорости игры.
    case '2':ms = 100; break; // при нажатии клавишы 2, переменной ms задается значение 100, что приведет к изменению скорости игры.
    case '3':ms = 150; break; // при нажатии клавишы 3, переменной ms задается значение 150, что приведет к изменению скорости игры.
    case '4':ms = 200; break; // при нажатии клавишы 4, переменной ms задается значение 200, что приведет к изменению скорости игры.
    case '5':ms = 250; break; // при нажатии клавишы 5, переменной ms задается значение 250, что приведет к изменению скорости игры.
    case '6':ms = 300; break; // при нажатии клавишы 6, переменной ms задается значение 300, что приведет к изменению скорости игры.
    case '7':ms = 350; break; // при нажатии клавишы 7, переменной ms задается значение 350, что приведет к изменению скорости игры.
    case '8':ms = 400; break; // при нажатии клавишы 8, переменной ms задается значение 400, что приведет к изменению скорости игры.
    case '9':ms = 450; break; // при нажатии клавишы 9, переменной ms задается значение 550, что приведет к изменению скорости игры.
    case '0':ms = 500; break; // при нажатии клавишы 0, переменной ms задается значение 500, что приведет к изменению скорости игры.
 
    }
};
 
void MoveKeys(int key, int a, int b){ // метод отвечающий за направление движения змейки.
 
    switch (key){
 
    case 101: if (dir == 3) dir = 3; else dir = 0; break; // при нажатии на клавишу "стрелка вверх", змейке задается соответствущее направление.
    case 102: if (dir == 1) dir = 1; else dir = 2; break; // при нажатии на клавишу "стрелка вправо", змейке задается соответствущее направление.
    case 100: if (dir == 2) dir = 2; else dir = 1; break; // при нажатии на клавишу "стрелка влево", змейке задается соответствущее направление.
    case 103: if (dir == 0) dir = 0; else dir = 3; break; // при нажатии на клавишу "стрелка вниз", змейке задается соответствущее направление.
 
    }
};
 
void Start(int argc, char **argv){// функция, в которой собраны все методы библиотеки OpenGL, необходимые для запуска графического окна.
 
    for (int i = 0; i < 1; i++) m[i].New(); //
 
    s[0].x = rand() % Q; //начальные координаты появления змейки на игровом поле.
    s[0].y = rand() % W; //начальные координаты появления змейки на игровом поле.
 
    glutInit(&argc, argv); //
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(w, h); // функуия отвечающая за размер появляющегося окна.
    glutInitWindowPosition(400,100);
    glutCreateWindow("Jas's Snake Game"); // функция задающая имя окна.
    glMatrixMode(GL_PROJECTION); //
    glLoadIdentity(); //
    gluOrtho2D(0, w, -50, h); //
    glutDisplayFunc(Display); // функция, в которой указывается функция содержащая в себе инофрмацию, которая должна отображаться.
    glutTimerFunc(50,Timer, 0);  //
    glutKeyboardFunc(MenuKeys); // функция OpenGL, которая перехватывает значение цифровых, буквенных и символьнх клавиш.
    glutSpecialFunc(MoveKeys); //специальная функция OpenGL, которая перехватывает значения клавиш F, Home, Insert, End, и клавиши стрелок.
    glutMainLoop();
};
 
int main () { // основная функция main, из которой проходит инициализация всех функций.
    int a;
    cout << endl << "       WELCOME, TO SNAKE GAME v1.alfa by Jas 2014 " << endl << endl << endl << "1. START GAME " << endl;
    cin >> a;
    if (a == 1)
        cout
    <<system("cls") << " ***  BEFORE YOU START TO PLAY, LOOK AT THE CONTROL KEYS  ***" <<endl 
        << endl << "            Controly keys " << endl
        << " Arrow up - Move to top     "  << " Arrow down - Move to bottom " << endl
        << " Arrow left - Move to left  "  << " Arrow right - Move to right " << endl
        << " P - Pause game " << endl << " U - Unpause game     " <<  " Q - Close game " << endl 
        << endl << "            Snake's color :" << endl
        << " G - Set snake color on Green   "<< " R - Set snake color on Red " << endl
        << " B - Set snake color on Blue    " << " Y - Set snake color on Yellow " << endl 
        << endl << "            Snake's speed: " << endl
        << " 1 - Set snake speed on 50  " << " 2 - Set snake speed on 100  " << endl
        << " 3 - Set snake speed on 150 " << " 4 - Set snake speed on 200 " << endl
        << " 5 - Set snake speed on 250 " << " 6 - Set snake speed on 300 " << endl
        << " 7 - Set snake speed on 350 " << " 8 - Set snake speed on 400 " << endl
        << " 9 - Set snake speed on 450 "  << " 0 - Set snake speed on 500 " << endl
        << endl << "Press 1 to start game" << endl;
    cin >> a;
    if (a == 1) Start(1, __argv); // вызов функции Start.
 
};
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 18:49
Привет! Вот еще темы с ответами:

Как сделать невидимым консольное окно в программе, вызывающей диалог? - C++ WinAPI
Простая тестовая программа#include &lt;Windows.h&gt; int main(int argc, char* argv) { MessageBox(NULL, &quot;Окно&quot;, &quot;Заголовок окна&quot;,...

Сделать всегда активным дочернее окно - C++ WinAPI
При работе с дочерним окном иногда, когда происходят какие-то команды в главном окне, активным становится главное окно, а дочернее уходит...

Как сделать что бы не показывало консольное окно, а сразу графическое? - C++
Добрый день, как сделать что бы не показывало консольное окно, а сразу графическое? #include &lt;graphics.h&gt; void Mov(int st) { int...

как сделать консольное окно поверх всех окон - C++
сабж было бы очень удобно дебагить если можно было бы это сделать заранее спасибо


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.06.2014, 18:49
Ответ Создать тему
Опции темы

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