Skip to content

Commit ffbf597

Browse files
committed
-
1 parent c40ba8d commit ffbf597

6 files changed

Lines changed: 50 additions & 0 deletions

File tree

src/Pedestrian.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,26 @@ bool Pedestrian::IsCarDriver() const
278278
return false;
279279
}
280280

281+
bool Pedestrian::IsStanding() const
282+
{
283+
ePedestrianState currState = GetCurrentStateID();
284+
return (currState == ePedestrianState_StandingStill || currState == ePedestrianState_StandsAndShoots);
285+
}
286+
287+
bool Pedestrian::IsShooting() const
288+
{
289+
ePedestrianState currState = GetCurrentStateID();
290+
return (currState == ePedestrianState_StandsAndShoots || currState == ePedestrianState_WalksAndShoots ||
291+
currState == ePedestrianState_RunsAndShoots);
292+
}
293+
294+
bool Pedestrian::IsWalking() const
295+
{
296+
ePedestrianState currState = GetCurrentStateID();
297+
return (currState == ePedestrianState_Walks || currState == ePedestrianState_Runs ||
298+
currState == ePedestrianState_WalksAndShoots || currState == ePedestrianState_RunsAndShoots);
299+
}
300+
281301
void Pedestrian::HandleCarEntered()
282302
{
283303
debug_assert(mCurrentCar);

src/Pedestrian.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ class Pedestrian final: public GameObject
5858
bool IsCarPassenger() const;
5959
bool IsCarDriver() const;
6060

61+
// check if pedestrian is in specific state
62+
bool IsStanding() const;
63+
bool IsShooting() const;
64+
bool IsWalking() const;
65+
6166
// detects identifier of current pedestrian state
6267
ePedestrianState GetCurrentStateID() const;
6368

src/PedestrianStates.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ void PedestrianStateIdleBase::ProcessStateFrame(Pedestrian* pedestrian, Timespan
150150
return;
151151
}
152152

153+
if (!CanInterrupCurrentIdleAnim(pedestrian))
154+
return;
155+
153156
ProcessRotateActions(pedestrian, deltaTime);
154157
ProcessMotionActions(pedestrian, deltaTime);
155158

@@ -198,12 +201,25 @@ void PedestrianStateIdleBase::ProcessStateFrame(Pedestrian* pedestrian, Timespan
198201

199202
void PedestrianStateIdleBase::ProcessStateEvent(Pedestrian* pedestrian, const PedestrianStateEvent& stateEvent)
200203
{
204+
if (!CanInterrupCurrentIdleAnim(pedestrian))
205+
return;
206+
201207
if (stateEvent.mID == ePedestrianStateEvent_ActionEnterCar)
202208
{
203209
pedestrian->ChangeState(&pedestrian->mStateEnterCar, &stateEvent);
204210
}
205211
}
206212

213+
bool PedestrianStateIdleBase::CanInterrupCurrentIdleAnim(Pedestrian* pedestrian) const
214+
{
215+
if (pedestrian->IsStanding() && pedestrian->IsShooting())
216+
{
217+
return pedestrian->mCurrentAnimState.IsLastFrame() ||
218+
!pedestrian->mCurrentAnimState.IsAnimationActive();
219+
}
220+
return true;
221+
}
222+
207223
//////////////////////////////////////////////////////////////////////////
208224

209225
void PedestrianStateStandingStill::ProcessStateEnter(Pedestrian* pedestrian, const PedestrianStateEvent* transitionEvent)

src/PedestrianStates.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ class PedestrianStateIdleBase: public PedestrianBaseState
8282
PedestrianStateIdleBase(ePedestrianState stateIdentifier) : PedestrianBaseState(stateIdentifier) {}
8383
void ProcessStateFrame(Pedestrian* pedestrian, Timespan deltaTime) override;
8484
void ProcessStateEvent(Pedestrian* pedestrian, const PedestrianStateEvent& stateEvent) override;
85+
86+
protected:
87+
bool CanInterrupCurrentIdleAnim(Pedestrian* pedestrian) const;
8588
};
8689

8790
// process state ePedestrianState_StandingStill

src/SpriteAnimation.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ void SpriteAnimation::StopAnimation()
9090
mStatus = eSpriteAnimStatus_Stop;
9191
}
9292

93+
void SpriteAnimation::StopAnimationAtEnd()
94+
{
95+
mLoopMode = eSpriteAnimLoop_None;
96+
}
97+
9398
void SpriteAnimation::RewindToStart()
9499
{
95100
mFrameCursor = 0;

src/SpriteAnimation.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class SpriteAnimation
7171
// animation control
7272

7373
void StopAnimation();
74+
void StopAnimationAtEnd(); // disable current loop mode
7475

7576
// play animation from current position
7677
void PlayAnimation(eSpriteAnimLoop animLoop);

0 commit comments

Comments
 (0)