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

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Pahan-Titan
0 / 0 / 0
Регистрация: 22.11.2014
Сообщений: 14
#1

Таймер в C++ Builder. Анимация - C++ Builder

02.02.2015, 20:39. Просмотров 842. Ответов 14
Метки нет (Все метки)

Ребят нужна помощь (не ссылка а код). Нужна анимация:
- минуту висит картинка
- на нее вылазит следующая
- проходит 0.2 секунды
- на нее вылазит следующая
- проходит 0.2 секунды
- ...
- ну и на начало...

Проблема в таймере не могу разобраться как его написать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2015, 20:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Таймер в C++ Builder. Анимация (C++ Builder):

С++ Builder Таймер в форме - C++ Builder
Приведите пожалуйста пример работы таймера в форме, к примеру при нажатии кнопки таймер начинает отсчет.(Желательно чтобы этот отсчет виден...

Анимация C++ Builder - C++ Builder
Доброго времени суток. Мой вопрос вот в чем: 1. Как сделать, чтобы таймер повторялся, пока запущена программа (ну, вот как гирлянда на...

Анимация в С++ Builder - C++ Builder
Доброго всем время суток. Подскажите как сделать анимацию в С++ Builder. У меня есть нескьлько вариантов: -с помощью таймера -с помощью...

Анимация в c++ Builder xe4 - C++ Builder
Здравствуйте уважаемые программисты и пользователи форума. Недавно захотел улучшить свою программу а точнее ее интерфейс. Вот мне и пришла...

.gif анимация в C++ Builder 6 - C++ Builder
Здравствуйте, пытаюсь вставить стандартными средствами билдера .gif анимацию в формы. При попытке загрузить в TImage .gif ручками...

Какую библиотеку подключить в с++ builder для xpos, ypos (анимация)? - C++ Builder
привет всем) помогите пожалуйста в с++ я вообще новичок, так что не ругайте пожалуйста основную часть программы скатал с учебника...

14
ivan.-94
Я Фоюмчанин ? дааааа)
208 / 199 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
02.02.2015, 20:50 #2
У таймера изначально Interval в минуту ставьте - 60 000
C++
1
2
3
4
5
6
7
8
9
int frame=0, frameCount=5;
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    // показываем картинку c индексом frame
    frame+=1;
    if (frame>0&&Sender->Interval==60000) {Sender->Interval=200;}
    if (frame>=frameCount) {frame=0;}
}
//---------------------------------------------------------------------------
Добавлено через 1 минуту
Ну теперь создайте массив с изображениями и показывайте элемент с индексом frame.
frameCount - количество изображений, оно же и размерность массива.
0
Pahan-Titan
0 / 0 / 0
Регистрация: 22.11.2014
Сообщений: 14
02.02.2015, 21:02  [ТС] #3
А если у меня нет формы?
Ну то есть у меня создается окно и в него выводиться картинка.
нужно обьявить то есть #include <timer.h>?
и нужно немного изменить с формами что то так?
0
ivan.-94
Я Фоюмчанин ? дааааа)
208 / 199 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
03.02.2015, 00:05 #4
Цитата Сообщение от Pahan-Titan Посмотреть сообщение
А если у меня нет формы?
А куда выводится картинка? Рисуете на конве Десктопа ?
0
Pahan-Titan
0 / 0 / 0
Регистрация: 22.11.2014
Сообщений: 14
03.02.2015, 11:27  [ТС] #5
ivan.-94, создается окно указного размера и на него накладываеться фон. Если б задача была сделать в форме проблем бы не было.
0
SatanaXIII
Супер-модератор
Эксперт С++
5650 / 2695 / 252
Регистрация: 01.11.2011
Сообщений: 6,588
Завершенные тесты: 1
03.02.2015, 11:29 #6
Цитата Сообщение от Pahan-Titan Посмотреть сообщение
создается окно указного размера и на него накладываеться фон
Ежели покажите код, то вполне допустимо будет прямо туда и вписать смену ваших картинок.
0
ivan.-94
Я Фоюмчанин ? дааааа)
208 / 199 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
03.02.2015, 13:36 #7
Pahan-Titan, вы используете Open GL и при этом еще создаете окно функциями Win API интересно))
В вашем случае - нужно написать свою процедуру таймера.

Добавлено через 34 минуты
Pahan-Titan, вот вам таймер:
бросаете куда нибудь глобально, к примеру над оконной процедурой
Тут описываете действия таймера
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// ================================== Таймер
// глобальная область видимости
int Interval = 60000,  frame = 0, frameCount = 5;
void __stdcall someFunc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
//
//*****
// показываем картинку c индексом frame
    frame+=1;
    if (frame>0&&Interval==60000) {Interval=200;}
    if (frame>=frameCount) {frame=0;}
//*****
}
Глобальная переменная Interval - это интервал - изначально равен 60 000 - 1 минута.
и создание таймеров уже перед циклом обработки сообщений
C++
1
SetTimer(hWnd,0,Interval,(int(_stdcall*)())someFunc);
Только разберитесь что у вас frame что frameCount

Добавлено через 8 минут
Ты в своих функциях используй не 0 элемент texture[0], а frame texture[frame]
C++
1
2
3
4
5
// ================================== малювання фону
GLvoid Background()
{
glBindTexture(GL_TEXTURE_2D, texture[0]);   // накладання поточної текстури
.....
0
SatanaXIII
03.02.2015, 13:46
  #8

Не по теме:

Цитата Сообщение от ivan.-94 Посмотреть сообщение
вы используете Open GL и при этом еще создаете окно функциями Win API интересно
ivan.-94, скажите как вы определили, что у тс именно такая смесь? Я шесть раз прочитал его посты: никакой информации там нет.

0
ivan.-94
Я Фоюмчанин ? дааааа)
208 / 199 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
03.02.2015, 14:31 #9

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
ivan.-94, скажите как вы определили, что у тс именно такая смесь? Я шесть раз прочитал его посты: никакой информации там нет.
Он мне в лс отписал и сбросил проект.



Добавлено через 23 минуты
Pahan-Titan, Вот тут все очень хорошо на счет таймеров - думайте делайте.
Если не получится обращайтесь - у меня все получилось.
0
Pahan-Titan
0 / 0 / 0
Регистрация: 22.11.2014
Сообщений: 14
03.02.2015, 20:20  [ТС] #10
Объявил глобально
C++ (Qt)
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
//---------------------------------------------------------------------------
 
#include <clx.h>   //заголовочний файл для біблиотеки CLX
#include <gl.h>    // заголовочний файл для біблиотеки OpenGL32
#include <glu.h>   // заголовочний файл для біблиотеки GLu32
#include <glaux.h> // заголовочний файл для біблиотеки GLaux
#include <windows.h>
 
#pragma hdrstop
 
static HGLRC hRC;  // контекст візуалізації
static HDC hDC;    // контекст GDI
 
BOOL keys[256],      // масив для зберігання стану натиснення клавіш
     km=FALSE,       // прапорець стану активності клавіатури
     mm=FALSE,       // прапорець стану активності миші
     mousem=FALSE;   // прапорець переміщення миші
 
