Результаты поиска
| |
cann | Дата: Воскресенье, 26 Декабря 2021, 15:09 | Сообщение # 1 | Тема: Opengl, Lazarus, Реализация игрового поля |
частый гость
Сейчас нет на сайте
| Цитата DmitriyIM ( ) Гораздо проще привязать экран к камере, а область видимости (400х400 пикселей) указать относительно ее центра. Тогда, для реализации того, что вы описали, нужно будет просто проверять, попадает объект в видимую зону, или нет. Если да, то вывести его, если нет, то перейти к следующему объекту.
Могу постараться найти хорошую литературу, если напишите какую версию OpenGL планируете использовать.
Если сможете, то расскажите подробней об этом способе или укажите на литературу, где этот способ описывается. Использую старую версию OpenGL 1.1
|
|
| |
cann | Дата: Среда, 22 Декабря 2021, 07:30 | Сообщение # 2 | Тема: Opengl, Lazarus, Реализация игрового поля |
частый гость
Сейчас нет на сайте
| Цитата в коде придумываешь класс как слой, и сначала первым слоем рисуешь background, потом вторым слоем. в каждом слое свои спрайты. чтобы сделать плавное появление, у спрайта есть альфа канал, всего у спрайта четыре канала, зеленый, красный, синий вроде и альфа. у opengl есть функция glScissors, с помощью нее можно отображать только определенную область.
Спасибо за ответ. Попробую сделать, что вы предложили. Плюс в репутацию поставил.
Сообщение отредактировал cann - Среда, 22 Декабря 2021, 07:31 |
|
| |
cann | Дата: Среда, 22 Декабря 2021, 07:08 | Сообщение # 3 | Тема: Opengl, Lazarus, Реализация игрового поля |
частый гость
Сейчас нет на сайте
| Цитата opengl отвечает только за рисование, или если старая opengl, то и за трансформацию ( это передвижение, масштаб, поворот - изображений или объектов ). основная логика с полем пишется руками, а opengl только отображает.
Это я все понимаю, мне не понятно как сделать, если можно так сказать, "слои". То есть, игровое поле (размер которого 400х400 пикселей) является самым нижним слоем, на нем видны игровые объекты, а остальное неигровое поле является самым высоким слоем и на нем игровые объекты не видны. Если игровой объект (Астероид) движется из неигрового поля в игровое, то он в игровом поле появляется плавно, сначала не виден, потом выходит из неигрового поля в игровое.
|
|
| |
cann | Дата: Вторник, 21 Декабря 2021, 18:00 | Сообщение # 4 | Тема: Opengl, Lazarus, Реализация игрового поля |
частый гость
Сейчас нет на сайте
| Окно создаваемого OpenGL приложения развернуто на весь экран, например разрешение экрана 1366х768 пикселй. Хотелось бы понять как реализовать игровое поле определенного размера, например 400х400 пикселей, при этом игровой объект "Астероид" должен быть виден в пределах игрового поля и не виден за пределами игрового поля. Игровой объект "Астероид" должен плавно появляться в игровом поле из неигрового поля. Как можно сделать это методами OpenGL?
|
|
| |
cann | Дата: Понедельник, 07 Июня 2021, 16:51 | Сообщение # 5 | Тема: Уроки, документация по DarkBasic |
частый гость
Сейчас нет на сайте
| Добрый день!
Понимаю, что язык DarkBasic устарел, но может у кого-нибудь есть завалявшиеся уроки, документация в электронном виде для изучения? Можете поделится, а то в Интернет очень мало информации?
Спасибо.
|
|
| |
cann | Дата: Вторник, 06 Апреля 2021, 16:31 | Сообщение # 6 | Тема: Opengl, glutGetModifiers не срабатывает на сочетания клавиш |
частый гость
Сейчас нет на сайте
| Вопрос решен. Всем спасибо за ответы.
|
|
| |
cann | Дата: Воскресенье, 04 Апреля 2021, 15:59 | Сообщение # 7 | Тема: Opengl, Lazarus, Пересечение игрока со стеной |
частый гость
Сейчас нет на сайте
| Не могу понять почему при первом пересечение игрока со стеной, игрок заступает один раз за стену, а потом нормально отрабатывает проверка пересечения игрока со стеной, и дальнейшего заступа не происходит. Прошу помочь в поиске данной проблемы. Код прокомментировал для лучшего восприятия.
Код program ogl_p3;
uses gl,glut,glu;
const AppWidth = 640; AppHeight = 480; n = 4;
type rectIndexArr = array[1..n] of Glfloat; var player_rect: rectIndexArr; posx1, posx2: Real; stepx: Real; keySpecialStates: array[0..256] of Boolean;
procedure keyOperations; begin if (keySpecialStates[GLUT_KEY_LEFT]) then begin stepx := -0.025; end; if (keySpecialStates[GLUT_KEY_RIGHT]) then begin stepx := 0.025; end; end;
procedure ReshapeCallback(width, height: Integer); cdecl; begin
end;
procedure DisplayCallback; cdecl; begin stepx := 0.0; // Проверка нажата ли клавиша влево или вправо keyOperations; // Рисуем игровое поле glClearColor(1/255.0, 11/255.0, 25/255.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glBegin( GL_QUADS ); glColor3f( 3/255.0, 33/255.0, 74/255.0 ); glVertex2f( -1, 1 ); glVertex2f( 1, 1 ); glVertex2f( 1, -1 ); glVertex2f( -1, -1 );
glColor3f(5/255.0, 55/255.0, 123/255.0); glVertex2f( -0.95, 0.95 ); glVertex2f( 0.95, 0.95 ); glVertex2f( 0.95, -0.95 ); glVertex2f( -0.95, -0.95 ); glEnd; // Смещение игрока на stepx относительно текущей позиции при перемещение влево или вправо posx1 := posx1+stepx; posx2 := posx2+stepx; // Проверка пересечения игрока со стеной, если пересечение происходит, то позиционируем игрока на краю стены if posx1>0.95 then begin posx1:=0.95; posx2:=0.90; end; if posx2<-0.95 then begin posx1:=-0.90; posx2:=-0.95; end; // Рисуем игрока glColor3f( 183/255.0, 183/255.0, 183/255.0 ); glRectf(posx1, player_rect[2], posx2, player_rect[4]);
glutSwapBuffers(); end;
procedure PressKey(key: Integer; x,y: Integer); cdecl; begin keySpecialStates[key] := true; end;
procedure ReleaseKey(key: Integer; x,y: Integer); cdecl; begin keySpecialStates[key] := false; end;
procedure IdleCallback(); cdecl; begin glutPostRedisplay(); end;
procedure Init; var i: Integer; begin stepx := 0.0; player_rect[1] := -0.025; player_rect[2] := -0.85; player_rect[3] := 0.025; player_rect[4] := -0.9;
posx1 := player_rect[1]; posx2 := player_rect[3];
for i:=0 to 256 do begin keySpecialStates[i] := false; end; end;
procedure main(); begin glutInit(@argc, argv); glutInitWindowSize(AppWidth, AppHeight); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
glutCreateWindow('TestApp'); Init;
glutReshapeFunc(@ReshapeCallback); glutDisplayFunc(@DisplayCallback);
glutSpecialFunc(@PressKey); glutSpecialUpFunc(@ReleaseKey); glutIdleFunc(@IdleCallback);
glutMainLoop(); end;
begin main(); end.
Добавлено (06 Апреля 2021, 16:32) --------------------------------------------- Вопрос решен.
|
|
| |
cann | Дата: Понедельник, 29 Марта 2021, 07:42 | Сообщение # 8 | Тема: Opengl, движение прямоугольника при удержание клавиш |
частый гость
Сейчас нет на сайте
| Цитата Скорее всего, это из-за задержки повторения клавиш. Вот для Windows: https://answers.microsoft.com/ru-ru/windows/forum/all/настройк/748ab24d-7eeb-4d4d-824d-303ea85ba55c
По началу смена направления нормально работает, а потом, иногда, одна-двух секундная задержка, потом бывает нормально опять. Попробую предложенное вами решение настроить задержку повторения клавиш в Windows.
Цитата Другой, более функциональной библиотеки для обработки нажатий клавиш нет? Конечно, я попробую стандартные вызовы обработки нажатия клавиш Windows, такие как getkeystate, надеюсь это поможет. Но, хотелось бы понять можно ли реализовать, перемещение прямоугольника влево и вправо без задержек средствами библиотеки glut?
Цитата Вижу, что это какой-то диалект паскаля, но что это, понять не могу Среда Lazarus, компилятор FPC.
Добавлено (06 Апреля 2021, 16:32) --------------------------------------------- Вопрос решен. Всем спасибо за ответы.
|
|
| |
cann | Дата: Воскресенье, 28 Марта 2021, 16:27 | Сообщение # 9 | Тема: Opengl, движение прямоугольника при удержание клавиш |
частый гость
Сейчас нет на сайте
| В программу ввел возможность перемещение прямоугольника вправо и влево при удержании клавиш, но движение прямоугольника, иногда, начинается с одна-двух секундной задержкой при смене направления движения влево или вправо. Код очень прост и по ходу анализа кода я не вижу ни одного участка, где бы эта задержка может возникать. Помогите, пожалуйста, в устранение данной неприятности. Если есть более элегантное решение реализации перемещения прямоугольника, плавное перемещение, перемещение без рывков, то прошу рассказать о нем.
Код program ogl_p2;
uses gl,glut,glu;
const AppWidth = 640; AppHeight = 480; n = 4;
type rectIndexArr = array[1..n] of Glfloat; var player_rect: rectIndexArr; posx1, posx2: Real; stepx: Real;
procedure ReshapeCallback(width, height: Integer); cdecl; begin
end;
procedure DisplayCallback; cdecl; begin glClearColor(1/255.0, 11/255.0, 25/255.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glBegin( GL_QUADS ); glColor3f( 3/255.0, 33/255.0, 74/255.0 ); glVertex2f( -1, 1 ); glVertex2f( 1, 1 ); glVertex2f( 1, -1 ); glVertex2f( -1, -1 );
glColor3f(5/255.0, 55/255.0, 123/255.0); glVertex2f( -0.95, 0.95 ); glVertex2f( 0.95, 0.95 ); glVertex2f( 0.95, -0.95 ); glVertex2f( -0.95, -0.95 ); glEnd;
posx1 := posx1+stepx; posx2 := posx2+stepx;
if posx1>0.95 then begin posx1:=0.95; posx2:=0.90; end; if posx2<-0.95 then begin posx1:=-0.90; posx2:=-0.95; end;
glColor3f( 183/255.0, 183/255.0, 183/255.0 ); glRectf(posx1, player_rect[2], posx2, player_rect[4]);
glutSwapBuffers(); end;
procedure SpecialKeyboardCallback(key: Integer; x,y: Integer); cdecl; begin case key of GLUT_KEY_F1: Halt(0); GLUT_KEY_LEFT: begin stepx := -0.025; end; GLUT_KEY_RIGHT: begin stepx := 0.025; end; end; glutPostRedisplay(); end;
procedure SpecialKeyboardUpCallback(key: Integer; x,y: Integer); cdecl; begin stepx := 0.0;
glutPostRedisplay();
end;
procedure IdleCallback(); cdecl; begin glutPostRedisplay(); end;
procedure Init; begin stepx := 0.0; player_rect[1] := -0.025; player_rect[2] := -0.85; player_rect[3] := 0.025; player_rect[4] := -0.9;
posx1 := player_rect[1]; posx2 := player_rect[3]; end;
procedure main(); begin glutInit(@argc, argv); glutInitWindowSize(AppWidth, AppHeight); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
glutCreateWindow('TestApp'); Init;
glutReshapeFunc(@ReshapeCallback); glutDisplayFunc(@DisplayCallback);
glutSpecialFunc(@SpecialKeyboardCallback); glutSpecialUpFunc(@SpecialKeyboardUpCallback); glutIdleFunc(@IdleCallback);
glutMainLoop(); end;
begin main(); end.
Сообщение отредактировал cann - Воскресенье, 28 Марта 2021, 17:29 |
|
| |
cann | Дата: Понедельник, 08 Марта 2021, 16:50 | Сообщение # 10 | Тема: Opengl, glutGetModifiers не срабатывает на сочетания клавиш |
частый гость
Сейчас нет на сайте
| Sanchez06, Fire_Phoenix спасибо. Написал код для проверки сочетания клавиш Shift+Alt+d, Shift+Ctrl+d, Alt+Ctrl+d.
Код WriteLn('Key = ', key);
if ((key=ord('d')) or (key=ord('D')) or (key=$04)) then begin mode:=glutGetModifiers(); if (mode = (GLUT_ACTIVE_SHIFT or GLUT_ACTIVE_ALT)) then begin WriteLn('SHIFT + ALT + D pressed ', mode); Exit; end; if (mode = (GLUT_ACTIVE_SHIFT or GLUT_ACTIVE_CTRL)) then begin WriteLn('SHIFT + CTRL + D pressed ', mode); Exit; end; if (mode = (GLUT_ACTIVE_ALT or GLUT_ACTIVE_CTRL)) then begin WriteLn('ALT + CTRL + D pressed ', mode); Exit; end; end;
Действительно, обработка сочетания клавиш Shift+Alt+d и Shift+Ctrl+d работают, Alt+Ctrl+d не работает.
|
|
| |
cann | Дата: Суббота, 06 Марта 2021, 18:30 | Сообщение # 11 | Тема: Opengl, glutGetModifiers не срабатывает на сочетания клавиш |
частый гость
Сейчас нет на сайте
| Спасибо за ответы Sanchez06, Fire_Phoenix. Получилось наладить обработку сочетания клавиш. Например, такие сочетания Shift+d, Alt+d, Ctrl+d работают. Но, попробовал написать код на обработку клавиш Ctrl + Alt + d и данная комбинация не работает. Код обработки сочетания клавиш Ctrl + Alt + d я написал так: Код
Код if ((key=ord('d')) or (key=ord('D')) or (key=$04)) then begin mode:=glutGetModifiers(); if (mode = (GLUT_ACTIVE_CTRL or GLUT_ACTIVE_ALT)) then begin WriteLn('CTRL + ALT + D pressed ', mode); Exit; end; end;
Есть ли идеи почему не работает? Код переделал из примера кода на си с сайта стековерфлоу автора segevara. Код
Код if (key == 'd' || key == 'D' || key == 0x04) { int mod = glutGetModifiers(); if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) { cout << "CTRL+Alt+D press" << endl; } }
|
|
| |
cann | Дата: Пятница, 05 Марта 2021, 17:17 | Сообщение # 12 | Тема: Opengl, glutGetModifiers не срабатывает на сочетания клавиш |
частый гость
Сейчас нет на сайте
| Цитата У тебя есть Skype или VK? DmitriyIM, привет. Если есть информация по теме, прошу ответить здесь.
|
|
| |
cann | Дата: Вторник, 02 Марта 2021, 15:05 | Сообщение # 13 | Тема: Opengl, glutGetModifiers не срабатывает на сочетания клавиш |
частый гость
Сейчас нет на сайте
| Написал пример с OpenGL, но есть непонимание того, почему не отрабатываются сочетания нажатия клавиш. В частности не срабатывает сочетания клавиш Shift+r и Ctrl+r. Сочетании клавиш Alt+r отрабатывает нормально. Подскажите, пожалуйста, из-за чего так может быть?
Код program ogl_p1;
{$mode objfpc}{$H+}
uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, gl, glut;
var ScreenWidth, ScreenHeight: Integer; const AppWidth = 640; AppHeight = 480;
procedure resize(width, height: LongInt); cdecl; var ar: Real; begin ar := width div height;
glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity; glFrustum(-ar,ar,-1.0,1.0,2.0,100.0);
glMatrixMode(GL_MODELVIEW); glLoadIdentity; end;
procedure display; cdecl; begin glutSwapBuffers(); end;
procedure key(key: Byte; x,y: Integer); cdecl; var mode: Integer; begin WriteLn('Key = ', key); case key of ord('q'), 27: begin Halt(0); Exit; end; ord('r'): begin mode:=glutGetModifiers(); if (mode <> 0) then begin case mode of 1: begin WriteLn('SHIFT key ', mode); Exit; end; 2: begin WriteLn('CTRL key ', mode); Exit; end; 4: begin WriteLn('ALT key ', mode); Exit; end; end; mode:=0; end; Exit; end; end; glutPostRedisplay(); end;
procedure skey(key: Integer; x,y: Integer); cdecl; begin case key of GLUT_KEY_F1: Halt(0); GLUT_KEY_LEFT: WriteLn('GLUT_KEY_LEFT ', key); GLUT_KEY_RIGHT: WriteLn('GLUT_KEY_RIGHT ', key); GLUT_KEY_UP: WriteLn('GLUT_KEY_UP ', key); GLUT_KEY_DOWN: WriteLn('GLUT_KEY_DOWN ', key); end; glutPostRedisplay(); end;
procedure idle(); cdecl; begin glutPostRedisplay(); end;
procedure main(); begin glutInit(@argc, argv); glutInitWindowSize(AppWidth, AppHeight); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
glutCreateWindow('TestApp');
glutReshapeFunc(@resize); glutDisplayFunc(@display);
glutKeyboardFunc(@key); glutSpecialFunc(@skey);
glutMainLoop(); end;
begin main(); end.
|
|
| |
cann | Дата: Суббота, 20 Февраля 2016, 16:24 | Сообщение # 14 | Тема: Замедление вывода каждой следующей буквы в моей программе |
частый гость
Сейчас нет на сайте
| Цитата Ordan ( ) cann, берешь текстуру, отрываешь её в фотошопе или ином граф редакторе и уменьшаешь в 2 раза)
Понял, спасибо за ответ.
|
|
| |
cann | Дата: Суббота, 20 Февраля 2016, 16:12 | Сообщение # 15 | Тема: Замедление вывода каждой следующей буквы в моей программе |
частый гость
Сейчас нет на сайте
| Цитата Ordan ( ) нет, размер текстурки это размер самой картинки которую ты загружаешь в память.
Тогда можешь подсказать как задать размер текстуры? Приведи пример кода на OpenGL, пожалуйста.
|
|
| |
cann | Дата: Суббота, 20 Февраля 2016, 15:18 | Сообщение # 16 | Тема: Замедление вывода каждой следующей буквы в моей программе |
частый гость
Сейчас нет на сайте
| Цитата Ordan ( ) недостаточно сильно уменьшил текстуру
Если я правильно понимаю, то размер текстуры задается этой OpenGL функцией
Код glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sFont^.w, sFont^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, sFont^.pixels);
нормальный размер букв, который видны в окне программы это значение 32, как и у меня в программе и установлено было. Я пробовал устанавливать значения и в 16, в 8, в 4, но у меня только уменьшались размеры белых квадратов. При размерах 16, 8, 4 квадраты становятся очень маленькими и их плохо видно в окне программы.
|
|
| |
cann | Дата: Суббота, 20 Февраля 2016, 15:04 | Сообщение # 17 | Тема: Замедление вывода каждой следующей буквы в моей программе |
частый гость
Сейчас нет на сайте
| Цитата Ordan ( ) Не думал что такие компьютеры еще существуют.
Да, есть несколько.
Цитата Ordan ( ) На нем будут белые квадраты, что бы их небыло уменьши размер текстуры.
Уменьшение размера текстур ничего не дало. Теперь и на первом компьютере с FX5500 буквы не отображаются, а отображаются размытые текстуры в виде каких-то цветных пиксельных шумов. На ноутбуке пока все работает. Думаю, я где-то напортачил с OpenGL кодом. Буду искать корень проблемы. Спасибо всем кто отвечал.
|
|
| |
cann | Дата: Суббота, 20 Февраля 2016, 11:59 | Сообщение # 18 | Тема: Замедление вывода каждой следующей буквы в моей программе |
частый гость
Сейчас нет на сайте
| Цитата Ordan ( ) видимо ты делаешь такой жесткачь что видюха не тянет. Обычно белые квадраты когда видеокарта не смогла прогрузить текстуру ну или у тебя древняя видюха и она не поддерживает твою версию опенГЛ.
Ну на первом компьютере установлена Nvidia Geforce FX5500 128mb - На ней буквы тормозят. На втором компьютере Nvidia Geforce2 MX400 64mb - На ней квадраты, вместо букв. Ноутбук Nvidia Geforce G105M 512Mb - на ней все нормально работает.
А как узнать мою версию OpenGL можно? На каждом компьютере она разная, я так понимаю. Но функции OpenGL, которые использует моя программа, одни из самых простых и я думаю все эти видеокарты должны с ними работать.
|
|
| |
cann | Дата: Суббота, 20 Февраля 2016, 11:24 | Сообщение # 19 | Тема: Замедление вывода каждой следующей буквы в моей программе |
частый гость
Сейчас нет на сайте
| Спасибо за ответы.
Сейчас попробовал собрать мою программу на втором рабочем компьютере и вместо выводимых букв получаю белые квадраты. Бред какой-то, на первом компьютере буквы выводятся с замедлением каждой последующей, на втором компьютере вместо вывода букв выводит мне белые квадраты, при этом скорость вывода у всех квадратов одинаковая. На домашнем ноутбуке буквы отображаются нормально и без замедления. Может я не правильно использую OpenGL функции при создание текстур и вывода текстуры на экран? Может использую какой-то не универсальный способ, который мог бы работать на всех компьютерах одинаково?
|
|
| |
cann | Дата: Суббота, 20 Февраля 2016, 08:50 | Сообщение # 20 | Тема: Замедление вывода каждой следующей буквы в моей программе |
частый гость
Сейчас нет на сайте
| Я написал простую программу, которая выводит строки по буквам. Для написания программы использовал библиотеки SDL + SDL_ttf + OpenGL. Проблема в том, что при выводе каждой последующей буквы наблюдается замедление, т.е. следующая за очередной буквой отображается визуально медленнее, чем предыдущая. Замедления вывода букв, в коде программы, я нигде не прописывал. Я тестировал программу на домашнем ноутбуке, все работает нормально, а на рабочем компьютере проявляется такой визуальный эффект. Из-за чего так может происходить?
Код программы:
Код program sdl_p4;
{$mode objfpc}{$H+}
uses sdl, sdl_ttf, gl, glu;
var screen :pSDL_SURFACE; loopstop: boolean = FALSE; event: pSDL_EVENT;
font : pointer; sFont: pSDL_SURFACE; color: pSDL_COLOR;
text: array[0..3] of String = ('aaaaaaaaaaaa', 'bbbbbbbbbbbb', 'cccccccccccc', 'dddddddddddd'); b: integer; cur: integer; all: String; i,i1: Integer;
procedure addchar; begin if cur = 4 then Exit; if length(all)=length(text[cur]) then begin //writeln(length(all)); //writeln(length(text[cur])); inc(cur); all:=''; Exit; end;
if cur<4 then begin all := all + text[cur][length(all)+1]; //writeln(all); end; end;
procedure RenderText(const message : PChar; r : GLubyte; g : GLubyte; b : GLubyte; x : Integer; y : Integer; size : Integer); var texture: GLuint; begin glGenTextures(1, @texture); glBindTexture(GL_TEXTURE_2D, texture);
font := TTF_OpenFont('cour.ttf', size);
new(color);
color^.r:=r; color^.g:=g; color^.b:=b;
sFont := TTF_RenderText_Blended(font, message, color^);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sFont^.w, sFont^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, sFont^.pixels);
glBegin(GL_QUADS); glTexCoord2f(0,1-0); glVertex2f(x, y); glTexCoord2f(1,1-0); glVertex2f(x + sFont^.w, y); glTexCoord2f(1,1-1); glVertex2f(x + sFont^.w, y + sFont^.h); glTexCoord2f(0,1-1); glVertex2f(x, y + sFont^.h); glEnd();
glDeleteTextures(1, @texture); Dispose(color);
TTF_CloseFont(font); SDL_FreeSurface(sFont); end;
procedure DrawGLScene(); var i: integer; begin
glClear(GL_COLOR_BUFFER_BIT);
glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
inc(B); if b=20 then addchar; if b>20 then b:=0;
//addchar;
for i := 0 to cur - 1 do begin if cur = 4 then Exit; RenderText(PChar(text[i]), 255, 255, 255, 0, 448 - i*32, 32); end;
if Length(all) <> 0 then RenderText(PChar(all), 255, 255, 255, 0, 448 - cur*32, 32);
glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); end; var m_Width, m_height: Integer; frame_rate: Integer = 30; frame_ms: Integer; start_ms: Integer; end_ms: Integer; delay_ms: Integer;
begin SDL_Init(SDL_INIT_VIDEO);
screen := SDL_SetVideoMode(640, 480, 0, SDL_OPENGL); if screen = NIL then Halt;
if Ttf_Init = -1 then Halt;
glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity();
m_Width := screen^.w; m_Height := screen^.h;
gluOrtho2D(0, m_Width, 0, m_Height); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity();
b:=0; cur:=0; all:='';
new(event);
frame_ms := 1000 div frame_rate;
while loopstop = FALSE do begin
if SDL_PollEvent(event) = 1 then begin case event^.type_ of SDL_KEYDOWN: begin if event^.key.keysym.sym = 27 then loopstop := TRUE; end; SDL_QUITEV: begin loopstop := TRUE; end; end; end; start_ms := sdl_getticks(); DrawGLScene; end_ms := sdl_getticks();
delay_ms := (end_ms - start_ms);
writeln(delay_ms);
SDL_GL_SWAPBUFFERS;
end;
Dispose(event); SDL_FreeSurface(screen); TTF_QUIT; SDL_QUIT; end.
|
|
| |
|