Да, по сути таблица это просто, спасибо за совет, мне немного осталось до решения этой задачи )
А вот с монстрами затык. Итак, я плохо пояснил, сейчас сделаю вторую попытку.
Я последовал совету и сделал счетчик полем классна монстр, вот:
Код:
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 однако у меня тогда счетчик вообще не тикал.
И вот.
У меня наверное снова какая-то глупая погрешность которую я не заметил в силу своей неопытности и тугодумия. Можете ли вы мне помочь и пояснить?