IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> If Keypressed Then Ch:=readkey;
Morfey85
сообщение 24.06.2006 17:20
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


Перешёл из паскаля в делфи

столкнулся с проблемой:

в паскале при нажатии кнопки считывал символ так: if KeyPressed then ch:=ReadKey;
В делфи такое что то не катит пишет Undeclared identifier...
Как мне реализовать это в Делфях подскажите.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.06.2006 17:34
Сообщение #2


Гость






Здесь глянь:
Crt в дельфи
 К началу страницы 
+ Ответить 
Morfey85
сообщение 24.06.2006 18:21
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


Спасибо, но я бы хотел узнать как в делфи реализовано перехват кода клавиатуры в программу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.06.2006 18:39
Сообщение #4


Гость






Ну, это смотря чем ты пользуешься. Если используешь VCL - то есть событие OnKeyPress. Если WinAPI - то немного по-другому...
 К началу страницы 
+ Ответить 
Morfey85
сообщение 24.06.2006 18:58
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


VCL я думаю, в WinAPI лезть пока боюсь.

OnKeyPress это событие.

Что мне делать если в бесконечном цикле , я должен при нажатии калвиши либо выйти из цикла либо изминить какие то переменные?

Чесно говоря пишу игру.
Грубо говоря у меня идет процесс падения какогото "шарика".
В процесс падения я хочу поменять фон (использую TImage) при нажатии стрелочек на клавиатуре.


Сообщение отредактировано: Morfey85 - 24.06.2006 18:59
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 24.06.2006 20:36
Сообщение #6


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


я в змейке писала так:

procedure TForm1.KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 case Key of
  vk_down:  if napravl<>nup then
               napravl:=ndown;
  vk_up:    if napravl<>ndown then
               napravl:=nup;
  vk_left:  if napravl<>nright then
               napravl:=nleft;
  vk_right: if napravl<>nleft then
               napravl:=nright;
 end;
end;


то есть при нажатии стрелки менялось направление змейки.
мне кажется, тебя что-то подобное должно устроить... но это все равно обработчик события.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Morfey85
сообщение 24.06.2006 20:44
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


procedure TForm1.KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 case Key of
  vk_down:  if napravl<>nup then
               napravl:=ndown;
  vk_up:    if napravl<>ndown then
               napravl:=nup;
  vk_left:  if napravl<>nright then
               napravl:=nleft;
  vk_right: if napravl<>nleft then
               napravl:=nright;
 end;
end;


это меня утраивает есть только одно НО.

У меня в прецессе игры идет бесконечный цикл падения "шариков" и в процессе его выполнения я не могу обработать событие KeyDown.

Подскажите либо как мне обработку клвиатуры сделать внутри цикла либо как сделать так чтобы шарики падали сами по себе, в то время как я мог бы выполнять другие действия.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.06.2006 20:53
Сообщение #8


Гость






Добавь Application.ProcessMessages в цикле, и ты сможешь реагировать на нажатия клавиш тоже...
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 24.06.2006 21:51
Сообщение #9


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


а как цикл реализован? может, сделать привязку к таймеру?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Morfey85
сообщение 25.06.2006 11:24
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


Application.ProcessMessages помогло. Только я теперь из цикла выйти не могу и из програмы тоже пока не нажму Еsc(k:=5) и только потом могу выйти.

procedure TForm1.N2Click(Sender: TObject);
var
  i,g:word; //откуда падают яйца и жизни
begin
  randomize;
  o:=0;k:=1;g:=3;    
  Image1.Picture.LoadFromFile(FonFile(k));

  repeat
  i:=random(3)+1;
    repeat

    Image1.Picture.LoadFromFile(FonFile(k));
    нарисовать яйцо
    преместить его координаты
    Application.ProcessMessages;
    until яйцо дошло доконца;
  if i=k then inc(o) else dec(g);
  until g=0;
end;


Что там нащет Таймера?.

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

Сообщение отредактировано: volvo - 2.11.2006 19:48
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Morfey85
сообщение 25.06.2006 16:22
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


Всем спасибо за помощь. Везде разобрался, игру дописал.
Если хотите окончательный вариант можно скачать тут
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 25.06.2006 23:54
Сообщение #12


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


что НЕ понравилось:
момент первый - принципиальный. мерзкое мерцание.
сделай так:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered:=true;<-----добавь эту строку
  k:=0;
  Image1.Picture.LoadFromFile(FonFile(k));
end;

и будет замечательно

момент второй - менее значительный. пользователю незаметный....
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if GameOver=false then
  begin
    case Key of
      39: if (k<>2)and(k<>4) then k:=k+1;
      37: if (k<>1)and(k<>3)and(k<>0) then k:=k-1;
      38: if (k<>4)and(k<>3) then k:=k+2;
      40: if (k<>1)and(k<>2)and(k<>0) then k:=k-2;
    end;
  Image1.Picture.LoadFromFile(FonFile(k));
  Image1.Canvas.Ellipse(x-5,y-5,x+5,y+5);
  end;
end;

немножко смущает выбор по кодам (39, 40...). может, это я дура, но коды всех клавиш не помню. напиши лучше vk_down, vk_up... имхо, будет лучше читаться. или у твоего варианта есть преимущества, просто я не знаю?

Таймеров, я так понимаю, уже сам понапихал, на вопрос ("Что там нащет Таймера?") можно не отвечать?

вообще игра порадовала... воспоминания из раннего-раннего детства smile.gif


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 28.07.2025 1:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"