Понедельник, 25 Ноября 2024, 10:10

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Opengl, движение прямоугольника при удержание клавиш
cannДата: Воскресенье, 28 Марта 2021, 16:27 | Сообщение # 1
частый гость
Сейчас нет на сайте
В программу ввел возможность перемещение прямоугольника вправо и влево при удержании клавиш, но движение прямоугольника, иногда, начинается с одна-двух секундной задержкой при смене направления движения влево или вправо. Код очень прост и по ходу анализа кода я не вижу ни одного участка, где бы эта задержка может возникать. Помогите, пожалуйста, в устранение данной неприятности. Если есть более элегантное решение реализации перемещения прямоугольника, плавное перемещение, перемещение без рывков, то прошу рассказать о нем.

Код
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
Sanchez06Дата: Воскресенье, 28 Марта 2021, 20:11 | Сообщение # 2
участник
Сейчас нет на сайте
Скорее всего, это из-за задержки повторения клавиш. Вот для Windows:
https://answers.microsoft.com/ru-ru/windows/forum/all/настройк/748ab24d-7eeb-4d4d-824d-303ea85ba55c
Другой, более функциональной библиотеки для обработки нажатий клавиш нет? Вижу, что это какой-то диалект паскаля, но что это, понять не могу :)
cannДата: Понедельник, 29 Марта 2021, 07:42 | Сообщение # 3
частый гость
Сейчас нет на сайте
Цитата
Скорее всего, это из-за задержки повторения клавиш. Вот для 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)
---------------------------------------------
Вопрос решен. Всем спасибо за ответы.

  • Страница 1 из 1
  • 1
Поиск:

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