Не могу понять почему при первом пересечение игрока со стеной, игрок заступает один раз за стену, а потом нормально отрабатывает проверка пересечения игрока со стеной, и дальнейшего заступа не происходит. Прошу помочь в поиске данной проблемы. Код прокомментировал для лучшего восприятия.
Код
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)
---------------------------------------------
Вопрос решен.