Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2010, 19:29   #1
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию игра "Тоннель"

Хай, пипл бескрайних просторов сети.=) Сделал курсач сокурснику и захотелось из этого игру сварганить,
Не могу правильно оформить поворот картинки.
При нажатии клавиши с помощью команды glRotate поворачиваю сцену и сразу же контрольную точку увеличиваю на 3 или уменьшаю на 3(смотря в какую сторону повернул). Так вот - при полном повороте картинки(360°)
контроольная точка должна равняться так же 360°, а она не фиксирована, то есть то 207, то 130, и т.д. (если зажимаешь клавишу, то она получается в пределах 210°, если нажатие на клавишу происходит отрывисто, то в пределах 100°)
Как обуздать шаловливую точку??? А, за точку отвечает переменная rotate.


Код:
unit Unit1;


interface

uses
  Windows, SysUtils, Classes, Forms, OpenGL, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    DC : HDC;
    hrc: HGLRC;
  end;

type
  Point3D=record
  x,y,z:real;
  end;

var
  Form1: TForm1;
  tonel: array [0..14,1..12] of Point3D;
  lines_tonel:array [0..1,1..12] of Point3D;
  Circle_Tonel:array[0..14,1..12] of Point3D;
  move_z:real;
  translate_z:real;
  angle:integer;
  RotZ:integer;
  plosk_Z,plosk_XY:integer;
  R,G,B:real;
  rotate:integer; 

implementation

{$R *.DFM}

procedure plockost(var Blijn_left,
                   Blijn_right,
                   daln_right,
                   daln_left:Point3D);
begin
    glBegin (GL_QUADS);
      glVertex3f (Blijn_left.x*1.1,Blijn_left.y*1.1,Blijn_left.z+translate_z-0.1);
      glVertex3f (Blijn_right.x*1.1,Blijn_right.y*1.1,Blijn_right.z+translate_z-0.1);
      glVertex3f (daln_right.x*1.1,daln_right.y*1.1,daln_right.z+translate_z-0.1);
      glVertex3f (daln_left.x*1.1,daln_left.y*1.1,daln_left.z+translate_z-0.1);
    glEnd;
end;

procedure TForm1.FormPaint(Sender: TObject);
var i,j:integer;
begin
if translate_z>=1 then
begin
  plosk_z:= plosk_z-1;
  translate_z:=0;
end;
if  plosk_z=1 then
begin
  if ((rotate+270)mod 360>(plosk_xy-1)*30)AND
   ((rotate+270) mod 360<= plosk_xy*30) then    FORM1.CLOSE;

  randomize;
  plosk_z:=13;
  plosk_XY:=1+random(10);

  R:=random;
  G:=random;
  B:=random;
end;

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glRotate(RotZ,0,0,1);

glPushMatrix;

if width<=Height then
glOrtho(-2,2,-2*Height/width,2*Height/width,-9.5,5)
else
glOrtho(-2*width/Height,2*width/Height,-2,2,-9.5,5);

 glFrustum (-1, 1, -1, 1, 0.5, 10.5);

 glScale(1.1,1.1,1.1);
 glEnable(GL_DEPTH_TEST);

 for i:= 0 to 13 do
 begin
   glColor3f(0.7,0.7,0.7);
   glBegin(GL_QUAD_STRIP);
   for j:= 1 to 12 do
   begin
     glVertex3f(tonel[i,j].x,tonel[i,j].y,tonel[i,j].z+translate_z);
     glVertex3f(tonel[i+1,j].x,tonel[i+1,j].y,tonel[i+1,j].z+translate_z);
   end;
   glEnd;
   glBegin(GL_QUADS);
     glVertex3f(tonel[i,12].x,tonel[i,12].y,tonel[i,12].z+translate_z);
     glVertex3f(tonel[i+1,12].x,tonel[i+1,12].y,tonel[i+1,12].z+translate_z);
     glVertex3f(tonel[i+1,1].x,tonel[i+1,1].y,tonel[i+1,1].z+translate_z);
     glVertex3f(tonel[i,1].x,tonel[i,1].y,tonel[i,1].z+translate_z);
   glEnd;

   glLineWidth(2);
   glColor3f(0,0,0);
   glBegin(GL_LINE_LOOP);
   for j:= 1 to 12 do
   glVertex3f(Circle_Tonel[i,j].x,Circle_Tonel[i,j].y,
   Circle_Tonel[i,j].z+translate_z);
   glEnd;
 end;

 for j:=1 to 12 do
 begin
   glBegin(GL_LINES);
   glvertex3f(Lines_tonel[0,j].x,Lines_tonel[0,j].y,Lines_tonel[0,j].z);
   glvertex3f(Lines_tonel[1,j].x,Lines_tonel[1,j].y,Lines_tonel[1,j].z);
   glEnd;
 end;

 glColor3f(R,G,B);
 plockost(tonel[plosk_z,plosk_XY],
          tonel[plosk_z,plosk_XY+1],
          tonel[plosk_z-1,plosk_XY+1],
          tonel[plosk_z-1,plosk_XY]);

 glPopMatrix;
 translate_z:=translate_z+0.1;
 SwapBuffers(DC);
end;

procedure SetDCPixelFormat (hdc : HDC);
var
 pfd : TPixelFormatDescriptor;
 nPixelFormat : Integer;
begin
 FillChar (pfd, SizeOf (pfd), 0);
 pfd.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
 nPixelFormat := ChoosePixelFormat (hdc, @pfd);
 SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
Вложения
Тип файла: rar alarm.rar (12.2 Кб, 23 просмотров)
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 12.07.2010 в 01:15. Причина: вставка кода.
Rin вне форума Ответить с цитированием
Старый 12.07.2010, 01:15   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
 DC := GetDC (Handle);
 SetDCPixelFormat (DC);
 hrc := wglCreateContext (DC);
 wglMakeCurrent (DC, hrc);
 glClearColor (0, 0, 0, 1);

 rotate:=0;

 move_z:=0.5;

 for i:=0 to 14 do 
 begin
   angle:=0;
   for j:=1 to 12 do 
   begin
     tonel[i,j].x:=cos(angle*pi/180);
     tonel[i,j].y:=sin(angle*pi/180);
     tonel[i,j].z:=move_z;
     circle_tonel[i,j].x:=tonel[i,j].x;
     circle_tonel[i,j].y:=tonel[i,j].y;
     circle_tonel[i,j].z:=move_z;
     angle:=angle+30;
   end;
   move_z:=move_z-1;
 end;

 angle:=0;
 for j:=1 to 12 do
 begin
   Lines_tonel[0,j].x:=cos(angle*pi/180);
   Lines_tonel[0,j].y:=sin(angle*pi/180);
   Lines_tonel[0,j].z:=0.5;
   Lines_tonel[1,j].x:=cos(angle*pi/180);
   Lines_tonel[1,j].y:=sin(angle*pi/180);
   Lines_tonel[1,j].z:=-4.5;
   angle:=angle+30;
 end;

 translate_z:=0;
 rotZ:=0;
 plosk_z:=13;

 R:=random;
 G:=random;
 B:=random;

 plosk_XY:=1+random(10);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 wglMakeCurrent(0, 0);
 wglDeleteContext(hrc);
 ReleaseDC (Handle, DC);
 DeleteDC (DC);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=vk_left then
begin
  RotZ:=3;
  rotate:= rotate+3;
end;
if key=vk_right then
begin
  RotZ:=-3;
  rotate:= rotate-3;
end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 rotZ:=0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
form1.Caption:='точка: '+IntToStr(rotate)+'    '+FloatToStr((plosk_xy-1)*30)
+'    '+FloatToStr(plosk_xy*30);
formpaint(nil);
end;
end.

здесь код без коментов. в приложении, которое в самом верху темы неоткомпилированный проект с прокоментенным кодом
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 12.07.2010, 13:51   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

значит Труба, да?
где вы, великие прогеры???
Mutabor? где ты??? ))))))))))
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 12.07.2010 в 21:17. Причина: зов о помощи=)
Rin вне форума Ответить с цитированием
Старый 13.07.2010, 00:35   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

всё, сделал. тема закрыта. Всем спасибо))
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Игра "Ghost Recon Advanced Warfighter 1"(GRAW) Air Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 27.07.2008 08:07
Игра "четный" "нечетный" bigcat Помощь студентам 1 01.03.2008 00:24