15 июня 2011

На распутье

 Смысл заголовка не совсем понятен(но по крайней мере, не будь я автором я бы не понял), так что поспешу начать.
 Сперва перечислю что нового... спешу сам себя разочаровать - почти ничего не проделано. Почему почти?  потому что всё это время занимался исправлением ошибок и доработок
 Из них: 
  • "Коктейль Молотова"(хотя он будет подвержен дальнейшей дороботке);
  • Места создания атакующих юнитов(это сарайчики их которых валят парнокопытные );
Ну а теперь к названию сообщения. 
Вообщем есть пару моментов, которые надо решить:
  • Что делать с огоньком после его столкновения с игровыми объектами?
  • Управление.
 "Что делать с огоньком после его столкновения с игровыми объектами?" 
  При пресечении огонька с игровыми объектами он отнимает немного очков жизни у того с кем "столкнулся" и уничтожается. Данный способ не всегда выглядит понятным. Если находиться близко с объектом, то будет непонятно создано ли пламя или нет. Это может способствовать тому, что у играющих может возникнуть вопрос всё ли в порядке в игре? вообщем не очень то и хорошо получиться. Есть вариант не уничтожать пламя, так как он сам постепенно "угасает". Этот вариант выглядит намного лучше. Но за время своего существования огонёк успевает "спалить" слишком много объектов. Что тоже не есть хорошо.

 "Управление"
 Ну, здесь положение не столь удручающее. Есть несколько вариантов управления ГГ-ем:
  1. ГГ следует за курсором при нажатой ЛКМ. Такой способ управления был принят изначально и до сих пор не менялся. Но так как в игре приходится постоянно двигаться, то палец жмущий ЛКМ постепенно начинает уставать. Что вызывает неприятный дискомфорт(вот так вот я забочусь о игроках).
  2. ГГ так же двигается за курсором, но уже при нажатой клавиши W/стрелочки вверх. При нажатии S/стрелочки вниз - соответственно движется назад.
  3. ГГ постоянно смотрит в сторону курсора. Передвигается с помощью WASD/стрелочек.
Пока остановился на совмещение вариантов 1 и 3.

И ещё один момент. Так как у меня сплошной "быдлокод"(порабы уже и исправляться), то не могу нормально описать процедуру на проверку наличия объектов с определённым классом в списке. Пока сделано подобным образом:

{ на название функции не обращайте внимание}

TGameObjectList.ThereInClass(aClass: TClass): boolean;
var
 i  :integer;
 pG :PGameObject;
begin
 Result := false;
 for i := 0 to Count - 1 do
  begin
   pG := Items[i];
   result := pG^.ClassType = aClass;
  end;
end;

Пока этот способ работает, но всёже  есть свои огрехи.
Ну пока на этом всё.

3 комментария:

  1. Для меня в управлении вариант 3 предпочтительней.

    Хм, TGameObjectList - потомок TList?
    Я у себя отказался от TList в пользу TObjectList.

    Можно попробовать использовать Result := (pG^ is aClass), но вообще смысл довольно странный. В List-е могут быть либо потомки TGameObject, либо он сам, так почему бы не передавать aClass: TGameObjectClass, где TGameObjectClass = class of TGameObject

    Или я что-то неверно понял?

    ОтветитьУдалить
  2. Тогда думаю остановлюсь на 3 варианте, но 1 тоже пока оставлю.

    Для чего нужна эта функция? просто во время игры объект определённого класса должен существовать лишь в единственном экземпляре. Конечно, можно было и простым перебором на количество.

    Да, TGameObjectList - потомок TList.
    "Я у себя отказался от TList в пользу TObjectList"
    Ну, пока TList отлично справляется со своей задачей и отказываться в ближайшее время от него не собираюсь. Хотя, с TObjectList я никогда не работал.

    ОтветитьУдалить
  3. Основное отличие - TObjectList хранит TObject а не Pointer. И при создании листа можно указать, подчищать ему хранимые объекты или нет. TList никогда не подчищает память по своим указателям, т.е. List.Free вызовет утечки, если ты не подчищал его объекты самостоятельно.

    И че-то TList у меня плохо реагировал на конструкции вида
    TMyClass(Items[i]^).SomeProperty. То ли я разучился, то ли лыжи не едут.

    ОтветитьУдалить