int  mouse1, mouse2; // координати положення миші
 
 
GLuint  texture[16];    // масив текстур
 
int xSize = 1600,  // робоча ширина вікна
    ySize = 900;   // робоча висота вікна
 
AUX_RGBImageRec *textures;
GLUquadricObj  *q; // графічний обєкт
 
int Interval = 10000,  frame = 0, frameCount = 5;
void __stdcall someFunc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    frame+=1;
    if (frame>0&&Interval==10000) {Interval=200;}
    if (frame>=frameCount) {frame=0;}
}
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
 
 
// ================================== завантаження текстур
 
GLvoid InitTexture(int num, char *name)
{
   // завантаження малюнка з файлу в масив текстур
   textures = auxDIBImageLoad(name);
   glGenTextures(1, &texture[num]);
   glBindTexture(GL_TEXTURE_2D, texture[num]);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
   glTexImage2D(GL_TEXTURE_2D, 0, 3, textures->sizeX, textures->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, textures->data);
}
 
// ================================== ініціалізація параметрів кадра
 
GLvoid Init(GLsizei Width, GLsizei Height)    // Вызвать после создания окна GL
{
InitTexture(0, "1back.bmp");    // завантаження текстури фону
InitTexture(1, "2bird1.bmp");   // завантаження текстури 1 лебідя
InitTexture(2, "2bird2.bmp");   // завантаження текстури 2 лебідя
InitTexture(3, "3wave.bmp");    // завантаження текстури хвиль
 
glEnable(GL_TEXTURE_2D);        // дозвіл накладання текстури
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // очищення екрану (чорний колір)
glClearDepth(1.0);                      // очищення буфера глибини
glDepthFunc(GL_LESS);                   // вибір типу теста глибини
glEnable(GL_DEPTH_TEST);                // дозвіл тесту глибини
glShadeModel(GL_SMOOTH);        // згладження кольорів
glMatrixMode(GL_PROJECTION);    // вибір матриці проекції
glLoadIdentity();               // скидання матриці проекції
glOrtho(-(GLfloat)Width/2,(GLfloat)Width/2,-(GLfloat)Height/2,(GLfloat)Height/2, -800,800);
                                // параметри орттгональної моделі кадру
 
glMatrixMode(GL_MODELVIEW);     // вибір матриці перегляду моделі
 
q = gluNewQuadric();  // створити квадратичний обєкт
gluQuadricNormals(q, GL_SMOOTH);  // тип нормалей
gluQuadricTexture(q, GL_TRUE);    // включення текстурних координат
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);// сферичне накладання
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);// сферічне відображення
 
}
 
// ================================== малювання фону
 
GLvoid BG()
{
glBindTexture(GL_TEXTURE_2D, texture[0]);   // накладання поточної текстури
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // параметри прозорості
 
glBegin(GL_QUADS); // фоновий малюнок
glTexCoord2f(0.0f, 0.0f); glVertex3f(-xSize/2, -ySize/2,  -100.0f);  // нижній лівий
glTexCoord2f(1.0f, 0.0f); glVertex3f( xSize/2, -ySize/2,  -100.0f);  // нижній правий
glTexCoord2f(1.0f, 1.0f); glVertex3f( xSize/2,  ySize/2,  -100.0f);  // верхній правий
glTexCoord2f(0.0f, 1.0f); glVertex3f(-xSize/2,  ySize/2,  -100.0f);  // верхній лівий
glEnd();
}
 
 
// ================================== малювання птаха
 
GLvoid Animation(GLfloat x, GLfloat y, int frame)
{
 
glBindTexture(GL_TEXTURE_2D, texture[frame]); // вибір текстури птаха
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // змішування
 
glBegin(GL_QUADS);  // область для відображення птаха
glTexCoord2f(0.0,1.0);glVertex2f(-100.0,-  0.0);
glTexCoord2f(1.0,1.0);glVertex2f(   0.0,   -  0.0);
glTexCoord2f(1.0,0.0);glVertex2f(   0.0,   -100.0);
glTexCoord2f(0.0,0.0);glVertex2f(-100.0,-100.0);
glEnd();
 
}
 
// =========================================== малювання сцени
 
 
GLvoid PicDraw(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// очищення кадру та буфера глибини
glLoadIdentity();            // скидання матриці
glEnable(GL_BLEND);          // дозвіл прозорості
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); //білий колір, прозорість100%
 
BG();                          // малювання фону
Animation(100,100, 1);         // малювання кадру 1
SetTimer(hWnd,0,Interval,(int(_stdcall*)())someFunc);
Animation(100,100, 2);  // малювання кадру 2
SetTimer(hWnd,0,Interval,(int(_stdcall*)())someFunc);
Animation(100,100, 3); // малювання кадру 3
}
выдает ошибку
[C++ Error] Unit1.cpp(133): E2451 Undefined symbol 'hWnd'
на первом же SetTimer
0
ivan.-94
Я Фоюмчанин ? дааааа)
208 / 199 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
03.02.2015, 21:12 #11
Pahan-Titan, Смотрите как сделал я:
У вас есть
C++
1
GLuint  texture[15];    // масив текстур
там же мы добавляем
C++
1
2
int frame=0, frameCount=4; // должно быть 15 - но у вас загружено только 4 картинки в InitFrame
// если написать 15 то 11 остальных будут просто белыми.
Далее мы объявляем глобальную переменную - время работы или же интервал таймера:
C++
1
int Interval = 60000;
Далее в WinMain создаем таймер без процедуры - следовательно срабатывание таймера нужно обработать в оконной процедуре WndProc у вас это WProcedure
Добавим следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
case WM_TIMER:
    switch (wParam)  // в wParam сообщения WM_TIMER хранится идентификатор таймера
    {
        case 0:
        KillTimer (hWnd, 0);  // уничтожение таймера с интервалом минута
        frame+=1;              // следующий кадр      
        Interval = 200;
               // создание таймера с интервалом 0,2 и уже с нашей процедурой смены кадров
        SetTimer(hWnd,0,Interval,(int(_stdcall*)())someFunc);
        break;
    }
Сама процедура таймера someFunc описывается глобально
C++
1
2
3
4
5
6
void __stdcall someFunc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    frame++;// смена кадра
    if (frame>=frameCount) {frame=1;}// если последний кадр - переходим к первому кадру
     // не к 0-ому, а к 1-му - так как на 0 кадре нет дождя)))
}
И еще в функции WinMain закомментировал проверку на активность клавиатуры.
Там, что то не так - завершает приложение досрочно)))
C++
1
2
if (mm /*|| km*/) SendMessage(hWnd,WM_CLOSE,0,0);
       // вихід, якщо було активовано мишу або клавіатуру
0
ivan.-94
Я Фоюмчанин ? дааааа)
208 / 199 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
03.02.2015, 21:21 #12
Весь код
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
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
//---------------------------------------------------------------------------
 
