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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2010, 00:02   #511
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Спасибо за GetKeyState.
Долго думал я, никак не могу сформулировать вопрос. Задам такой.
Код:
var
  i: byte; 
  msg: string;
...
for i := 1 to 255 do
  if GetKeyState(i) = 128 then msg := msg + chr(i);
То есть по сути - это как печать в какое-либо поле ввода. Но тут проблемка, что такая проверка должна происходить каждые 33 мс, да плюс ещё не факт, что нажатая клавиша не окажется Shift'ом, Alt'ом или F11. Как можно тоже самое сделать более "цивилизованным" методом?


Всё, проблема решена.

Последний раз редактировалось Asker13; 20.12.2010 в 21:34.
Asker13 вне форума Ответить с цитированием
Старый 06.01.2011, 09:18   #512
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Привет. Пишу программу, которая вращает фигуру, а именно прямоугольник, на определённый угол, но столкнулся с проблемой движения фигуры вместе с её поворотом. Честно говоря, код поворота фигуры на языке C++ подсмотрел на одном сайте и перевёл на делфийский. Не совсем понимаю, почему идёт такое перемножение... возможно, что это связано с матрицами, но это только предположение.
Код:
function RotatePoint(Point: TPoint; a: real): TVector;
begin
  a := a * Pi / 180; // Ïåðåâîä â ðàäèàíû
  RotatePoint.X := Round(Point.X *  cos(a) + Point.Y * sin(a));
  RotatePoint.Y := Round(Point.X * -sin(a) + Point.Y * cos(a));
end;
TVector это класс TPoint. Прямоугольник в программе имеет такую структуру:
Код:
  TPointRect = record
    A, B, C, D: TPoint;
  end;
Состоит из четырёх точек. Поворот и отрисовка точек идёт вот так:
Код:
  with buf.Canvas do begin
    with FRect do begin
      FVector := RotatePoint(A, angle);
      MoveTo(FVector.X, FVector.Y);
      FVector := RotatePoint(B, angle);
      LineTo(FVector.X, FVector.Y);
      FVector := RotatePoint(C, angle);
      LineTo(FVector.X, FVector.Y);
      FVector := RotatePoint(D, angle);
      LineTo(FVector.X, FVector.Y);
      FVector := RotatePoint(A, angle);
      LineTo(FVector.X, FVector.Y);
    end;
  end;
Подскажите, как дополнить код , чтобы фигура не двигалась?

UPDATE:
теперь всё работает.
Фигура вращалась относительно 0, а теперь вращается относительно своего центра. Вот изменения в коде:
Структура фигуры:
Код:
  TPointRect = record
    A, B, C, D, M: TPoint;
  end;
Инициализация фигуры:
Код:
  with FRect do begin
    M.X := 125; 
    M.Y := 125; Центр фигуры
    A.X := -25; 
    A.Y := -25;  Левый верхний угол фигуры
    B.X :=  25; 
    B.Y := -25; Правый верхний
    C.X :=  25; 
    C.Y :=  25; Правый нижний
    D.X := -25; 
    D.Y :=  25; Левый нижний
  end;
Отрисовка фигуры:
Код:
  with buf.Canvas do begin
    with FRect do begin
      FVector := RotatePoint(A, angle);
      MoveTo(M.X + FVector.X, M.Y + FVector.Y);
      FVector := RotatePoint(B, angle);
      LineTo(M.X + FVector.X, M.Y + FVector.Y);
      FVector := RotatePoint(C, angle);
      LineTo(M.X + FVector.X, M.Y + FVector.Y);
      FVector := RotatePoint(D, angle);
      LineTo(M.X + FVector.X, M.Y + FVector.Y);
      FVector := RotatePoint(A, angle);
      LineTo(M.X + FVector.X, M.Y + FVector.Y);
    end;
  end;

Последний раз редактировалось Asker13; 06.01.2011 в 14:09.
Asker13 вне форума Ответить с цитированием
Старый 19.01.2011, 23:36   #513
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Простой урок.
Код:
function KeyPressed(Key: Byte): Boolean;
var
  Keys: TKeyboardState;
begin
  Result := False;
  GetKeyboardState(Keys);
  If(Keys[Key] = 128) Or (Keys[Key] = 129) then Result := True;
end;
Частенько встречал этот код в различных проектах, который проверяет нажатие определённой клавиши. Но есть недостатки. Каждый раз при вызове функции создаётся новая переменная Keys типа TKeyboardState, да плюс к тому надо узнать состояние всех клавиш на клавиатуре при помощи GetKeyboardState.
Лучше сделать так. Создадим глобальную переменную Keys: array [byte] of boolean;
В FormKeyDown пропишем Keys[Key] := true; а в FormKeyUp - Keys[Key] := false;
При этом для того, чтобы проверить состояние клавиши, достаточно прописать всего-лишь if Keys[НОМЕР_КЛАВИШИ] then Действия. Метод куда более удобен и быстр по сравнению с предыдущим, имеет свои плюсы, а самое главное - несложный. =)
Asker13 вне форума Ответить с цитированием
Старый 20.01.2011, 01:21   #514
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Кроме того, любая форма уже содержит все необходимое для клавиатуры и мыши, нужно только посмотреть события внимательно.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.01.2011, 02:47   #515
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Очень хочется отметить в этой теме следующие примеры из документации Qt. Там для разработки может использоваться QML и Graphics View.
Вот для QML:
http://doc.qt.nokia.com/4.7/demos-de...ive-snake.html -- змейка
http://doc.qt.nokia.com/4.7/demos-de...-samegame.html -- игра same
http://doc.qt.nokia.com/4.7/demos-de...-minehunt.html -- минёр

