Вторник, 19 Марта 2024, 08:46

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Записи участника » cann [31]
Результаты поиска
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.
Форум игроделов » Записи участника » cann [31]
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг