Пара вопросов

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Пара вопросов

Сообщение trexxet »

Здравствуйе. Есть неколько небольших вопросов.
1) Лучше использовать готовый игровой движок или писать свой?
2) Создал класс, в нем несколько видов перемменых. Если его унаследовать от TComponent, то разрешает держать в классе переменные только одного вида. Иначе показывает на следующий вид переменной с писком "Symbol can't be published, can be only a class". Вот скрины.
Изображение
Изображение
Почему это возникает и как исправить?
Заранее спасибо.
Frolik
постоялец
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Сообщение Frolik »

1. Если цель - повысить скилл, то лучше писать свой с изобретением всех возможных велосипедов.
Если цель - написать игру, то, чтобы сэкономить время, лучше взять готовый.
2. var в 46 строчке лишнее.
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

Frolik писал(а):var в 46 строчке лишнее.

Не, с тех пор, как добавили вложенные типы — не лишнее.
Суть ошибки в том, что для класса с RTTI спецификатор доступа по умолчанию — published, а published поля могут быть только объектами классов. Либо явно пропиши public, либо заверни их в свойства.
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Спасибо. Пишу свой движок с велосипедами. Удаление var не помогло, помогло написание public перед var.
Как сделать событие по нажатию клавиши на клавиатуре? Пробовал и OnKeyPress, и OnUTF8KeyPress, и OnKeyDown.
Пишу для OnKeyPress:

Код: Выделить всё

if key='w' then Button1.Top:=10;

За раскладкой следил, но он игнорирует.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

Может не IF, a CASE ?
И процедура OnKeyPress для кого ?
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

trexxet писал(а):Спасибо. Пишу свой движок с велосипедами.

Если не принципиально, забей на формочки и юзай какой-нибудь SDL. Игровые сущности, привязанные к компонентам — это полный ахтунг.
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Вот вся процедура. При нажатии на W ничего не происходит.

Код: Выделить всё

procedure Form1.OnKeyPress(Sender: TObject; var Key: char);
begin
  case Key of
    'w': Button1.Top:=10;
  end;
end;
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

trexxet писал(а):При нажатии на W ничего не происходит.

Возможно, фокус не на форме. Повесь тот же обработчик на все контролы, которые могут быть в фокусе.

Кстати, есть другой способ: создаёшь глобальный массив флагов, соответствующих всем нужным тебе клавишам, в OnKeyDown пишешь true, в OnKeyUp — false. 2 больших плюса:
— код клавиши не зависит от раскладки (http://msdn.microsoft.com/en-us/library ... 85%29.aspx)
— нажатие обрабатывается тогда, когда тебе нужно. Дело в том, что если зажать клавишу, OnKeyPress сработает немедленно, потом с небольшой задержкой начнёт повторяться — видно при вводе текста. Для (реалтаймовой) игры это наверняка не подойдёт.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

Может подстраховаться -
trexxet писал(а):

Код: Выделить всё

case Key of
    'w', 'W' , 'ц', 'Ц' : Button1.Top:=10;

end;


Опередили :D
Фокус на чем?
SeZuka
постоялец
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Сообщение SeZuka »

А у формы стоит свойство KeyPreview = True?
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

runewalsh писал(а):Кстати, есть другой способ: создаёшь глобальный массив флагов, соответствующих всем нужным тебе клавишам, в OnKeyDown пишешь true, в OnKeyUp — false.

Можно поподробней? Т.е. создать глобальный массив из 5 элементов (W, A, S, D, ЛКМ) типа boolean, и по событиям OnKeyDown и OnKeyUp изменять их значения на true и false соответственно? Но при этом нужно ставить таймер, который регулярно будет следить за состоянием массива, что будет довольно сильно нагружать систему.
Пытался делать подобный вариант, но не получилось определить код клавиши, т.к. в событии у него тип word (целое десятичное число), а на сайте указаны шестнадцатеричные коды клавиш. Может надо переводить из шестнадцатиричной системы в десятеричную?
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

trexxet писал(а):Но при этом нужно ставить таймер, который регулярно будет следить за состоянием массива

У тебя ведь в любом случае есть таймер обновления/отрисовки, если игра не пошаговая? Ну или основной цикл игры. В общем, преимущество массива в том, что его можно посмотреть откуда угодно.
trexxet писал(а):Может надо переводить из шестнадцатиричной системы в десятеричную?

Делфи умеет шестнадцатеричные литералы: $FF12.
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Таймер дает большую задержку, причем чем меньше я ставлю время тика, тем больше задержка. Но это не важно.
Поясните, как обратиться к клавише?
Вариант

Код: Выделить всё

case Key of
  $57: GKey[1]:=true;
  end;

не работает. Также не работает 57, $FF57 и $0057.
Думаю, для большей ясности следует выложить исходник игры, но он весит довольно много, т.к. программа берет текстуры из файлов.

Добавлено спустя 6 минут 12 секунд:
SeZuka писал(а):А у формы стоит свойство KeyPreview = True?

Да.

Добавлено спустя 3 минуты 17 секунд:
runewalsh писал(а):Повесь тот же обработчик на все контролы, которые могут быть в фокусе.

Спасибо. Вот оно, решение проблемы. Повесил на все кнопки и танк медленно, но уверенно ползет. Единственный минус - очень долгая задержка. Но это уже вопрос к таймеру. Еще раз спасибо.

Добавлено спустя 5 минут 3 секунды:
Посмотрел задержку: на таймер интервал хоть 1000, хоть 10 вешай, но экран обновляется ежесекундно.

Добавлено спустя 22 минуты 22 секунды:
Кстати, год назад пытался использовать движок Andorra 2D, но он у меня не подружился с Лазарем. Сейчас посмотрю ZenGL.
Ответить