Zitat von
3_of_8:
Bei Vergiftung usw. musst du das halt dann anders machen:
Poisoned, Frozen, Burning: Boolean;
PoisonDamage, PoisonTime, FrozenTime, BurnTime: Cardinal; //(in ms)
Das würde ich aber um einiges generischer gestalten.
Delphi-Quellcode:
ITiming =
interface
procedure Advance(dTime: Cardinal);
end;
//[...]
TState =
class
protected
FOwner: TAvatar;
public
constructor Create(AOwner: TAvatar);
end;
TTimeBasedState =
class(TState, ITiming)
protected
FRemainingTime: Cardinal;
class function GetDuration: Cardinal;
virtual;
abstract;
public
property RemainingTime: Cardinal
read FRemainingTime;
constructor Create(AOwner: TAvatar);
procedure Advance(dTime: Cardinal);
virtual;
end;
TPoison =
class(TTimeBasedState)
protected
class function GetDuration: Cardinal;
override;
public
procedure Advance(dTime: Cardinal);
override;
end;
implementation
{$R *.dfm}
{ TState }
constructor TState.Create(AOwner: TAvatar);
begin
FOwner := AOwner;
end;
{ TTimeBasedState }
constructor TTimeBasedState.Create(AOwner: TAvatar);
begin
FRemainingTime := GetDuration;
end;
procedure TTimeBasedState.Advance(dTime: Cardinal);
begin
Dec(FRemainingTime, dTime);
FOwner.States.RemoveMe;
end;
{ TPoison }
class function TPoison.GetDuration: Cardinal;
begin
Result := 10 * 1000;
// 10 s
end;
procedure TPoison.Advance(dTime: Cardinal);
begin
inherited;
FOwner.Health -= 10 * dTime / 1000;
// 10 Schaden pro Sekunde
end;
Dazu noch eine globale Liste, in die sich der State einfügt (nur über das Interface) und die dann jeden Frame ihre Items durchrattert.
Naja, so könnte ich es mir jedenfalls vorstellen ^^ .
*diskussionwiederauftopicführ*