#include <clx.h>   //заголовочний файл для біблиотеки CLX
#include <gl.h>    // заголовочний файл для біблиотеки OpenGL32
#include <glu.h>   // заголовочний файл для біблиотеки GLu32
#include <glaux.h> // заголовочний файл для біблиотеки GLaux
 
#pragma hdrstop
 
static HGLRC hRC;  // контекст візуалізації
static HDC hDC;    // контекст GDI
 
BOOL keys[256],      // масив для зберігання стану натиснення клавіш
     km=FALSE,       // прапорець стану активності клавіатури
     mm=FALSE,       // прапорець стану активності клавіатури
     mousem=FALSE;   // прапорець переміщення миші
 
int  mouse1, mouse2; // координати положення миші
 
GLfloat xrot = 0.0f, xrstep=1.5f;    // кут обертання по осі X
 
GLint sanx=1500,   // початкове положення Санат Клауса
      sanxstep=15,   // крок руху Санта Клауса по Х
      sany=0;       // зміщення Санти по У
GLint numAuto = 1;
GLint in = 1,
      yn = 0;
GLuint  texture[15];    // масив текстур
int frame=0, frameCount=4;
 
int snowq=100;          // кількість сніжинок
int Snow[100][2];       // масив кооржинат сніжинок
 
bool snowflags[100],    // масив стану відображення стіжинок
     snowflag=true;     // зміня для напрямку проходження масиву сніжинок
 
int start=0,            // поточна сніжинка
    xs=0,               // зміщення сніжинки по Х
    ys=7;               // зміщення сніжинки по У
 
int xSize = 1600,  // робоча ширина вікна
    ySize = 900;   // робоча висота вікна
 
bool xdir=TRUE;    // прапорець напрямку коливання вогника
 
AUX_RGBImageRec *texture1;
GLUquadricObj  *q;
//---------------------------------------------------------------------------
 
#pragma argsused
 
// ================================== завантаження текстур
GLvoid LoadTexture(int num, char *name)
{
    // завантаження малюнка з файлу в масив текстур
    texture1 = auxDIBImageLoad(name);
    glGenTextures(1, &texture[num]);
    glBindTexture(GL_TEXTURE_2D, texture[num]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
}
// ================================== ініціалізація параметрів кадра
GLvoid InitFrame(GLsizei Width, GLsizei Height)    // Вызвать после создания окна GL
{
    LoadTexture(0, "kartinki.me2.bmp");    // завантаження текстури фону
    LoadTexture(1, "kartinki.me21.bmp");   // завантаження текстури 1
    LoadTexture(2, "kartinki.me22.bmp");    // завантаження текстури 2
    LoadTexture(3, "kartinki.me23.bmp");    // завантаження текстури 3
    //LoadTexture(4, "auto4.bmp");    // завантаження текстури вогника
    //LoadTexture(5, "auto5.bmp");    // завантаження текстури вогника
    //LoadTexture(6, "1desert00.bmp");    // завантаження текстури вогника
 
    glEnable(GL_TEXTURE_2D);        // дозвіл накладання текстури
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // очищення екрану (чорний колір)
    glClearDepth(1.0);                      // очищення буфера глибини
    glDepthFunc(GL_LESS);                   // вибір типу теста глибини
    glEnable(GL_DEPTH_TEST);                // дозвіл тесту глибини
    glShadeModel(GL_SMOOTH);        // згладження кольорів
    glMatrixMode(GL_PROJECTION);    // вибір матриці проекції
    glLoadIdentity();               // скидання матриці проекції
    glOrtho(-(GLfloat)Width/2,(GLfloat)Width/2,-(GLfloat)Height/2,(GLfloat)Height/2, -800,800);
                                // параметри орттгональної моделі кадру
    glMatrixMode(GL_MODELVIEW);     // вибір матриці перегляду моделі
 
    q = gluNewQuadric();  // створити квадратичний обєкт
    gluQuadricNormals(q, GL_SMOOTH);  // тип нормалей
    gluQuadricTexture(q, GL_TRUE);    // включення текстурних координат
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);// сферичне накладання
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);// сферічне відображення
}
// ===============================
void init (void)
{
    GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
    GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
/* устанавливаем параметры источника света */
    glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv (GL_LIGHT0, GL_POSITION, light_position);
/* включаем освещение и источник света */
 
    glEnable (GL_LIGHTING);
    glEnable (GL_LIGHT0);
/* включаем z-буфер */
    glEnable(GL_DEPTH_TEST);
}
// ================================== малювання фону
GLvoid Background()
{
    glBindTexture(GL_TEXTURE_2D, texture[frame]);   // накладання поточної текстури
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // параметри прозорості
    glBegin(GL_QUADS); // фоновий малюнок
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-xSize/2, -ySize/2,  -1);  // нижній лівий
    glTexCoord2f(1.0f, 0.0f); glVertex3f( xSize/2, -ySize/2,  -1);  // нижній правий
    glTexCoord2f(1.0f, 1.0f); glVertex3f( xSize/2, -ySize/2+900,  -1);  // верхній правий
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-xSize/2, -ySize/2+900,  -1);  // верхній лівий
    glEnd();
}
// =========================================== малювання сцени
GLvoid DrawScene(GLvoid)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// очищення кадру та буфера глибини
    glLoadIdentity();            // скидання матриці
    glEnable(GL_BLEND);          // дозвіл прозорості
    yn++;
    if (yn>=xSize) {yn=0;}
    Background();               // малювання фону
