Skate Game Prototype
For learning new things
Summary
An Finite Runner, where the player has to reach the end of the level as fast as they can by gaining speed that increases with your score.
Noteworthy Achievements
- Curved World Shader
- Data Driven Architecture
- Level Editor
Curved World Shader
Inspiration (Design)
Infinite Runners often do this thing where their world is curved away from the camera, either down or to the side, for multiple benefits. Benefits like minimizing the amount of objects to render on the screen. However, since the game gets faster and faster the longer you survive, this means that the window to react to the objects appearing on your screen becomes smaller. I despise this.
As a rhythm game fan, I love being overwhelmed and responding to stimuli using just my subconscious. However, communicating these stimuli more rapidly using a negative feedback loop of reaction time leaves players unsatisfied. They feel cheated because the object that they died to wasn’t even spawned before they made the decision to dodge right instead of left. Even if this is not actually the case, it is still what the player experiences.
Gameplay Impact (Design)
What I did instead, is curve the world towards the player. This way, all the information is easily available to the player ahead of time.
This, other than looking cool, removes the previously mentioned feeling of frustration when the player allegedly makes an uninformed decision. All the information to make decisions on is already on the player’s screen.
This changes the challenge from “Reaction Speed“ to “Information Processing Speed“
Implementation (Tech)
I use a Vertex Displacement Shader to curve the world.
It uses parameters that can be changed at runtime to create a dynamic curvature system which developers can use to elevate gameplay.
This is achieved by using a Data Driven approach when building this game’s architecture.
Data Driven Architecture (Tech)
Object Properties
Properties in this context is data necessary for specific objects to functions. This data is stored in JSON to generalize the flow of data through game objects.
This prototype consists of generic object types that hold a container of said Properties. When creating an object, it will use its properties to Initialize itself.
Game Objects
Objects implementing Properties use inheritance to define whatever it will do with this data. However, its Properties are stored as a JSON string. This means that managing classes can interact with these Object Properties generically, and when the need for interacting with its specific Properties arises, it can find the necessary information in the JSON string provided.
The benefit of this is as follows:
- A generic function library for interfacing with Properties can be defined. This can then be used throughout the whole project.
- Instead of interfacing with the Class, the system will interface with the JSON string instead, removing the need for type matching, this allowing for generic reading and writing of data.
An example of this is shown in the Level Editor System.
Level Editor Tools (Tech)
Object Placer / Editor
To easily iterate on levels for my prototype, I made a level editor.
You can scrub through the level like a timeline, and Place/Edit/Remove level objects.
Object specific properties are stored in JSON to prevent generic classes like the Level Manager or Level Editor from needing clauses for each object type. It can just pass the string and the object will initialize itself.
Levels can be saved, loaded, overwritten, and played.
Custom Rail placement
Saving and Loading
Data Driven Implementation
Using the Data Driven object implementation mentioned above, it was trivial to interact and expand the Level Editor interface.
Instead of creating an interface for each Obstacle Class, you create an interface for each Property that you want to interact with in the Level Design process. For each property of a selected object, a separate UI interface can be created dynamically.
As shown in the video, for each Obstacle I select, its relevant properties UI will be added to the screen on the right. The same Property/UI being used for the Pole and the Ring.