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

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

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

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

Сообщение trexxet » 14.04.2013 16:27:23

Здравствуйе. Есть неколько небольших вопросов.
1) Лучше использовать готовый игровой движок или писать свой?
2) Создал класс, в нем несколько видов перемменых. Если его унаследовать от TComponent, то разрешает держать в классе переменные только одного вида. Иначе показывает на следующий вид переменной с писком "Symbol can't be published, can be only a class". Вот скрины.
Изображение
Изображение
Почему это возникает и как исправить?
Заранее спасибо.
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Re: Пара вопросов

Сообщение Frolik » 14.04.2013 16:56:30

1. Если цель - повысить скилл, то лучше писать свой с изобретением всех возможных велосипедов.
Если цель - написать игру, то, чтобы сэкономить время, лучше взять готовый.
2. var в 46 строчке лишнее.
Frolik
постоялец
 
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Re: Пара вопросов

Сообщение runewalsh » 14.04.2013 18:57:30

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

Не, с тех пор, как добавили вложенные типы — не лишнее.
Суть ошибки в том, что для класса с RTTI спецификатор доступа по умолчанию — published, а published поля могут быть только объектами классов. Либо явно пропиши public, либо заверни их в свойства.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Пара вопросов

Сообщение trexxet » 14.04.2013 21:24:47

Спасибо. Пишу свой движок с велосипедами. Удаление var не помогло, помогло написание public перед var.
Как сделать событие по нажатию клавиши на клавиатуре? Пробовал и OnKeyPress, и OnUTF8KeyPress, и OnKeyDown.
Пишу для OnKeyPress:
Код: Выделить всё
if key='w' then Button1.Top:=10;

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

Re: Пара вопросов

Сообщение Little_Roo » 14.04.2013 21:49:50

Может не IF, a CASE ?
И процедура OnKeyPress для кого ?
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Пара вопросов

Сообщение runewalsh » 14.04.2013 22:20:00

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

Если не принципиально, забей на формочки и юзай какой-нибудь SDL. Игровые сущности, привязанные к компонентам — это полный ахтунг.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Пара вопросов

Сообщение trexxet » 14.04.2013 22:53:58

Вот вся процедура. При нажатии на W ничего не происходит.
Код: Выделить всё
procedure Form1.OnKeyPress(Sender: TObject; var Key: char);
begin
  case Key of
    'w': Button1.Top:=10;
  end;
end;
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Re: Пара вопросов

Сообщение runewalsh » 14.04.2013 23:40:21

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

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

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

Re: Пара вопросов

Сообщение Little_Roo » 14.04.2013 23:56:24

Может подстраховаться -
trexxet писал(а):
Код: Выделить всё
case Key of
    'w', 'W' , 'ц', 'Ц' : Button1.Top:=10;

end;


Опередили :D
Фокус на чем?
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Пара вопросов

Сообщение SeZuka » 15.04.2013 07:08:52

А у формы стоит свойство KeyPreview = True?
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Re: Пара вопросов

Сообщение trexxet » 15.04.2013 19:07:39

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

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

Re: Пара вопросов

Сообщение runewalsh » 15.04.2013 19:53:42

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

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

Делфи умеет шестнадцатеричные литералы: $FF12.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Пара вопросов

Сообщение trexxet » 15.04.2013 21:56:49

Таймер дает большую задержку, причем чем меньше я ставлю время тика, тем больше задержка. Но это не важно.
Поясните, как обратиться к клавише?
Вариант
Код: Выделить всё
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.
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 236

Рейтинг@Mail.ru