|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#46
|
||||
|
||||
Посидел, подумал, понял, осознал. Почти. Да, осуществить массив юнитов с собственной точкой принципиально не сложно, но вот как осуществить удаление из массива? Даже наверно по другому и проще. Вот, к примеру, в зависимости от игровой ситуации массив расширяется, соответственно юнитов становится больше. При уничтожении одного юнита, он просто появляется в начальной точке как обновленный, "восстановленный" юнит. Правда, еще не дошел как это осуществить. Подскажете?
|
#47
|
||||
|
||||
Если убирать никого не надо - то просто при смерти юнита ставим ему полные жизни и меняем координаты на нужную точку.
Если убирать надо - сдвинуть массив юнитов, убрав нужного, или пометить юнита флагом "Dead" и более не обрабатывать. Первое понятнее, второе позволяет при частом добавлении/удалении не создавать новых юнитов, а вписывать информацию в старых, поэтому быстрее. jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Царь (22.05.2013)
|
#48
|
||||
|
||||
Bargest, можете, пожалуйста, пояснить этот пункт подробно, на пальцах и с примером? Ибо сидел я долго, нудно и так и не понял как это сделать. У меня монстры вяжутся с одной точкой и моё вселенское терпение сменилось нарастающим отчаянием
|
#49
|
||||
|
||||
Ну сделайте вы общий класс и плодите экземпляры от него и будут вам для каждого монстра свои параметры:
Код:
Type TMonsterState = (msLive, msDead); TMonster = class Location: TPoint; State: TMonsterState; end; ... Var Orda: Array of TMonster; begin SetLength(Orda, 0); for i := 1 to 100 do begin SetLength(Orda, Length(Orda)+1); Orda[High(Orda)] := TMonster.Create; Orda[High(Orda)].Location.X := Random(100); Orda[High(Orda)].Location.Y := Random(100); Orda[High(Orda)].State := msLive; end; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Царь (22.05.2013)
|
#50
|
||||
|
||||
Ххорошо... Вот, как бы делаю по Вашему, Страдалецъ, примеру, старательно пытаясь вникнуть.
|
#51
|
||||
|
||||
MasM: array of TEnemy; Вынесите в глобальные переменные или в приватные главной формы, а то они у вас живут только в пределах Procedure TGameForm.NewEnemy;
Создание спрайта и создание монстра у вас суть одно и тоже, это все можно объединить в один класс. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Царь (22.05.2013)
|
#52
|
||||
|
||||
Да... Уже, вроде, лучше. Благодарю. А как связать TPoint, то есть Location с "х" и "у" процедуры DoMove?
|
#53
|
||||
|
||||
Страдалецъ, я сделал как Вы сказали, однако мои пауки так же не привязываются к заданной точке, без изменений. Пытался понять, не получилось. Прошу помочь.
Они действуют по отдельности, атакуют по отдельности, поворачиваются в сторону героя по отедльности. Но ходят единым маршом, - синхронно! Последний раз редактировалось Царь, 23.05.2013 в 16:14. |
#54
|
|||
|
|||
Инициализацию координат сделай в конструторе,
Код:
Constructor TEnemy.Create(AParent:TSprite); begin inherited Create(AParent); image:=GameForm.MonsterList.Items.Find('SpiderStandRight'); Width:=Image.Width; Height:=Image.Height; PixelCheck := True; AnimCount :=Image.PatternCount; AnimLooped := True; AnimSpeed := 100 / 1000; Location.x:=Random(300); Location.Y:=200; x:=Location.X; //присваиваю координаты y:=Location.Y; State:= msLive; Collision; end; А тут уже только создавай Код:
Procedure TGameForm.NewEnemy; var i:integer; MasM: array of TEnemy; begin for i:=1 to 5 do begin SetLength(MasM,Length(MasM)+1); MasM[High(MasM)]:=TEnemy.Create(DXSpriteEng.Engine); end; end; |
Этот пользователь сказал Спасибо ildvild за это полезное сообщение: | ||
Царь (23.05.2013)
|
#55
|
||||
|
||||
Клянусь святым контроальтделет Я ПОНЯЛ! Я понял, понял, понял в чем ошибка! Небо, это же было так просто. Какой же я дурак. Простите, это исключительно моя ошибка, ваши коды были верны и я вам очень, очень благодарен ) А я идиот и тугодум, - не увидеть два дня подряд такую мелочь. Теперь я закончу эту игру >D
|
#56
|
||||
|
||||
Хм... Дошел до такой небольшой проблемки:
Когда герой попадает в монстра оружием, то наносится повреждение, начинается отсчет "ранение" при котором монстр не может двигаться и атаковать, и выводится анимация падения. При окончании счестчика жизни монстр исчезает. - И сама проблема: я прописываю в процедуре DoCollision: начинаем если спрайт это оружие то начинаем монстерБоль:=40; монстерВаляюсь:=Правда; Жизнямонстра:=Жизнямонстра-Геройатака; если монстер=смотрювправо то х(монстер):=х-10; если монстер=смотрювлево то //отброс монстра при попадании оружия х(монстер):=х+10; если Жизнямонстра=0 тогда Смерть; конец; Done:=неправда; //не знаю что это, но оно в процедуре требуется конец; После этого выходит, если я бью одного монстра, то все валяются. Но умирают по отдельности и отлетают тоже по отдельности. Что сделать, что бы они получали боль по отдельности и валялись по отдельности? Последний раз редактировалось Царь, 24.05.2013 в 18:47. |
#57
|
||||
|
||||
"монстерВаляюсь" должен быть у каждого моба свой. И обработка соответствующая.
jmp $ ; Happy End! The Cake Is A Lie. |
#58
|
||||
|
||||
Хмм... А как это сделать? Если с координатами оказалось довольно таки элементарно, то этот пункт будет сложнее.
Вот, точно. Страдалецъ, Вы в своем примере описывали TEnemyState = (msLive, msDead); Как работать с этими двумя значениями - msLive и msDead? Я понимаю, что это вопрос скорее основ прописывания типа, но у меня слишком мало было опыта в работе с типами и классами. Последний раз редактировалось Царь, 24.05.2013 в 23:02. |
#59
|
||||
|
||||
Работать со всеми полями так, как с координатами. Не пойму, в чем может быть трудность. Все точно так же. С координатами вместо X поставил Enemy[i].X, теперь вместо флага isLying поставить Enemy[i].isLying.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Царь (25.05.2013)
|
#60
|
||||
|
||||
Спасибо за пинок, Bargest Это оказывается элементарно просто, как же я сразу не догадался )) Всё работает, спасибо )
|