Для Graphics View framework:
http://doc.qt.nokia.com/4.7/graphics...idingmice.html -- не игра, демонстрация Graphics View framework
http://doc.qt.nokia.com/4.6/demos-sub-attaq.html -- игрушка про подлодки
http://doc.qt.nokia.com/4.7/graphics...asteroids.html -- астероиды
http://doc.qt.nokia.com/4.6/demos-boxes.html -- не игра, пример применения opengl
http://doc.qt.nokia.com/4.7/graphics...droprobot.html -- тоже не игра, но полезно

И вот не используещее ни то, ни другое:
http://www.forum.nokia.com/info/sw.n...ewdocs-Noughts -- крестики-нолики
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 22.01.2011 в 02:52.
Obey-Kun вне форума Ответить с цитированием
Старый 22.01.2011, 11:37   #516
Shadow_1329
Форумчанин
 
Аватар для Shadow_1329
 
Регистрация: 23.02.2009
Сообщений: 237
По умолчанию

2 Asker13

Цитата:
В FormKeyDown пропишем Keys[Key] := true; а в FormKeyUp - Keys[Key] := false;
Зачем? Если Keypressed использовать, то процедуры формы к чему?
Shadow_1329 вне форума Ответить с цитированием
Старый 22.01.2011, 16:07   #517
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию VCL управление с клавиатуры

Цитата:
Сообщение от Asker13 Посмотреть сообщение
Лучше сделать так. Создадим глобальную переменную Keys: array [byte] of boolean;
В FormKeyDown пропишем Keys[Key] := true; а в FormKeyUp - Keys[Key] := false;
При этом для того, чтобы проверить состояние клавиши, достаточно прописать всего-лишь if Keys[НОМЕР_КЛАВИШИ] then Действия. Метод куда более удобен и быстр по сравнению с предыдущим, имеет свои плюсы, а самое главное - несложный. =)
Похвально, что потребности заставляют думать и применять различные алгоритмы. Но, нужно понимать суть того или иного алгоритма, для чего он был создан. Например, если посмотреть на типичную функцию:

Код:
function KeyPressed(Key: Byte): Boolean;
то сразу бросается в глаза то, что это функция, возвращающая истинность или ложность, вне зависимости от самих клавиш, т.е. может быть вызвана для каждой клавиши и притом "одновременно". То, что это отдельная функция, указывает еще на то, что использовать метод следует в полноэкранном режиме без VCL, т.е. "нет окна" и его события не обрабатываются. Выполняется таймер, в нем посредством функции идет сбор данных о состоянии клавиш.

Теперь рассмотрим пример, когда используется VCL, т.е. изначально есть форма и создан класс TForm. В этом классе есть специальные события на зажатие/отпускание/нажатие клавиш. Так как это событие, то оно вызывается отдельно для каждой клавиши. Пропишите простой пример и убедитесь в том, что VCL предоставляет все необходимое для работы с клавиатурой без дополнительных функций:

Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  If Key = Ord('W') then Label1.Caption := 'Нажата W';
  If Key = Ord('D') then Label2.Caption := 'Нажата D';
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  If Key = Ord('W') then Label1.Caption := ' ';
  If Key = Ord('D') then Label2.Caption := ' ';
end;
Попробуйте самостоятельно разобраться, что такое Shift: TShiftState и как им пользоваться.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 03.03.2011, 11:18   #518
AngelOfFate
Пользователь
 
Аватар для AngelOfFate
 
Регистрация: 02.03.2011
Сообщений: 12
По умолчанию

Всем привет. Подскажите, как можно очистить канву формы, после прорисовки кадра, объект двигается, но после себя оставляет след, такой код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
begin
  j:=0;
  while j <= Form1.Width do
  begin
  for i:=0 to 5 do
  begin
    ImageList1.Draw(Form1.Canvas,j,10,i);
    Sleep(100);
    j:=j+1;
  end;
  end;
end;
AngelOfFate вне форума Ответить с цитированием
Старый 03.03.2011, 11:52   #519
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Перерисовывайте весь кадр заново, следа не будет.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 03.03.2011, 12:03   #520
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Заливаете всю форму фоновым цветом
Код:
Form1.Canvas.Rectangle(1, 1, Form1.Width, Form1.Height);
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07