//================================================================
    if (xdir)                   // якщо рух вправо
    {
        xrot+=xrstep;                     // збільшення кута відхилення вправо
        if (xrot>=3) {xdir=false;}  // зміна напрямку
    }
    else
    {
        xrot-=xrstep;                 // збільшення кута відхилення вліво
        if (xrot<=-3) {xdir=true;}   // зміна напрямку
    }
}
 
 
// ================================== Таймер
// глобальная область видимости
int Interval = 60000;
void __stdcall someFunc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    frame++;
    if (frame>=frameCount) {frame=1;}
}
// ================================== віконна процедура
LRESULT CALLBACK WProcedure(    HWND    hWnd,
                                UINT    message,
                                WPARAM  wParam,
                                LPARAM  lParam)
{
    RECT    Screen;         // прямокутник вікна для зберігання розмірів
    GLuint  PixelFormat;
    static  PIXELFORMATDESCRIPTOR pfd=
        {
            sizeof(PIXELFORMATDESCRIPTOR), // розмір структури
            1,                             // номер версії
            PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
            // малювання вікна + підтримка OpenGL + подвійний буфер + RGBA формат
            32,                            // вибір глибини кольору
            0, 0, 0, 0, 0, 0,              // ігнорування параметрів кольорів
            0, 0,                          // ігнорування буфера прозорості
            0,                             // ігнорування буфера акумуляції
            0, 0, 0, 0,                    // ігнорування буфера акумуляції
            32,                            // 32 бітний Z-буфер (буфер глибини)
            0,                             // ігнорування буфера траффарета
            0,                             // ігнорування допоміжних буферів
            PFD_MAIN_PLANE,                // основний шар для малювання
            0,
            0, 0, 0                        // ігнорування шарових масок
        };
    switch (message)        // перебір типів повідомлень
    {
        case WM_CREATE:         // створення вікна
            hDC = GetDC(hWnd);      // отримання контексту пристрою для вінка
            PixelFormat = ChoosePixelFormat(hDC, &pfd);
                    // знаходження формат пікселів, що підтримується
            if (!PixelFormat)
            {
                MessageBox(0, "Неможливо знайти відовідний формат пікселів.", "Помилка!", MB_OK | MB_ICONERROR);
                PostQuitMessage(0);  // повідомлення для заверщення програми
                break;               //
            }
            if(!SetPixelFormat(hDC,PixelFormat,&pfd))
            {
                MessageBox(0, "Неможливо встановити формат пікселів.", "Помилка!", MB_OK | MB_ICONERROR);
                PostQuitMessage(0);  // повідомлення для заверщення програми
                break;
            }
            hRC = wglCreateContext(hDC);
            if(!hRC)
            {
                MessageBox(0, "Неможливо створити контекст рендерингу GL.", "Помилка!", MB_OK | MB_ICONERROR);
                PostQuitMessage(0);  // повідомлення для заверщення програми
                break;
            }
            if(!wglMakeCurrent(hDC, hRC))
            {
                MessageBox(0, "Неможливо активувати GLRC.", "Помилка!", MB_OK | MB_ICONERROR);
                PostQuitMessage(0);  // повідомлення для заверщення програми
                break;
            }
            GetClientRect(hWnd, &Screen);           // отримання розмірів клієнтської частини вікна
            InitFrame(Screen.right, Screen.bottom); // ініціалізація кадру з розмірами вікна
            break;
        case WM_DESTROY:       // знищення вікна
        case WM_CLOSE:         // закриття вікна
            ChangeDisplaySettings(NULL, 0);
 
            wglMakeCurrent(hDC,NULL);
            wglDeleteContext(hRC);
            ReleaseDC(hWnd,hDC);
 
            PostQuitMessage(0);
            break;
        case WM_TIMER:
            switch (wParam)  // в wParam сообщения WM_TIMER хранится идентификатор таймера
            {
                case 0:
                KillTimer (hWnd, 0);  // уничтожение таймеров
                frame+=1;                    
                Interval = 200;
                SetTimer(hWnd,0,Interval,(int(_stdcall*)())someFunc);
                break;
            }
        case WM_KEYDOWN:       // відстеження натиснення клавіші на клавіатурі
            keys[wParam]=true; // запамятати натиснуту клавішу
            if (!keys[VK_LEFT] && !keys[VK_RIGHT]) {km=TRUE;}
            // якщо не ВЛІВО або ВПРАВО, то можна буде виходити з програми
            break;
        case WM_KEYUP:       // відстеження відпускання натисненої клавіші
            keys[wParam]=false;
            break;
        case WM_LBUTTONDOWN:   // відстеження натиснення лівої кнопки миші
        case WM_RBUTTONDOWN:   // відстеження натиснення правої кнопки миші
        case WM_MOUSEWHEEL:    // відстеження руху коліщатка миші
            mm=TRUE;
            break;
 
        case WM_MOUSEMOVE:     // відстеження руху миші
            mouse2= LOWORD(lParam);
        if (!mousem)
        {
            mouse1=mouse2;
            mousem=TRUE;
        }
        if (mouse1!=mouse2) mm=TRUE;
        break;
 
        default:
        return (DefWindowProc(hWnd, message, wParam, lParam));
    }
    return (0);
}
 
// ================================== головна процедура
 
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG             msg;    // структура повідомлення Windows
    WNDCLASS        wc;     // структура класу Windows для встановлення типу вікна
    HWND            hWnd;   // дескриптор вікна
    wc.style                = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc          = (WNDPROC) WProcedure;   // призначення віконної процедури
    wc.cbClsExtra           = 0;
    wc.cbWndExtra           = 0;
    wc.hInstance            = hInstance;
    wc.hIcon                = NULL;
    wc.hCursor              = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground        = NULL;
    wc.lpszMenuName         = NULL;
    wc.lpszClassName        = "OpenGL WinClass";
    if(!RegisterClass(&wc))
    {
        MessageBox(0,"Помилка при реєстрації класу вікна.", "Помилка!", MB_OK | MB_ICONERROR);
        return FALSE;
    }
    hWnd = CreateWindow(
        "OpenGL WinClass",
        "Заставка 'Дощ'. Кравченко КС-1101", // заголовок вікна
 
        WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
 
        0, 0,          // координати початкової точки вікна (верхній лівий кут)
        xSize, ySize,  // ширина та висота вікна
        NULL,
        NULL,
        hInstance,
        NULL);
    if(!hWnd)
    {
        MessageBox(0,"Помилка при створенні вікна.", "Помилка!", MB_OK | MB_ICONERROR);
        return FALSE;
    }
 
    ///*
    DEVMODE dmScreenSettings;                         // структура для пристрою виведення зображення
    memset(&dmScreenSettings, 0, sizeof(DEVMODE));    // виділення пам'яті для структури
    dmScreenSettings.dmSize = sizeof(DEVMODE);        // розмір структури
    dmScreenSettings.dmPelsWidth    = xSize;          // ширина екрану
    dmScreenSettings.dmPelsHeight   = ySize;          // висота экрану
    dmScreenSettings.dmFields       = DM_PELSWIDTH | DM_PELSHEIGHT; // режим пікселя
    ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);       // повний екран
    //*/
 
    ShowWindow(hWnd, SW_SHOW);   // візуалізація створеного вікна
    UpdateWindow(hWnd);          // оновлення вікна
    SetFocus(hWnd);              // активізація вікна
    ShowCursor(false);           // приховання курсору
 
    // создание таймеров
    SetTimer(hWnd,0,Interval, 0);
 
    while (1)
    {
        // обработка системних повідомлень
        while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
        {
            if (GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                return TRUE;
            }
        }
 
        randomize();
 
        DrawScene();      // малювання сцени
        SwapBuffers(hDC);   // перемикання буферу екрана
        if (keys[VK_LEFT]) {if (xs>-10) {xs--;}} // зміщення сніжинок вліво
        if (keys[VK_RIGHT]) {if (xs<10) {xs++;}} // зміщення сніжинок вправо
 
        if (mm /*|| km*/) SendMessage(hWnd,WM_CLOSE,0,0);
       // вихід, якщо було активовано мишу або клавіатуру
    }
}
 
//---------------------------------------------------------------------------


