glviewPort(0, 0, ClientWidth-1, ClientHeight-1);
FormPaint(Sender);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin //Процедура очистки памяти при закрытии программы
wgldeletecontext(OpGLcontext);
freemodel(model);
preps.destroy;
end;
procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);
begin //Процедура отрисовки формы и изменения параметра done
FormPaint(Sender);
Done:=false;
end;
procedure TForm1.FormPaint(Sender: TObject);
var //Процедура отрисовки формы
poss:array [0..3] of single;
ObjSphere: PGLUquadric;
begin
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_TEXTURE_2D);
glLightModelf(Gl_Light_model_two_side,1);
glClearColor(0,0,0,1);
glClear({Gl_color_buffer_bit or} GL_depth_buffer_bit);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROjection);
glLoadIdentity();
poss[0]:=1;
poss[1]:=-2;
poss[2]:=1;
poss[3]:=1;
gluPerspective(45,Width/Height,0.001,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLightFv(GL_LIGHT0,GL_POSITION,@poss);
glTranslatef(0,0,-2);
glScalef(scal,scal,scal);
glRotatef(ry,-1,0,0);
glRotatef(rx,0,-1,0);
glColor3f(1, 1, 1);
glBindTexture(GL_TEXTURE_2D,idtext1);
glpushmatrix();
glTranslatef(3,0,planx);
glInterleavedArrays($2A2B,0,model^.Element^);
glDrawElements(GL_TRIANGLES,model^.IndexCount,GL_UNSIGNED_INT,model^.Index^);
glpopmatrix();
glBindTexture(GL_TEXTURE_2D,idtext2);
glpushmatrix();
glTranslatef(xs,0,ys);
glRotatef(mx,1,0,0);
glRotatef(my,0,1,0);
ObjSphere:= gluNewQuadric;
gluQuadricDrawStyle(ObjSphere, GLU_FILL);
gluQuadricTexture(ObjSphere,true);
gluSphere(ObjSphere, 0.20, 5, 5);
glpopmatrix();
preps.draw;
glBindTexture(GL_TEXTURE_2D,0);
glInterleavedArrays($2A2B,0,bort^.Element^);
glDrawElements(GL_TRIANGLES,bort^.IndexCount,GL_UNSIGNED_INT,bort^.Index^);
ObjSphere:= gluNewQuadric;
gluQuadricDrawStyle(ObjSphere, GLU_FILL);
gluSphere(ObjSphere, 15, 5, 5);
glFlush;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
Begin //процедура вращения модели при движении мыши и зажатой клавиши
if ssLeft in Shift then begin
inc(rx,ax-x);
inc(ry,ay-y);
ax:=x;
ay:=y;
FormPaint(Sender);
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Begin //процедура запоминания начального положения мыши в момент нажатия клавиши
ax:=x;
ay:=y;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); //Процедура сдвига кусочка недостающей стены прямоугольника
begin
if (Key=VK_LEFT) then addplanx:=speed_b;
if (Key=VK_RIGHT) then addplanx:=-speed_b;
// scal
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key=VK_LEFT) or (Key=VK_RIGHT) then addplanx:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var //Процедура таймера, обеспечивает движение шара, изменения его угла при ударении об объекты
pr,a:single; //в этой процедуре мы обеспечили вращение шара во круг своей оси при ударении об объекты
begin
pr:=speed_s*sin(rmov/180*pi);
//pr:=incx;
if ((xs+pr)<3.2) and ((xs+pr)>2.8) and (ys>planx-0.5) and (ys<planx+0.5) then begin
a:=ys-planx;
while rmov<0 do begin rmov:=rmov+360; incy:=incy-10; end;
while rmov>360 do begin rmov:=rmov-360; incy:=incy+10; end;
if rmov>270 then begin rmov:=(360-rmov)*(1-a); incx:=incx-20; end;
if rmov<270 then begin rmov:=180-(rmov-180)*(1+a); incx:=incx+2; end;
end;
if (xs+pr)<-3 then begin rmov:=180-(rmov-180); incy:=incy+10; flag:=true; end;
pr:=speed_s*cos(rmov/180*pi);
//pr:=incy;
//incy:=incy+1;
if (ys+pr)>3 then begin rmov:=90-(rmov-90); flag:=true; incx:=incx+10; end;
if (ys+pr)<-3 then begin rmov:=90-(rmov-90); flag:=true; incy:=incy-10; end;
xs:=xs+speed_s*sin(rmov/180*pi);
//xs:=incx;
ys:=ys+speed_s*cos(rmov/180*pi);
//ys:=incy;
if (xs>4) then begin
xs:=0;
ys:=0;
rmov:=250;
end;
preps.testspeaker(xs,ys,rmov);
planx:=planx+addplanx;
if (planx>2.5) then planx:=2.5;
if (planx<-2.5) then planx:=-2.5;
//if flag then
//begin
mx:=mx+incx; my:=my+incy;
//end;
//flag:=false;
end;
{ Tprep }
constructor Tprep.create(x, y, w, h: single);
begin //Конструктор нововведенного объекта. Производит начальную инициализацию
inherited create;
fx:=x; fy:=y;
generatormodelmode(MM_NORMAL);
model:=createmodel(MF_TNV);
settexture (0,0,2,1,0);
modelbox(model,w,h,0.2,1,1,1,3);
normals(model);
fw:=w/2;fh:=h/2;
end;
destructor Tprep.destroy;
begin //деструктор нововведенного объекта. Производит очищение памяти при удалении объекта
freemodel(model);
inherited destroy;
end;
procedure Tprep.draw;
begin //Процедура отрисовки нововведенного объекта. Производит сохранение матрицы изображения
glpushmatrix;
gltranslatef(fx,0,fy);
glInterleavedarrays($2A2B,0,model^.element^);
gldrawelements(gl_triangles,model^.IndexCount, gl_unsigned_int,model^.index^);
glpopmatrix;
end;
function Tprep.testspeaker(x, y: single; var angle: single): boolean;
var //Процедура изменения угла полёта шара при его ударении о нововведенный объект
prx,pry:single;
begin
result:=false;
prx:=speed_s*sin(angle/180*pi);
pry:=speed_s*cos(angle/180*pi);
if (x+prx>fx-fw-rspk) and (x+prx<fx+fw+rspk) and (y>fy-fh) and (y<fy+fh) then
begin
angle:=360-angle;
result:=true;
end;
if (x>fx-fw) and (x<fx+fw) and (y+pry>fy-fh-rspk) and (y+pry<fy+fh+rspk) then
begin
angle:=180-angle;
result:=true;
end;
end;
end.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.