From: DeaDDooMER Date: Tue, 18 Jan 2022 21:16:26 +0000 (+0300) Subject: render: fix monster animations X-Git-Url: http://deadsoftware.ru/gitweb?a=commitdiff_plain;h=76bea6c6401cf1131d7f9caba198cdd8d839ee2b;p=d2df-sdl.git render: fix monster animations --- diff --git a/src/game/opengl/r_animations.pas b/src/game/opengl/r_animations.pas index f50ce92..8af7830 100644 --- a/src/game/opengl/r_animations.pas +++ b/src/game/opengl/r_animations.pas @@ -30,6 +30,7 @@ interface function g_Frames_Dup (const NewName, OldName: AnsiString): Boolean; function g_Frames_Get (out ID: LongWord; const FramesName: AnsiString): Boolean; function g_Frames_GetTexture (out ID: LongWord; const FramesName: AnsiString; Frame: Word): Boolean; + procedure g_Frames_GetFrameSize (ID: DWORD; out w, h: Integer); function g_Frames_Exists (const FramesName: AnsiString): Boolean; procedure g_Frames_DeleteByName (const FramesName: AnsiString); procedure g_Frames_DeleteByID (ID: LongWord); @@ -56,6 +57,17 @@ implementation g_language, g_game ; + procedure g_Frames_GetFrameSize (ID: DWORD; out w, h: Integer); + begin + w := 0; + h := 0; + if framesArray <> nil then + begin + w := framesArray[ID].frameWidth; + h := framesArray[ID].frameHeight; + end + end; + procedure r_AnimationState_Draw (FID: DWORD; t: TAnimationState; x, y: Integer; alpha: Byte; mirror: TMirrorType; blending: Boolean); begin if t.enabled then diff --git a/src/game/opengl/r_monsters.pas b/src/game/opengl/r_monsters.pas index 7b1fcc4..6ae4510 100644 --- a/src/game/opengl/r_monsters.pas +++ b/src/game/opengl/r_monsters.pas @@ -33,8 +33,7 @@ implementation ; type - TMonsterDirected = array [TDirection.D_LEFT..TDirection.D_RIGHT] of DWORD; - TMonsterAnims = array [ANIM_SLEEP..ANIM_PAIN] of TMonsterDirected; + TMonsterAnims = array [ANIM_SLEEP..ANIM_PAIN, TDirection.D_LEFT..TDirection.D_RIGHT] of DWORD; var VileFire: DWORD; @@ -372,7 +371,7 @@ implementation end; procedure r_Monsters_Draw (constref monster: TMonster); - var m: TMirrorType; dx, dy, c, fX, fY: Integer; o: TObj; + var m: TMirrorType; dx, dy, c, fX, fY, mw, mh: Integer; o: TObj; begin with monster do begin @@ -422,8 +421,8 @@ implementation // Расстояние от края текстуры до края визуального положения объекта на текстуре: c := (MONSTERTABLE[MonsterType].Rect.X - dx) + MONSTERTABLE[MonsterType].Rect.Width; // Расстояние от края хит бокса до края визуального положения объекта на текстуре: - //dx := DirAnim[MonsterAnim, GameDirection].Width - c - MONSTERTABLE[MonsterType].Rect.X; - dx := 64 - c - MONSTERTABLE[MonsterType].Rect.X; // !!! ^^^ + g_Frames_GetFrameSize(monFrames[MonsterType, MonsterAnim, GameDirection], mw, mh); + dx := mw - c - MONSTERTABLE[MonsterType].Rect.X; // !!! ^^^ // Т.к. двигать текстуру нужно будет в противоположном направлении: dx := -dx; // Это значит: dX := -frameWidth - animDeltaX + hitX + hitWidth + hitX