Добавлено через 5 минут
Ах да забыл
И еще как говорилось ранее в GLvoid Background() рисуем не 0 текстуру на ту самую frame
C++
1
2
3
4
5
6
7
8
9
10
11
12
GLvoid Background()
{
    glBindTexture(GL_TEXTURE_2D, texture[frame]);   // накладання поточної текстури
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // параметри прозорості
    glBegin(GL_QUADS); // фоновий малюнок
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-xSize/2, -ySize/2,  -1);  // нижній лівий
    glTexCoord2f(1.0f, 0.0f); glVertex3f( xSize/2, -ySize/2,  -1);  // нижній правий
    glTexCoord2f(1.0f, 1.0f); glVertex3f( xSize/2, -ySize/2+900,  -1);  // верхній правий
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-xSize/2, -ySize/2+900,  -1);  // верхній лівий
    glEnd();
}
0
Pahan-Titan
0 / 0 / 0
Регистрация: 22.11.2014
Сообщений: 14
03.02.2015, 21:53  [ТС] #13
Та же проблема осталась
всё сделал как Вы написали
написал в какой строчке проблема

C++ (Qt)
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
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
//---------------------------------------------------------------------------
 
#include <clx.h>   //заголовочний файл для біблиотеки CLX
#include <gl.h>    // заголовочний файл для біблиотеки OpenGL32
#include <glu.h>   // заголовочний файл для біблиотеки GLu32
#include <glaux.h> // заголовочний файл для біблиотеки GLaux
#include <math.h>
#include <windows.h>
 
#pragma hdrstop
 
static HGLRC hRC;  // контекст візуалізації
static HDC hDC;    // контекст GDI
 
BOOL keys[256],      // масив для зберігання стану натиснення клавіш
     km=FALSE,       // прапорець стану активності клавіатури
     mm=FALSE,       // прапорець стану активності миші
     mousem=FALSE;   // прапорець переміщення миші
 
int  mouse1, mouse2; // координати положення миші
 
GLuint  texture[16];    // масив текстур
int frame=0, frameCount=4;
int xSize = 1600,  // робоча ширина вікна
    ySize = 900;   // робоча висота вікна
 
 
AUX_RGBImageRec *textures;
GLUquadricObj  *q; // графічний обєкт
 
int Interval = 10000;
void __stdcall someFunc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    frame++;
    if (frame>=frameCount) {frame=1;}
}
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
// ================================== завантаження текстур
 
GLvoid InitTexture(int num, char *name)
{
   // завантаження малюнка з файлу в масив текстур
   textures = auxDIBImageLoad(name);
   glGenTextures(1, &texture[num]);
   glBindTexture(GL_TEXTURE_2D, texture[num]);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
   glTexImage2D(GL_TEXTURE_2D, 0, 3, textures->sizeX, textures->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, textures->data);
}
 
// ================================== ініціалізація параметрів кадра
 
GLvoid Init(GLsizei Width, GLsizei Height)    // Вызвать после создания окна GL
{
InitTexture(0, "1back.bmp");    // завантаження текстури фону
InitTexture(1, "2bird1.bmp");   // завантаження текстури 1 лебідя
InitTexture(2, "2bird2.bmp");   // завантаження текстури 2 лебідя
InitTexture(3, "3wave.bmp");    // завантаження текстури хвиль
 
glEnable(GL_TEXTURE_2D);        // дозвіл накладання текстури
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // очищення екрану (чорний колір)
glClearDepth(1.0);                      // очищення буфера глибини
glDepthFunc(GL_LESS);                   // вибір типу теста глибини
glEnable(GL_DEPTH_TEST);                // дозвіл тесту глибини
glShadeModel(GL_SMOOTH);        // згладження кольорів
glMatrixMode(GL_PROJECTION);    // вибір матриці проекції
glLoadIdentity();               // скидання матриці проекції
glOrtho(-(GLfloat)Width/2,(GLfloat)Width/2,-(GLfloat)Height/2,(GLfloat)Height/2, -800,800);
                                // параметри орттгональної моделі кадру
 
glMatrixMode(GL_MODELVIEW);     // вибір матриці перегляду моделі
}
 
// ================================== малювання фону
 
GLvoid BG()
{
glBindTexture(GL_TEXTURE_2D, texture[0]);   // накладання поточної текстури
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // параметри прозорості
 
glBegin(GL_QUADS); // фоновий малюнок
glTexCoord2f(0.0f, 0.0f); glVertex3f(-xSize/2, -ySize/2,  -100.0f);  // нижній лівий
glTexCoord2f(1.0f, 0.0f); glVertex3f( xSize/2, -ySize/2,  -100.0f);  // нижній правий
glTexCoord2f(1.0f, 1.0f); glVertex3f( xSize/2,  ySize/2,  -100.0f);  // верхній правий
glTexCoord2f(0.0f, 1.0f); glVertex3f(-xSize/2,  ySize/2,  -100.0f);  // верхній лівий
glEnd();
}
 
 
// ================================== малювання птаха
 
GLvoid WaterBird(int frame)
{
 
glBindTexture(GL_TEXTURE_2D, texture[frame]); // вибір текстури птаха
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // змішування
 
glBegin(GL_QUADS);  // область для відображення птаха
glTexCoord2f(0.0f, 0.0f); glVertex3f(-xSize/2, -ySize/2,  -100.0f);  // нижній лівий
glTexCoord2f(1.0f, 0.0f); glVertex3f( xSize/2, -ySize/2,  -100.0f);  // нижній правий
glTexCoord2f(1.0f, 1.0f); glVertex3f( xSize/2,  ySize/2,  -100.0f);  // верхній правий
glTexCoord2f(0.0f, 1.0f); glVertex3f(-xSize/2,  ySize/2,  -100.0f);  // верхній лівий
glEnd();
 
}
 
// =========================================== малювання сцени
 
GLvoid PicDraw(GLvoid)
{
 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// очищення кадру та буфера глибини
glLoadIdentity();            // скидання матриці
 
glEnable(GL_BLEND);          // дозвіл прозорості
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); //білий колір, прозорість100%
 
BG();                            // малювання фону
WaterBird(1);
SetTimer(hWnd,0,Interval,(int(_stdcall*)())someFunc);       // ТУТ ПРОБЛЕМА
WaterBird(2);  // малювання птаха 2
}
 
 
// ================================== віконна процедура
 
