ROUND ONE. FIGHT!
Sidewalk Showdown is a recreation of Street Fighter II in my personal engine that includes input and hitbox displays.





<ActorDefinitions> <!--default playback = once--> <ActorDefinition name="Ryu" spritesheet="Data/Images/Ryu_12x12.png" cellCount="12,12" defaultAnim="Idle"> <!--Animation--> <Animation name="Idle" frames="0,1,0,2" playback="loop"/> <Animation name="Walk" frames="3,4,5,6,7" playback="loop"/> <Animation name="Walk Back" frames="7,6,5,4,3" playback="loop"/> <Animation name="Jump" frames="8,9,10,9,8" playback="once" interruptible="true"/> <!--...--> <!-- Hurtbox Info --> <DefaultBox mins="0.f, 0.f" maxs="0.f, 0.f"/> <Hurtbox frame="0" mins="-17.5f, -65.f" maxs="17.5f, 15.f"/> <Hurtbox frame="1" mins="-17.5f, -65.f" maxs="17.5f, 15.f"/> <Hurtbox frame="2" mins="-17.5f, -65.f" maxs="17.5f, 15.f"/> <Hurtbox frame="3" mins="-17.5f, -65.f" maxs="17.5f, 10.f"/> <!--...--> </ActorDefinition> <!--...--> </ActorDefinitions>
void InputLogger::AddInputDataForFrame( InputData data, float deltaSeconds ) { if( !m_dataQueue.empty() && data == m_dataQueue.back() ) { m_dataQueue.back().time += deltaSeconds * 60.f; } else { if( (int)m_dataQueue.size() == m_maxEntries ) { m_dataQueue.pop_front(); } m_dataQueue.push_back( data ); } }
Post-Mortem
With this project, I was able to choose the features I wanted to implement, and I had to plan out what I would prioritize each sprint. Throughout the project, I learned that developing and working with assets took the longest amount of time, while system design and implementation tasks often took less time than I thought. I tended to continue padding my time estimates during sprint planning to avoid any perception that I was over-scoping. I was able to complete all of the features I set out to make, but I sacrificed scalability (partially why the only two characters have the same moves). In the future, I want to be more ambitious with my plans but also devote more time to coding smarter.
(SF2 assets from Spriters Resource and Sounds Resource)