Пятница, 08 Ноября 2024, 10:30

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Opengl, Lazarus, Пересечение игрока со стеной
cannДата: Воскресенье, 04 Апреля 2021, 15:59 | Сообщение # 1
частый гость
Сейчас нет на сайте
Не могу понять почему при первом пересечение игрока со стеной, игрок заступает один раз за стену, а потом нормально отрабатывает проверка пересечения игрока со стеной, и дальнейшего заступа не происходит. Прошу помочь в поиске данной проблемы. Код прокомментировал для лучшего восприятия.
Код

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)
---------------------------------------------
Вопрос решен.

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

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