LRESULT CALLBACK WindProc(HWND    hWnd,
                          UINT    message,
                          WPARAM  wParam,
                          LPARAM  lParam)
{
        RECT    Screen;         // прямокутник вікна для зберігання розмірів
        GLuint  PixelFormat;
        static  PIXELFORMATDESCRIPTOR pfd=
        {
        sizeof(PIXELFORMATDESCRIPTOR), // розмір структури
        1,                             // номер версії
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
        // малювання вікна + підтримка OpenGL + подвійний буфер + RGBA формат
        32,                            // вибір глибини кольору
        0, 0, 0, 0, 0, 0,              // ігнорування параметрів кольорів
        0, 0,                          // ігнорування буфера прозорості
        0,                             // ігнорування буфера акумуляції
        0, 0, 0, 0,                    // ігнорування буфера акумуляції
        32,                            // 32 бітний Z-буфер (буфер глибини)
        0,                             // ігнорування буфера траффарета
        0,                             // ігнорування допоміжних буферів
        PFD_MAIN_PLANE,                // основний шар для малювання
        0,
        0, 0, 0                        // ігнорування шарових масок
        };
         switch (message)        // перебір типів повідомлень
        {
         case WM_CREATE:         // створення вікна
                hDC = GetDC(hWnd);      // отримання контексту пристрою для вінка
                PixelFormat = ChoosePixelFormat(hDC, &pfd);
                        // знаходження формат пікселів, що підтримується
                if (!PixelFormat)
                 {
                  MessageBox(0, "Неможливо знайти відовідний формат пікселів.", "Помилка!", MB_OK | MB_ICONERROR);
                  PostQuitMessage(0);  // повідомлення для заверщення програми
                  break;               //
                 }
                if(!SetPixelFormat(hDC,PixelFormat,&pfd))
                 {
                  MessageBox(0, "Неможливо встановити формат пікселів.", "Помилка!", MB_OK | MB_ICONERROR);
                  PostQuitMessage(0);  // повідомлення для заверщення програми
                  break;
                 }
                hRC = wglCreateContext(hDC);
                if(!hRC)
                 {
                  MessageBox(0, "Неможливо створити контекст рендерингу GL.", "Помилка!", MB_OK | MB_ICONERROR);
                  PostQuitMessage(0);  // повідомлення для заверщення програми
                  break;
                 }
                if(!wglMakeCurrent(hDC, hRC))
                 {
                  MessageBox(0, "Неможливо активувати GLRC.", "Помилка!", MB_OK | MB_ICONERROR);
                  PostQuitMessage(0);  // повідомлення для заверщення програми
                  break;
                 }
                GetClientRect(hWnd, &Screen);           // отримання розмірів клієнтської частини вікна
                Init(Screen.right, Screen.bottom); // ініціалізація кадру з розмірами вікна
                break;
          case WM_DESTROY:       // знищення вікна
          case WM_CLOSE:         // закриття вікна
                ChangeDisplaySettings(NULL, 0);
 
                wglMakeCurrent(hDC,NULL);
                wglDeleteContext(hRC);
                ReleaseDC(hWnd,hDC);
 
                PostQuitMessage(0);
                break;
    case WM_TIMER:
    switch (wParam)  // в wParam сообщения WM_TIMER хранится идентификатор таймера
    {
        case 0:
        KillTimer (hWnd, 0);  // уничтожение таймера с интервалом минута
        frame+=1;              // следующий кадр
        Interval = 200;
               // создание таймера с интервалом 0,2 и уже с нашей процедурой смены кадров
        SetTimer(hWnd,0,Interval,(int(_stdcall*)())someFunc);
        break;
    }
          case WM_KEYDOWN:       // відстеження натиснення клавіші на клавіатурі
               keys[wParam]=true; // запамятати натиснуту клавішу
               if (!keys['1'] && !keys['2'] && !keys['3'] && !keys['4'] && !keys['5'] && !keys['6'] && !keys['7']) {km=TRUE;}
                // якщо не цифри 1-7, то можна буде виходити з програми
               break;
          case WM_KEYUP:       // відстеження відпускання натисненої клавіші
               keys[wParam]=false;
               break;
          case WM_LBUTTONDOWN:   // відстеження натиснення лівої кнопки миші
          case WM_RBUTTONDOWN:   // відстеження натиснення правої кнопки миші
          case WM_MOUSEWHEEL:    // відстеження руху коліщатка миші
                mm=TRUE;
                break;
 
          case WM_MOUSEMOVE:     // відстеження руху миші
                mouse2= LOWORD(lParam);
                if (!mousem)
                {
                 mouse1=mouse2;
                 mousem=TRUE;
                }
                if (mouse1!=mouse2) mm=TRUE;
                break;
 
          default:
                return (DefWindowProc(hWnd, message, wParam, lParam));
        }
 
 
        return (0);
}
 
// ================================== головна процедура
 
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG             msg;    // структура повідомлення Windows
WNDCLASS        wc;     // структура класу Windows для встановлення типу вікна
HWND            hWnd;   // дескриптор вікна
wc.style                = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc          = (WNDPROC) WindProc;   // призначення віконної процедури
wc.cbClsExtra           = 0;
wc.cbWndExtra           = 0;
wc.hInstance            = hInstance;
wc.hIcon                = NULL;
wc.hCursor              = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground        = NULL;
wc.lpszMenuName         = NULL;
wc.lpszClassName        = "OpenGL WinClass";
if(!RegisterClass(&wc))
        {
        MessageBox(0,"Помилка при реєстрації класу вікна.", "Помилка!", MB_OK | MB_ICONERROR);
        return FALSE;
        }
hWnd = CreateWindow(
        "OpenGL WinClass",
        "Озеро та птахи", // заголовок вікна
 
        WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
 
        0, 0,          // координати початкової точки вікна (верхній лівий кут)
        xSize, ySize,  // ширина та висота вікна
 
        NULL,
        NULL,
        hInstance,
        NULL);
if(!hWnd)
        {
        MessageBox(0,"Помилка при створенні вікна.", "Помилка!", MB_OK | MB_ICONERROR);
        return FALSE;
        }
 
DEVMODE dmScreenSettings;                         // структура для пристрою виведення зображення
memset(&dmScreenSettings, 0, sizeof(DEVMODE));    // виділення пам'яті для структури
dmScreenSettings.dmSize = sizeof(DEVMODE);        // розмір структури
dmScreenSettings.dmPelsWidth    = xSize;          // ширина екрану
dmScreenSettings.dmPelsHeight   = ySize;          // висота экрану
dmScreenSettings.dmFields       = DM_PELSWIDTH | DM_PELSHEIGHT; // режим пікселя
ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);       // повний екран
 
ShowWindow(hWnd, SW_SHOW);   // візуалізація створеного вікна
UpdateWindow(hWnd);          // оновлення вікна
SetFocus(hWnd);              // активізація вікна
ShowCursor(false);           // приховання курсору
 
SetTimer(hWnd,0,Interval, 0);
 
