⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hgespriteengine.pas

📁 完整的Delphi游戏开发控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
//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 + -