![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#46
|
||||
|
||||
|
Посидел, подумал, понял, осознал. Почти. Да, осуществить массив юнитов с собственной точкой принципиально не сложно, но вот как осуществить удаление из массива? Даже наверно по другому и проще. Вот, к примеру, в зависимости от игровой ситуации массив расширяется, соответственно юнитов становится больше. При уничтожении одного юнита, он просто появляется в начальной точке как обновленный, "восстановленный" юнит. Правда, еще не дошел как это осуществить. Подскажете?
|
|
#47
|
||||
|
||||
|
Если убирать никого не надо - то просто при смерти юнита ставим ему полные жизни и меняем координаты на нужную точку.
Если убирать надо - сдвинуть массив юнитов, убрав нужного, или пометить юнита флагом "Dead" и более не обрабатывать. Первое понятнее, второе позволяет при частом добавлении/удалении не создавать новых юнитов, а вписывать информацию в старых, поэтому быстрее. |
| Этот пользователь сказал Спасибо 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
|
||||
|
||||
|
"монстерВаляюсь" должен быть у каждого моба свой. И обработка соответствующая.
|
|
#58
|
||||
|
||||
|
Хмм... А как это сделать? Если с координатами оказалось довольно таки элементарно, то этот пункт будет сложнее.
Вот, точно. Страдалецъ, Вы в своем примере описывали TEnemyState = (msLive, msDead); Как работать с этими двумя значениями - msLive и msDead? Я понимаю, что это вопрос скорее основ прописывания типа, но у меня слишком мало было опыта в работе с типами и классами. Последний раз редактировалось Царь, 24.05.2013 в 23:02. |
|
#59
|
||||
|
||||
|
Работать со всеми полями так, как с координатами. Не пойму, в чем может быть трудность. Все точно так же. С координатами вместо X поставил Enemy[i].X, теперь вместо флага isLying поставить Enemy[i].isLying.
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Царь (25.05.2013)
| ||
|
#60
|
||||
|
||||
|
Спасибо за пинок, Bargest
Это оказывается элементарно просто, как же я сразу не догадался )) Всё работает, спасибо ) |