Bomberman Blast! Remake (DirecX11, C++)
I delved deep into romhacking & emulation forums and found out about the intricacies of the Wii file formats, giving me the tools & ability to understand and manipulate the specific data needed for this project. This specific game was never documented thoroughly so I had to go through some trial & error as I explored the assets structure.
During the assets export process I encountered several animations that were not behaving as intended, not looping correctly or containing incorrect rotations on some bones due to bone scaling. Using Autodesk Maya, I manually fixed many of the animations and remade a few simple ones from scratch in Maya (Flowers animations), as well as animated some assets by code using solutions such as sine waves (Bushes squishing, Butterflys flight).
Draw order situations can often become complex, especially when transparency is involved. A prominent example of this in my game was with the bushes. To solve the issue, I utilized the
clip() function of the pixel shader. This function allowed me to effectively manage complicated transparency draw order situations, ensuring that each bush was rendered in its correct order without any visual artifacts, against its own submeshes as well as other bushes.
Incorporating smooth transitions between animations is crucial for a natural game experience. For this, I implemented an
AnimationBlender class, designed to manage and execute seamless transitions between animation clips. Here's a more in-depth look into the technical aspects of it:
ModelAnimator. This animator handles the current animation state, and the blender utilizes it to transition from one animation to the next.
StartBlendfunction is invoked. It stores the current animation clip and its progress, marking the beginning of a blending phase.
Updatefunction ensures that the blending happens smoothly over time. It calculates a blend factor based on the elapsed time and the predefined blend duration. By using this factor, the function then interpolates between the ending frame of the previous animation and the starting frame of the new one.
GetInterpolatedKeyfunction fetches an interpolated animation keyframe based on the given time. It determines the two closest keyframes (before and after the given time) and interpolates between their bone transforms.
Updatefunction sets the new animation clip as the active one in the animator, ending the blending phase.