| Abstract | |
| Game Title: | Super Swordsman |
| Development Team Members: | Luis Bermudez, Calvin Hsu |
| Game Genre: | Fighting Side Scroller |
| Brief Description: | Super Swordsman is a side scrolling platform game rendered in 3d. The player must kill simple patrolling A.I. by pushing them off the platform, or attacking with a sword. The player can also dodge attacks and recover from falling by performing a wall climb. |
| Overview | |
| Game Story / Objective: | A ninja is infiltrating a town and must kill all guards of the town walls |
| Game Mechanics + Controls: |
|
| Technology: |
|
| Aesthetics: |
|
| Media | |
| Screenshots: |
Basic attack: Jumping across: Killing an enemy makes him fly off!: Got killed: |
| Development Summary | |
| CODE: | outline
of code structure, including a clear description of all original code
written, as well as an indication of any external code or libraries
used.
Original code:
Character Class: Contains aerial vs. ground state. Character properties such as movement speed, attack damage, attack lengths, stun times, mass, hp, aerial control speed. The physics controller is encapsulated in this class, which includes methods for calculating force to get an appropriate speed. Includes raycasting for determining hits. (Calvin)
Character View:
GUI:
Game Logic:
Input:
AI Controller: External Libraries / Code
Ogre3D: Rendering engine. Allowed easy loading of models, and creation of shadows.
OgreNewt: Wrapper for Newton Dynamics for Ogre3D. Allowed for easier integration of physics and rendering engines.
Newton Dynamics: Physics engine used for collision detection and character movement. Raycasting also used for hit detection.
Animation Blender: Ogre3D already includes vertex interpolation, based on which animations are enabled, and what weight they have. AnimationBlender encapsulates this functionality, and allows a smooth blend from one animation to another over a given time. |
| CONTENT: | All game models and textures came from Ogre3D SDK. Textures were modified in color for use of the project. Levels, which consisted of simple platforms, were original. |
| Reflections | |
| Three Greatest Challenges: |
Character Physics:
Character physics proved to be much trickier than originally thought.
Implementing a simple character motion of achieving constant velocity
left or right, and being able to stop quickly turned out to be
non-trivial in a physics engine.
Animation Blending:Setting velocity destroyed the effects of constant gravity and made the player float. Instead everything needed to be done through forces. Some calculation needed to be done per step to apply the less/more force to achieve the desired velocity. Jumping proved to be a challenge, and couldn't rely on the same system used for ground movement. I wanted the player to retain the same horizontal velocity prior to jumping, not move at a constant velocity like on the ground. Furthermore there had to be a way to detect whether or not a character was in the air. This was solved by using a collision callback, so everytime a player contacts the ground, and if he had jumped before, then set his airstate back to the ground.
This was a software engineering challenge in how to separate the
model and display. With animations, the display could possibly
affect the model, the animation is done so the action is done.
3d Physics in a 2d World:I later decided to decouple this with a separate model and character view. The model would hold separate timings, which the view would try to animate. The other issue was that with 3d rendering, animations needed to blend correctly in order for the game to feel right and not feel jerky. We did achieve this, but it still didn't feel fully responsive as actions felt delayed with animations needed to blend in. There were problems with actions syncing with animations. Such as a melee attack animation. The method was to do hit detection as soon as the player hit the button, but really that was when the animation showed that the sword was starting to move. We ended up picking an animation that was faster, and speeding the animation time to compensate for this issue. I also thought about using a collision object attached to the skeleton's arm joint to do hit detection, but that would add a lot of complications.
The physics engine was for a 3d world. But it turned out that some
work was required to make it fit to 2d gameplay. We had issues with
players sliding off the axis of play, because they didn't collide
perfectly headon with AI characters. The solution was to turn AI
geometry into very wide rectangular boxes, so that any offcenter
force wouldn't cause the player to slide off.
|
| Three things that went right: |
|
| Three things that went wrong: |
|
| Other final thoughts: | As the first game
both of us have either developed, we clearly tried to bite off more than we
could chew. While in our planning phase, we had actually thought we were
toning down to make an achievable game, and we clearly under estimated the
problems and workload to get basic mechanics running smoothly.
We tried to achieve an aethsetically pleasing game as our first game, which greatly hampered us and distracted us from focusing on core gameplay. In hindsight I think we should not have bothered with complicated models or animation, but rather should have worked with something simple, and develop an interesting game off simple visuals. I learned a lot that it is more important to get some fun gameplay up then it is to focus on aethesetics. And even more importantly, that gameplay can be implemented on simple ideas rather than complicated structures. |