while (1)
{
 // обработка системних повідомлень
 while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
  {
   if (GetMessage(&msg, NULL, 0, 0))
   {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
   else
   {
    return TRUE;
   }
  }
 
 PicDraw();      // малювання сцени
 
 SwapBuffers(hDC);   // перемикання буферу екрана
 
 
 if (mm || km) SendMessage(hWnd,WM_CLOSE,0,0);
   // вихід, якщо було активовано мишу або клавіатуру
 }
}
0
ivan.-94
Я Фоюмчанин ? дааааа)
208 / 199 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
03.02.2015, 22:14 #14
Pahan-Titan, Я вам сбросил полностью код.
У вас там конечно проблема - так как вы пытаетесь обратится к переменной hWnd которая не определена в PicDraw
Таймер нужно создавать либо в WinMain либо в WndProc(у вас WProcedure).
0
Pahan-Titan
0 / 0 / 0
Регистрация: 22.11.2014
Сообщений: 14
04.02.2015, 11:37  [ТС] #15
Я вас понял но видно это не мое решение проблемы(
Да оно работает если переместить рисования сцены в WinProc
но анимации и близко нету(
C++ (Qt)
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
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
#include <clx.h>   //заголовочний файл для біблиотеки CLX
#include <gl.h>    // заголовочний файл для біблиотеки OpenGL32
#include <glu.h>   // заголовочний файл для біблиотеки GLu32
#include <glaux.h> // заголовочний файл для біблиотеки GLaux
#include <windows.h>
 
#pragma hdrstop
 
static HGLRC hRC;  // контекст візуалізації
static HDC hDC;    // контекст GDI
 
BOOL keys[256],      // масив для зберігання стану натиснення клавіш
     km=FALSE,       // прапорець стану активності клавіатури
     mm=FALSE,       // прапорець стану активності миші
     mousem=FALSE;   // прапорець переміщення миші
 
int  mouse1, mouse2; // координати положення миші
 
GLuint  texture[16];    // масив текстур
int frame=0, frameCount=4;
int xSize = 1600,  // робоча ширина вікна
    ySize = 900;   // робоча висота вікна
 
 
AUX_RGBImageRec *textures;
GLUquadricObj  *q; // графічний обєкт
 
int Interval = 10000;
void __stdcall someFunc (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    frame++;
    if (frame>=frameCount) {frame=1;}
}
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
// ================================== завантаження текстур
 
GLvoid InitTexture(int num, char *name)
{
   // завантаження малюнка з файлу в масив текстур
   textures = auxDIBImageLoad(name);
   glGenTextures(1, &texture[num]);
   glBindTexture(GL_TEXTURE_2D, texture[num]);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
   glTexImage2D(GL_TEXTURE_2D, 0, 3, textures->sizeX, textures->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, textures->data);
}
 
// ================================== ініціалізація параметрів кадра
 
GLvoid Init(GLsizei Width, GLsizei Height)    // Вызвать после создания окна GL
{
InitTexture(0, "1back.bmp");    // завантаження текстури фону
InitTexture(1, "2bird1.bmp");   // завантаження текстури 1 лебідя
InitTexture(2, "2bird2.bmp");   // завантаження текстури 2 лебідя
InitTexture(3, "3wave.bmp");    // завантаження текстури хвиль
 
glEnable(GL_TEXTURE_2D);        // дозвіл накладання текстури
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // очищення екрану (чорний колір)
glClearDepth(1.0);                      // очищення буфера глибини
glDepthFunc(GL_LESS);                   // вибір типу теста глибини
glEnable(GL_DEPTH_TEST);                // дозвіл тесту глибини
glShadeModel(GL_SMOOTH);        // згладження кольорів
glMatrixMode(GL_PROJECTION);    // вибір матриці проекції
glLoadIdentity();               // скидання матриці проекції
glOrtho(-(GLfloat)Width/2,(GLfloat)Width/2,-(GLfloat)Height/2,(GLfloat)Height/2, -800,800);
                                // параметри орттгональної моделі кадру
 
glMatrixMode(GL_MODELVIEW);     // вибір матриці перегляду моделі
}
 
// ================================== малювання фону
 
GLvoid BG()
{
 
glBindTexture(GL_TEXTURE_2D, texture[0]);   // накладання поточної текстури
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // параметри прозорості
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// очищення кадру та буфера глибини
glLoadIdentity();            // скидання матриці
 
glBegin(GL_QUADS); // фоновий малюнок
glTexCoord2f(0.0f, 0.0f); glVertex3f(-xSize/2, -ySize/2,  -100.0f);  // нижній лівий
glTexCoord2f(1.0f, 0.0f); glVertex3f( xSize/2, -ySize/2,  -100.0f);  // нижній правий
glTexCoord2f(1.0f, 1.0f); glVertex3f( xSize/2,  ySize/2,  -100.0f);  // верхній правий
glTexCoord2f(0.0f, 1.0f); glVertex3f(-xSize/2,  ySize/2,  -100.0f);  // верхній лівий
glEnd();
}
 
 
// ================================== малювання птаха
 
GLvoid WaterBird(int frame)
{
 
glBindTexture(GL_TEXTURE_2D, texture[frame]); // вибір текстури птаха
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // змішування
glEnable(GL_BLEND);          // дозвіл прозорості
 
glBegin(GL_QUADS);  // область для відображення птаха
glTexCoord2f(0.0f, 0.0f); glVertex3f(-xSize/2, -ySize/2,  -100.0f);  // нижній лівий
glTexCoord2f(1.0f, 0.0f); glVertex3f( xSize/2, -ySize/2,  -100.0f);  // нижній правий
glTexCoord2f(1.0f, 1.0f); glVertex3f( xSize/2,  ySize/2,  -100.0f);  // верхній правий
glTexCoord2f(0.0f, 1.0f); glVertex3f(-xSize/2,  ySize/2,  -100.0f);  // верхній лівий
glEnd();
 
}
 
// =========================================== малювання сцени
 
GLvoid PicDraw(GLvoid)
{
 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// очищення кадру та буфера глибини
glLoadIdentity();            // скидання матриці
glEnable(GL_BLEND);          // дозвіл прозорості
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); //білий колір, прозорість100%
 
BG();                            // малювання фону
WaterBird(1);
//SetTimer(hWnd,0,Interval,(int(_stdcall*)())someFunc);       // ТУТ ПРОБЛЕМА
WaterBird(2);  // малювання птаха 2
}
 
 
// ================================== віконна процедура
 
LRESULT CALLBACK WindProc(HWND    hWnd,
                          UINT    message,
                          WPARAM  wParam,
                          LPARAM  lParam)
{
        RECT    Screen;         // прямокутник вікна для зберігання розмірів
        GLuint  PixelFormat;
        static  PIXELFORMATDESCRIPTOR pfd=
        {
        sizeof(PIXELFORMATDESCRIPTOR), // розмір структури
        1,                             // номер версії
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
        // малювання вікна + підтримка OpenGL + подвійний буфер + RGBA формат
        32,                            // вибір глибини кольору
        0, 0, 0, 0, 0, 0,              // ігнорування параметрів кольорів
        0, 0,                          // ігнорування буфера прозорості
        0,                             // ігнорування буфера акумуляції
        0, 0, 0, 0,                    // ігнорування буфера акумуляції
        32,                            // 32 бітний Z-буфер (буфер глибини)
        0,                             // ігнорування буфера траффарета
        0,                             // ігнорування допоміжних буферів
        PFD_MAIN_PLANE,                // основний шар для малювання
        0,
        0, 0, 0                        // ігнорування шарових масок
        };
         switch (message)        // перебір типів повідомлень
        {
         case WM_CREATE:         // створення вікна
                hDC = GetDC(hWnd);      // отримання контексту пристрою для вінка
                PixelFormat = ChoosePixelFormat(hDC, &pfd);
                        // знаходження формат пікселів, що підтримується
                if (!PixelFormat)
                 {
                  MessageBox(0, "Неможливо знайти відовідний формат пікселів.", "Помилка!", MB_OK | MB_ICONERROR);
                  PostQuitMessage(0);  // повідомлення для заверщення програми
                  break;               //
                 }
                if(!SetPixelFormat(hDC,PixelFormat,&pfd))
                 {
                  MessageBox(0, "Неможливо встановити формат пікселів.", "Помилка!", MB_OK | MB_ICONERROR);
                  PostQuitMessage(0);  // повідомлення для заверщення програми
                  break;
                 }
                hRC = wglCreateContext(hDC);
                if(!hRC)
                 {
                  MessageBox(0, "Неможливо створити контекст рендерингу GL.", "Помилка!", MB_OK | MB_ICONERROR);
                  PostQuitMessage(0);  // повідомлення для заверщення програми
                  break;
                 }
                if(!wglMakeCurrent(hDC, hRC))
                 {
                  MessageBox(0, "Неможливо активувати GLRC.", "Помилка!", MB_OK | MB_ICONERROR);
                  PostQuitMessage(0);  // повідомлення для заверщення програми
                  break;
                 }
                GetClientRect(hWnd, &Screen);           // отримання розмірів клієнтської частини вікна
                Init(Screen.right, Screen.bottom); // ініціалізація кадру з розмірами вікна
                break;
          case WM_DESTROY:       // знищення вікна
          case WM_CLOSE:         // закриття вікна
                ChangeDisplaySettings(NULL, 0);
 
                wglMakeCurrent(hDC,NULL);
                wglDeleteContext(hRC);
                ReleaseDC(hWnd,hDC);
 
                PostQuitMessage(0);
                break;
    case WM_TIMER:
    switch (wParam)  // в wParam сообщения WM_TIMER хранится идентификатор таймера
    {
        case 0:
        KillTimer (hWnd, 0);  // уничтожение таймера с интервалом минута
        frame+=1;              // следующий кадр
        Interval = 5000;
               // создание таймера с интервалом 0,2 и уже с нашей процедурой смены кадров
        break;
    }
          case WM_KEYDOWN:       // відстеження натиснення клавіші на клавіатурі
               keys[wParam]=true; // запамятати натиснуту клавішу
               if (!keys['1'] && !keys['2'] && !keys['3'] && !keys['4'] && !keys['5'] && !keys['6'] && !keys['7']) {km=TRUE;}
                // якщо не цифри 1-7, то можна буде виходити з програми
               break;
          case WM_KEYUP:       // відстеження відпускання натисненої клавіші
               keys[wParam]=false;
               break;
          case WM_LBUTTONDOWN:   // відстеження натиснення лівої кнопки миші
          case WM_RBUTTONDOWN:   // відстеження натиснення правої кнопки миші
          case WM_MOUSEWHEEL:    // відстеження руху коліщатка миші
                mm=TRUE;
                break;
 
          case WM_MOUSEMOVE:     // відстеження руху миші
                mouse2= LOWORD(lParam);
                if (!mousem)
                {
                 mouse1=mouse2;
                 mousem=TRUE;
                }
                if (mouse1!=mouse2) mm=TRUE;
                break;
 
          default:
                return (DefWindowProc(hWnd, message, wParam, lParam));
        }
 
 
        return (0);
}
 
// ================================== головна процедура
 
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG             msg;    // структура повідомлення Windows
WNDCLASS        wc;     // структура класу Windows для встановлення типу вікна
HWND            hWnd;   // дескриптор вікна
wc.style                = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc          = (WNDPROC) WindProc;   // призначення віконної процедури
wc.cbClsExtra           = 0;
wc.cbWndExtra           = 0;
wc.hInstance            = hInstance;
wc.hIcon                = NULL;
wc.hCursor              = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground        = NULL;
wc.lpszMenuName         = NULL;
wc.lpszClassName        = "OpenGL WinClass";
if(!RegisterClass(&wc))
        {
        MessageBox(0,"Помилка при реєстрації класу вікна.", "Помилка!", MB_OK | MB_ICONERROR);
        return FALSE;
        }
hWnd = CreateWindow(
        "OpenGL WinClass",
        "Озеро та птахи", // заголовок вікна
 
        WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
 
        0, 0,          // координати початкової точки вікна (верхній лівий кут)
        xSize, ySize,  // ширина та висота вікна
 
        NULL,
        NULL,
        hInstance,
        NULL);
if(!hWnd)
        {
        MessageBox(0,"Помилка при створенні вікна.", "Помилка!", MB_OK | MB_ICONERROR);
        return FALSE;
        }
 
DEVMODE dmScreenSettings;                         // структура для пристрою виведення зображення
memset(&dmScreenSettings, 0, sizeof(DEVMODE));    // виділення пам'яті для структури
dmScreenSettings.dmSize = sizeof(DEVMODE);        // розмір структури
dmScreenSettings.dmPelsWidth    = xSize;          // ширина екрану
dmScreenSettings.dmPelsHeight   = ySize;          // висота экрану
dmScreenSettings.dmFields       = DM_PELSWIDTH | DM_PELSHEIGHT; // режим пікселя
ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);       // повний екран
 
