📄 hgespriteengine.pas
字号:
//move by rotation speed to destination angle,but not straight direction(no rotate self)
//but can be custom angle
procedure TSpriteEx.CircleToAngle(Angle, LookAtX, LookAtY: Integer; RotateSpeed, MoveSpeed: Single; DoLookAt: Boolean);
begin
if DoLookAt then LookAt(LookAtX, LookAtY);
FDestAngle := Angle;
if not SameValue(FSrcAngle, FDestAngle, RotateSpeed + 1) then
begin
if AngleDiff(FSrcAngle, FDestAngle) > 0 then
FSrcAngle := FSrcAngle + RotateSpeed;
if AngleDiff(FSrcAngle, FDestAngle) < 0 then
FSrcAngle := FSrcAngle - RotateSpeed;
end;
if FSrcAngle > 255 then FSrcAngle := FSrcAngle - 255;
if FSrcAngle < 0 then FSrcAngle := 255 + FSrcAngle;
X := X + (Sin256(Trunc(FSrcAngle))* MoveSpeed);
Y := Y - (Cos256(Trunc(FSrcAngle))* MoveSpeed);
end;
//move by rotation speed to destination position,but not straight direction(no rotae self)
//but can be custom angle
procedure TSpriteEx.CircleToPos(DestX, DestY, LookAtX, LookAtY: Integer; RotateSpeed, MoveSpeed: Single; DoLookAt: Boolean);
begin
if DoLookAt then LookAt(LookAtX, LookAtY);
FDestAngle:= Trunc(
Angle256(DestX - Trunc(X), DestY - Trunc(Y) )
);
if not SameValue(FSrcAngle, FDestAngle, RotateSpeed + 1) then
begin
if AngleDiff(FSrcAngle, FDestAngle) > 0 then
FSrcAngle := FSrcAngle + RotateSpeed;
if AngleDiff(FSrcAngle, FDestAngle) < 0 then
FSrcAngle := FSrcAngle - RotateSpeed;
end;
if FSrcAngle > 255 then FSrcAngle := FSrcAngle - 255;
if FSrcAngle < 0 then FSrcAngle := 255 + FSrcAngle;
X := X + (Sin256(Trunc(FSrcAngle))* MoveSpeed);
Y := Y - (Cos256(Trunc(FSrcAngle))* MoveSpeed);
end;
procedure TSpriteEx.Attach(Sprite: TSprite);
var
CurrentPositionX, PredPositionX, LastPositionX: ^Single;
CurrentPositionY, PredPositionY, LastPositionY: ^Single;
begin
FAttachTo := Sprite;
New(CurrentPositionX);
New(CurrentPositionY);
CurrentPositionX^ := FAttachTo.FX;
CurrentPositionY^ := FAttachTo.FY;
FPositionListX.Add(CurrentPositionX);
FPositionListY.Add(CurrentPositionY);
if FPositionListX.Count > 2 then
begin
LastPositionX := FPositionListX.Last;
LastPositionY := FPositionListY.Last;
PredPositionX := FPositionListX.Items[1];
PredPositionY := FPositionListY.Items[1];
FX := FX + (LastPositionX^ - PredPositionX^);
FY := FY + (LastPositionY^ - PredPositionY^);
FPositionListX.Delete(0);
FPositionListY.Delete(0);
end;
end;
procedure TSpriteEx.Detach;
begin
FAttachTo := nil;
end;
function TSpriteEx.GetDistance(Sprite1: TSprite; Sprite2: TSprite): Real;
begin
Result:= Hypot(Sprite1.X - Sprite2.X, Sprite1.Y - Sprite2.Y);
end;
procedure TSpriteEx.DoDraw;
//var
// ImgName: string;
begin
{
case ImageType of
itSingleImage: ImgName := FImageName + IntToStr(FImageIndex);
itSpriteSheet: ImgName := FImageName;
end;
}
//Trunc(FX + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)),
//Trunc(FY + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
case FDrawMode of
//1 color mode
0:
case TruncMove of
True:
FEngine.FCanvas.DrawColor1(FEngine.FImages.Image[FImageName],
FPatternIndex,
Trunc(FX + FWorldX + FOffsetX - FEngine.FWorldX),
Trunc(FY + FWorldY + FOffsetY - FEngine.FWorldY),
FScaleX, FScaleY, FDoCenter,
FMirrorX, FMirrorY,
FRed, FGreen, FBlue, FAlpha, FBlendMode);
False:
FEngine.FCanvas.DrawColor1(FEngine.FImages.Image[FImageName],
FPatternIndex,
FX + FWorldX + FOffsetX - FEngine.FWorldX,
FY + FWorldY + FOffsetY - FEngine.FWorldY,
FScaleX, FScaleY, FDoCenter,
FMirrorX, FMirrorY,
FRed, FGreen, FBlue, FAlpha, FBlendMode);
end;
// 1 color mode+Rotation
1:FEngine.FCanvas.DrawRotateC(FEngine.FImages.Image[FImageName],
FPatternIndex,
FX + FWorldX + FOffsetX - FEngine.FWorldX,
FY + FWorldY + FOffsetY - FEngine.FWorldY,
FAngle, FScaleX, FScaleY,
FMirrorX, FMirrorY,
ARGB(FAlpha, FRed, FGreen, FGreen), FBlendMode);
//4 color mode
2:FEngine.FCanvas.DrawColor4(FEngine.FImages.Image[FImageName],
FPatternIndex,
Trunc(FX + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)),
Trunc(FY + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
FScaleX, FScaleY, FDoCenter,
FMirrorX, FMirrorY,
Color1, Color2, Color3, Color4, FBlendMode);
//1 color mode+transform
3:FEngine.FCanvas.Draw4V(FEngine.FImages.Image[FImageName],
FPatternIndex,
Trunc(FX1 + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)), Trunc(FY1 + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
Trunc(FX2 + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)), Trunc(FY2 + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
Trunc(FX3 + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)), Trunc(FY3 + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
Trunc(FX4 + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)), Trunc(FY4 + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
FMirrorX, FMirrorY,
ARGB(FRed, FGreen, FBlue, FAlpha), FBlendMode);
//4 color mode+transform
4:FEngine.FCanvas.Draw4v(FEngine.FImages.Image[FImageName],
FPatternIndex,
Trunc(FX1 + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)), Trunc(FY1 + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
Trunc(FX2 + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)), Trunc(FY2 + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
Trunc(FX3 + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)), Trunc(FY3 + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
Trunc(FX4 + FWorldX + FOffsetX - Trunc(FEngine.FWorldX)), Trunc(FY4 + FWorldY + FOffsetY - Trunc(FEngine.FWorldY)),
FMirrorX, FMirrorY,
Color1, Color2, Color3, Color4, FBlendMode);
end;
end;
procedure TSpriteEx.SetColor(const Color: Cardinal);
begin
end;
procedure TSpriteEx.SetColor(Red, Green, Blue: Cardinal; Alpha: Cardinal = 255);
begin
FRed := Red;
FGreen := Green;
FBlue := Blue;
FAlpha := Alpha;
end;
procedure TSpriteEx.SetRed(const Value: Integer);
begin
inherited;
Self.FRed := Value;
SetColor(ARGB(FAlpha, FRed, FGreen, FBlue));
end;
procedure TSpriteEx.SetGreen(const Value: Integer);
begin
inherited;
Self.FGreen := Value;
SetColor(ARGB(FAlpha, FRed, FGreen, FBlue));
end;
procedure TSpriteEx.SetBlue(const Value: Integer);
begin
inherited;
Self.FBlue := Value;
SetColor(ARGB(FAlpha, FRed, FGreen, FBlue));
end;
procedure TSpriteEx.SetAlpha(const Value: Integer);
begin
inherited;
Self.FAlpha := Value;
SetColor(ARGB(FAlpha, FRed, FGreen, FBlue));
end;
procedure TSpriteEx.SetAngle360(Value: Integer);
begin
if FAngle360 <> Value then
FAngle := DegToRad(Value);
end;
procedure TSpriteEx.SetDrawMode(const Value: Integer);
begin
Self.FDrawMode := Value;
if FDrawMode > 4 then FDrawMode := 0;
end;
procedure TSpriteEx.SetGroupNumber(AGroupNumber: Integer);
begin
if (AGroupNumber <> GroupNumber) and (Engine <> nil) then
begin
if Groupnumber >= 0 then
Engine.Groups[GroupNumber].Remove(Self);
if AGroupNumber >= 0 then
Engine.Groups[AGroupNumber].Add(Self);
end;
end;
procedure TSpriteEx.SetSelected(ASelected : Boolean);
begin
if (ASelected <> FSelected) and (Engine <> nil) then
begin
FSelected := ASelected;
if Selected then
Engine.CurrentSelected.Add(Self)
else
Engine.CurrentSelected.Remove(Self);
Engine.FObjectsSelected := Engine.CurrentSelected.Count <> 0;
end;
end;
function TSpriteEx.GetBoundsRect: TRect;
begin
Result := Bounds(Round(FX), Round(FY), Round(FX + Width), Round(FY + Height));
end;
function TSpriteEx.MouseInRect: Boolean;
begin
Result:= PtInRect(Rect(FActiveRect.Left - Trunc(FEngine.WorldX),
FActiveRect.Top - Trunc(FEngine.WorldY),
FActiveRect.Right - Trunc(FEngine.WorldX),
FActiveRect.Bottom - Trunc(FEngine.WorldY)),
Point(Trunc(MouseX), Trunc(MouseY)));
end;
function TSpriteEx.SpriteInRect1(InArea: TRect): Boolean;
begin
Result := RectInRect(FActiveRect, InArea);
end;
function TSpriteEx.SpriteInRect2(InArea: TRect): Boolean;
begin
Result := RectInRect(Rect(FActiveRect.Left - Trunc(FEngine.WorldX),
FActiveRect.Top - Trunc(FEngine.WorldY),
FActiveRect.Right -Trunc(FEngine.WorldX),
FActiveRect.Bottom - Trunc(FEngine.WorldY)),
InArea);
end;
procedure TSpriteEx.DoMouseEvent;
begin
if (Event.EventType=4) then
FMouseDownFlag:= False;
if MouseInRect then
begin
if FMouseEnterFlag = False then
begin
OnMouseEnter;
FMouseEnterFlag := True;
end;
//
case Event.EventType of
//mouse down
3:
begin
if Event.Key = HGEK_LBUTTON then
begin
FMouseDownFlag:=True;
OnLMouseDown;
end;
if Event.Key = HGEK_RBUTTON then
OnRMouseDown;
end;
//mouse up
4:
begin
if Event.Key = HGEK_LBUTTON then
begin
FMouseDownFlag := False;
OnLMouseUp;
end;
if Event.Key = HGEK_RBUTTON then
OnRMouseUp;
end;
//mouse move
5:
begin
OnMouseMove;
if FMouseDownFlag = True then
OnMouseDrag;
end;
end;
if Event.Flags =96 then
OnMouseDbClick;
if Event.Wheel=1 then
OnMouseWheelUp;
if Event.Wheel=-1 then
OnMouseWheelDown;
end;
if (not MouseInRect) then
begin
if FMouseEnterFlag = True then
begin
OnMouseLeave;
FMouseEnterFlag := False;
end;
end;
end;
procedure TSpriteEx.OnMouseEnter;
begin
end;
procedure TSpriteEx.OnMouseLeave;
begin
end;
procedure TSpriteEx.OnMouseMove;
begin
end;
procedure TSpriteEx.OnLMouseDown;
begin
end;
procedure TSpriteEx.OnLMouseUp;
begin
end;
procedure TSpriteEx.OnRMouseDown;
begin
end;
procedure TSpriteEx.OnRMouseUp;
begin
end;
procedure TSpriteEx.OnMouseDbClick;
begin
end;
procedure TSpriteEx.OnMouseWheelUp;
begin
end;
procedure TSpriteEx.OnMouseWheelDown;
begin
end;
procedure TSpriteEx.OnMouseDrag;
begin
end;
{ TAnimatedSprite }
constructor TAnimatedSprite.Create(const AParent: TSprite);
begin
inherited;
FDoAnimate := False;
FAnimLooped := True;
FAnimStart := 0;
FAnimCount := 0;
FAnimSpeed := 0;
FAnimPos := 0;
FAnimPlayMode := pmForward;
FDoFlag1 := False;
FDoFlag2 := False;
end;
procedure TAnimatedSprite.Assign(const Value: TSprite);
begin
if (Value is TAnimatedSprite) then
begin
DoAnimate := TAnimatedSprite(Value).DoAnimate;
AnimStart := TAnimatedSprite(Value).AnimStart;
AnimCount := TAnimatedSprite(Value).AnimCount;
AnimSpeed := TAnimatedSprite(Value).AnimSpeed;
AnimLooped := TAnimatedSprite(Value).AnimLooped;
end;
inherited;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -