Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Флейм
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #46  
Старый 21.05.2013, 20:54
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Посидел, подумал, понял, осознал. Почти. Да, осуществить массив юнитов с собственной точкой принципиально не сложно, но вот как осуществить удаление из массива? Даже наверно по другому и проще. Вот, к примеру, в зависимости от игровой ситуации массив расширяется, соответственно юнитов становится больше. При уничтожении одного юнита, он просто появляется в начальной точке как обновленный, "восстановленный" юнит. Правда, еще не дошел как это осуществить. Подскажете?
Ответить с цитированием
  #47  
Старый 21.05.2013, 22:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Если убирать никого не надо - то просто при смерти юнита ставим ему полные жизни и меняем координаты на нужную точку.
Если убирать надо - сдвинуть массив юнитов, убрав нужного, или пометить юнита флагом "Dead" и более не обрабатывать. Первое понятнее, второе позволяет при частом добавлении/удалении не создавать новых юнитов, а вписывать информацию в старых, поэтому быстрее.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Царь (22.05.2013)
  #48  
Старый 22.05.2013, 04:17
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Bargest, можете, пожалуйста, пояснить этот пункт подробно, на пальцах и с примером? Ибо сидел я долго, нудно и так и не понял как это сделать. У меня монстры вяжутся с одной точкой и моё вселенское терпение сменилось нарастающим отчаянием
Ответить с цитированием
  #49  
Старый 22.05.2013, 11:54
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну сделайте вы общий класс и плодите экземпляры от него и будут вам для каждого монстра свои параметры:
Код:
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  
Старый 22.05.2013, 13:25
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ххорошо... Вот, как бы делаю по Вашему, Страдалецъ, примеру, старательно пытаясь вникнуть.
  1. У меня уже был тип врагов в отведенном юните, я его просто дополнил Вашим примером:


    Код:
    type
      TEnemyState = (msLive, msDead);
      TEnemy = Class(TImageSprite)
        Location:Tpoint;
        State:TEnemyState;
      protected
        procedure DoMove(MoveCount:Integer); override;
        procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
        procedure SpriteCreate(Name:String; Anis:integer; Anic:integer); //процедура для упрощенного создания анимации монстров
      public
        Constructor Create(AParent:TSprite); override;
        Destructor Destroy; override;
    end;


  2. Далее, я прописываю SpriteCreate, конструктор и деструктор, DoMove и DoCollision. Опишу конструктор:
    Код:
    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;
        x:=Location.X;         //присваиваю координаты
        y:=Location.Y;
        Collision;
      end;
  3. Теперь применяю Ваш код в основном юните с помощью процедуры NewEnemy, взяв для примера небольшое количество и без прописывания, что будет с монстром при msDead:

    Код:
    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);
         MasM[High(MasM)].Location.x:=Random(300);
         MasM[High(MasM)].Location.Y:=200;   //стандартная "поверхность"
         MasM[High(MasM)].State:= msLive;
              end;
     end;

    Процедуру вызываю пока что только onFormCreate.
    При инициализации мои монстры так же привязываются к одной и той же координатной точке. Небо, что я делаю не так? Массив есть, в каждый пункт массива вписываю создание и ничего не выходит. А, и еще монстры не получают заданную координату начиная с угла экрана. То есть, с нуля. Я сделал что-то не так?
Ответить с цитированием
  #51  
Старый 22.05.2013, 15:03
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

MasM: array of TEnemy; Вынесите в глобальные переменные или в приватные главной формы, а то они у вас живут только в пределах Procedure TGameForm.NewEnemy;
Создание спрайта и создание монстра у вас суть одно и тоже, это все можно объединить в один класс.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Царь (22.05.2013)
  #52  
Старый 22.05.2013, 16:48
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да... Уже, вроде, лучше. Благодарю. А как связать TPoint, то есть Location с "х" и "у" процедуры DoMove?
Ответить с цитированием
  #53  
Старый 23.05.2013, 15:56
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Страдалецъ, я сделал как Вы сказали, однако мои пауки так же не привязываются к заданной точке, без изменений. Пытался понять, не получилось. Прошу помочь.
Они действуют по отдельности, атакуют по отдельности, поворачиваются в сторону героя по отедльности. Но ходят единым маршом, - синхронно!

Последний раз редактировалось Царь, 23.05.2013 в 16:14.
Ответить с цитированием
  #54  
Старый 23.05.2013, 17:52
ildvild ildvild вне форума
Прохожий
 
Регистрация: 12.10.2010
Адрес: Уфа
Сообщения: 31
Версия Delphi: 7, 2007, 2010
Репутация: 10
По умолчанию

Инициализацию координат сделай в конструторе,
Код:
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  
Старый 23.05.2013, 18:19
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Клянусь святым контроальтделет Я ПОНЯЛ! Я понял, понял, понял в чем ошибка! Небо, это же было так просто. Какой же я дурак. Простите, это исключительно моя ошибка, ваши коды были верны и я вам очень, очень благодарен ) А я идиот и тугодум, - не увидеть два дня подряд такую мелочь. Теперь я закончу эту игру >D
Ответить с цитированием
  #56  
Старый 24.05.2013, 18:42
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Хм... Дошел до такой небольшой проблемки:

Когда герой попадает в монстра оружием, то наносится повреждение, начинается отсчет "ранение" при котором монстр не может двигаться и атаковать, и выводится анимация падения. При окончании счестчика жизни монстр исчезает.

- И сама проблема: я прописываю в процедуре DoCollision:
начинаем
если спрайт это оружие то
начинаем
монстерБоль:=40;
монстерВаляюсь:=Правда;

Жизнямонстра:=Жизнямонстра-Геройатака;

если монстер=смотрювправо то
х(монстер):=х-10;
если монстер=смотрювлево то //отброс монстра при попадании оружия
х(монстер):=х+10;

если Жизнямонстра=0 тогда Смерть;
конец;
Done:=неправда; //не знаю что это, но оно в процедуре требуется
конец;


После этого выходит, если я бью одного монстра, то все валяются. Но умирают по отдельности и отлетают тоже по отдельности. Что сделать, что бы они получали боль по отдельности и валялись по отдельности?

Последний раз редактировалось Царь, 24.05.2013 в 18:47.
Ответить с цитированием
  #57  
Старый 24.05.2013, 21:47
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

"монстерВаляюсь" должен быть у каждого моба свой. И обработка соответствующая.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #58  
Старый 24.05.2013, 22:25
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Хмм... А как это сделать? Если с координатами оказалось довольно таки элементарно, то этот пункт будет сложнее.
Вот, точно. Страдалецъ, Вы в своем примере описывали TEnemyState = (msLive, msDead); Как работать с этими двумя значениями - msLive и msDead? Я понимаю, что это вопрос скорее основ прописывания типа, но у меня слишком мало было опыта в работе с типами и классами.

Последний раз редактировалось Царь, 24.05.2013 в 23:02.
Ответить с цитированием
  #59  
Старый 25.05.2013, 02:50
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Работать со всеми полями так, как с координатами. Не пойму, в чем может быть трудность. Все точно так же. С координатами вместо X поставил Enemy[i].X, теперь вместо флага isLying поставить Enemy[i].isLying.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Царь (25.05.2013)
  #60  
Старый 25.05.2013, 15:02
Аватар для Царь
Царь Царь вне форума
Новичок
 
Регистрация: 13.05.2013
Сообщения: 52
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо за пинок, Bargest Это оказывается элементарно просто, как же я сразу не догадался )) Всё работает, спасибо )
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter