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

Да, по сути таблица это просто, спасибо за совет, мне немного осталось до решения этой задачи )

А вот с монстрами затык. Итак, я плохо пояснил, сейчас сделаю вторую попытку.

Я последовал совету и сделал счетчик полем классна монстр, вот:
Код:
type
  TEnemyState = (msLive, msHurt, msAttack);
  TEnemy = Class(TImageSprite)
    ClawDelay:real;
    Location: Tpoint;
    State:    TEnemyState;
    EnemyPower:integer;
    EnemyHealth:integer;
  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;
Где счетчик - переменная ClawDelay типа real.
Далее, следует процедура DoMove, где и активируется атака:
Код:
procedure TEnemy.DoMove(Movecount:integer);
begin
...
if (((x>=HX-85) and (x<=HX-10)) or ((x<=HX+45) and (x>=HX+10))) and (ClawDelay<=0) then   
State:=msAttack; //HX - координата героя. Если монстр в определенном диапазоне слева или справа относительно местоположения героя и откат атаки меньше или равно нулю, то происходит активация положения атаки

if State=msAttack then //если положение атаки
begin
ClawDelay:=35;       //устанавливается откат атаки
if x<HX then begin       //если монстр слева от героя
SpriteCreate('SpiderAttackRight',0,7);  //анимация атаки вправо
if ClawDelay=15 then        //если откат атаки равен 15, то
with TClaw.Create(Engine) do  //создается спрайт атаки Claw
x:=Self.x+95;  end;    //который появляется чуть правее от монстра

if x>HX then begin     //то же самое, только с поправкой в противоположную сторону
SpriteCreate('SpiderAttackLeft',0,7);
if ClawDelay=15 then
with TClaw.Create(Engine) do
x:=Self.X-10;   end;
AnimLooped:=False;

  end;
Получается, что задав откат атаки, проходит около секунды, прежде чем атака действительно будет иметь губительный эффект для здоровья героя. Далее, после появления спрайта Claw, он тут же исчезает и следующий остаток отката атаки монстр бездействует (секунда где-то), а затем действие повторяется, если для атаки соблюдены все условия. Я надеюсь смог ясно изложить? )

И вот теперь подхожу к кульминации, - отсчет отката атаки. То есть я так и непонял как заставить счетчик "тикать". Я пытался прописать в таймер:
Код:
if Enemy.ClawDelay<>0 then Enemy.ClawDelay:=Enemy.ClawDelay-1;
if Enemy.ClawDelay<=0 then Enemy.State:=msLive;
что привело к ошибке AcessViolation.

Попробовал ввести в процедуру TEnemy.DoMove однако у меня тогда счетчик вообще не тикал.
И вот.
У меня наверное снова какая-то глупая погрешность которую я не заметил в силу своей неопытности и тугодумия. Можете ли вы мне помочь и пояснить?
__________________
Сталкиваться с препятствиями полезно. Только отвечая на вызовы судьбы, мы узнаем пределы наших возможностей.
Ответить с цитированием