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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2007, 11:12   #1
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию Open GL. при нажатии клавиш Left, Ridth, Up и Down точка должна двигаться по форме

Здравствуйте помогите пожалуйста написать обработчик клавиш в программке.
Код:
procedure TForm1.FormPaint(Sender: TObject);
var Key: Char;
begin

wglMakeCurrent(Canvas.Handle, hrc);
 glClearColor (0.5, 0.5, 0.75, 1.0);
 glClear (GL_COLOR_BUFFER_BIT);
 glviewPort(0, 0, ClientWidth, ClientHeight);
 glPointSize(20);
 glColor3f(1.0, 0.85, 0.35);
 glBegin(GL_POINTS);
 glvertex2f(1,0);

  if Key = Char(VK_LEFT) then   //не работает
  glVertex2f(0, 0);
 

 glend;
 wglMakeCurrent(0, 0);
end;
 
procedure SetDCPixelFormat (hdc : HDC);
var
 pfd : TPixelFormatDescriptor;
 nPixelFormat : Integer;
begin
 FillChar (pfd, SizeOf (pfd), 0);
 nPixelFormat := ChoosePixelFormat (hdc, @pfd);
 SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 SetDCPixelFormat(Canvas.Handle);
 hrc := wglCreateContext(Canvas.Handle);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 wglDeleteContext(hrc);
end;

procedure TForm1.FormClick(Sender: TObject);
begin
Refresh;
end;
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
Refresh;
end;
end.
Вообще говоря программка рисует на поверхности формы точку размером 20 и мне нужно, чтоб при нажатии клавиш Left, Ridth, Up и Down эта самая точка двигалась по форме. Так же мне нада чтоб я мог задавать интервал с которым она должна перемещаться.

Код:
 
if Key = Char(VK_LEFT) then
  glVertex2f(0, 0);
вот данные инструкции не работают , а все остальное вроде верно, так как брал все из книжки.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 09.09.2007, 11:23   #2
UnD)eaD)Snake
Форумчанин Подтвердите свой е-майл
 
Аватар для UnD)eaD)Snake
 
Регистрация: 07.07.2007
Сообщений: 241
По умолчанию

попробуй
if IsKeyDown(vk_left) then
glVertex2f(0, 0);
UnD)eaD)Snake вне форума Ответить с цитированием
Старый 09.09.2007, 12:53   #3
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

не компилируется теперь вообще.

[Error] Unit1.pas(50): E2003 Undeclared identifier: 'IsKeyDown'

как описать IsKeyDown ?
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 09.09.2007, 13:05   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вообще для обработки клавиш и мыши, а также чтобы добавить таймер в OGL программах на Дельфи можно либо использовать VCL либо WinAPI. Все тоже самое что и в обычных Дельфи программах, только графика OGL.

Создаешь таймер, задаешь нужный интервал, для каждой клавиши создаешь глоб. boolean переменную. Нажал клавишу - true, отпустил - false. В обр. таймера если нужная переменная = true, изменяешь координаты перемещаемого объекта и делаешь отрисовку.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 09.09.2007, 13:11   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
не компилируется теперь вообще
сделай так
Код:
var lef, right, up, down: boolean;

//OnKeyDown
if key = 36 then lef:=true;
//и так для остальных клавиш, коды стрелок 36,37,38,39 вроде

//в OnKeyUp обратный процесс все false
а нужный код в таймере пиши
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 09.09.2007, 13:18   #6
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 mutabor
хм... интересно сейчас попробую спасибо!
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 09.09.2007, 13:31   #7
UnD)eaD)Snake
Форумчанин Подтвердите свой е-майл
 
Аватар для UnD)eaD)Snake
 
Регистрация: 07.07.2007
Сообщений: 241
По умолчанию

Цитата:
Сообщение от Roof Посмотреть сообщение
не компилируется теперь вообще.

[Error] Unit1.pas(50): E2003 Undeclared identifier: 'IsKeyDown'

как описать IsKeyDown ?
Добавь в uses Keyboard
UnD)eaD)Snake вне форума Ответить с цитированием
Старый 09.09.2007, 13:48   #8
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 UnD)eaD)Snake
Форумчанин
KeyBoard добавил, но компилятор не признает

[Fatal Error] Unit1.pas(7): F1026 File not found: 'Keyboard.dcu'

я так понял может компонент нужно какой поставить дополнительно?
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 09.09.2007, 13:59   #9
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 mutabor
Проверь код пожалуйста. Что я неправильно сделал? все компилируется, но точка так и не начала двигаться . Писал только для стрелки Up.
Код:
 
var
  Form1: TForm1;
  lef, right, up, down: boolean;

implementation
{$R *.dfm}
 
procedure TForm1.FormPaint(Sender: TObject);
var Key: Char;
begin
wglMakeCurrent(Canvas.Handle, hrc);
 glClearColor (0.5, 0.5, 0.75, 1.0);
 glClear (GL_COLOR_BUFFER_BIT);
 glviewPort(0, 0, ClientWidth, ClientHeight);
 glPointSize(20);
 glColor3f(1.0, 0.85, 0.35);
 glBegin(GL_POINTS);
 glvertex2f(0, 0);
 if key = #36 then begin
 up:=true;
 Form1.Timer1Timer(Timer1);
 end;
 glend;
 wglMakeCurrent(0, 0);
end;
 
procedure SetDCPixelFormat (hdc : HDC);
var
 pfd : TPixelFormatDescriptor;
 nPixelFormat : Integer;
begin
 FillChar (pfd, SizeOf (pfd), 0);
 nPixelFormat := ChoosePixelFormat (hdc, @pfd);
 SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 SetDCPixelFormat(Canvas.Handle);
 hrc := wglCreateContext(Canvas.Handle);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 wglDeleteContext(hrc);
end;

procedure TForm1.FormClick(Sender: TObject);
begin
Refresh;
end;
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
Refresh;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if up= true then begin
  glBegin(GL_POINTS);
  glvertex2f(0, 0.5);
 glend;
 end;
 end;
end.
.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 09.09.2007, 15:04   #10
UnD)eaD)Snake
Форумчанин Подтвердите свой е-майл
 
Аватар для UnD)eaD)Snake
 
Регистрация: 07.07.2007
Сообщений: 241
По умолчанию

Сори, вот попробуй
Вложения
Тип файла: rar keyboard.rar (4.1 Кб, 63 просмотров)
UnD)eaD)Snake вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как двигаться по данным после select? _ozzy_ SQL, базы данных 5 30.06.2008 09:33
Как двигаться по записям после Select? _ozzy_ БД в Delphi 5 17.06.2008 15:53
Url open Pavel_aress Общие вопросы Delphi 12 01.08.2007 20:40
при нажатии на кнопку должна создаваться новая форма ***СкаЙ*** Помощь студентам 5 13.06.2007 11:51
Точка на полигоне? Роман Радер Общие вопросы Delphi 14 12.02.2007 17:08