ShowWindow(hWnd, SW_SHOW);   // візуалізація створеного вікна
UpdateWindow(hWnd);          // оновлення вікна
SetFocus(hWnd);              // активізація вікна
ShowCursor(false);           // приховання курсору
 
SetTimer(hWnd,0,Interval, 0);
 
while (1)
{
 // обработка системних повідомлень
 while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
  {
   if (GetMessage(&msg, NULL, 0, 0))
   {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
   else
   {
    return TRUE;
   }
  }
 
//PicDraw();      // малювання сцени
BG();
SetTimer(hWnd,0,Interval, 0);                       // тут должна быть задежка в минуту
WaterBird(frame);
SetTimer(hWnd,0,Interval, 0);       // тут в 0.2 секунды
WaterBird(frame);  // малювання птаха 2
 
 SwapBuffers(hDC);   // перемикання буферу екрана
 
 
 if (mm || km) SendMessage(hWnd,WM_CLOSE,0,0);
   // вихід, якщо було активовано мишу або клавіатуру
 }
}
 
//---------------------------------------------------------------------------
Добавлено через 13 минут
Придеться думать дальше как реализовать анимацию(
0
04.02.2015, 11:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2015, 11:37
Привет! Вот еще темы с ответами:

Можно ли использовать C++ Builder v11 если купить Embarcadero C++Builder XE8 - C++ Builder
День добрый! Есть старый проект С++. Он компилируется на CodeGear™ C++Builder Version 11. Но на это ПО утеряна лицензия, сейчас...

Как использовать компоненты скомпилированные для C++ Builder 2007 в C++ Builder 2010? - C++ Builder
Народ! Такая проблема... Есть набор компонентов т.н. Dicom VCL. Сайт производителя - http://www.medicalconnections.co.uk/. У них на...

Какой компилятор C++ Builder использовать? Rad Studio 2009 глючит. C++ Builder 6 старый - C++ Builder
Много раз замечал непонятки с компилятором. Масла в огонь подлил Какой посоветуете?

Как заставить проект Builder 6 загруженный в Builder 2007 отображать новые кнопки - C++ Builder
Люди добрые, кто нибудь встречался с такой проблемой: Я установил Builder 2007, загрузил в него проект, сделанный в Builder 6, при этом...


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

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

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