Giter Club home page Giter Club logo

labyrinth-game's Introduction

COMP30019 – Graphics and Interaction

Labyrinth Game

Table of contents

Game Summary

The Minotaur is a mythical creature of great might, who had a labyrinth created around it just to contain its power. Every year the king sends nine of his greatest warriors to try and defeat the unstoppable beast and after forty winters, no mortal has yet had the power to defeat it.

Theseus, son of Aegeus and the undefeated champion of Greece, has taken upon himself the challenge of defeating the Minotaur. Our courageous champion has decided to face the beast alone.

Traverse the labyrinth as Theseus, collect items and fight monsters, and delve deeper into the brink to finally kill the accursed beast.

How to play

Controls
Move: W, A, S, D Keys
Jump: Spacebar
Sprint: Left Shift Key
Melee attack: Left Mouse Button
Charge ranged attack: Hold Right Mouse Button
Ranged attack: Release Right Mouse Button
Pause: Escape Key

Gameplay
Walk into health items to heal
Walk into stat increases to increase the corresponding stat
Finish levels by falling down the hole
Beat the game by reaching the final level and beating the Minotaur

High Level Gameplay Decisions

Camera View Choice
Our game is in first person view as it brings a more immersive experience and makes the game scarier since players will not know what is hiding behind a wall providing an element of surprise!

Enemies
We decided to put enemies into our maze to make the game more challenging for our players.

Enemies attack with projectiles since it’s simple to implement and enables the player to predict and dodge attacks as well.

Enemy AI uses the unity navigation mesh system for built in pathfinding. If an enemy has direct line of sight of the player, it stores the player’s last known position, and moves toward it.

Stat System
We included a stat system in our game that makes the player stronger as the game progresses as throughout the levels, the number of enemies increases and the player will have to be stronger in order to progress.

The stat pickups are randomly placed in each level and players will have to explore the whole level if they want to get stronger.

There are 4 different types of stats: Health Stat which increases max health of the player

Stamina Stat which increases the max stamina of the player. When the player sprints, it consumes stamina in order to move at x1.5 speed.

Speed Stat which increases the speed of the player.

StrengthStat which increases the strength of the player.

Ammo Stat which increases the maximum ammo capacity of the player. The player can hold right click to charge a ranged attack. Charging longer will deal more damage (quadratically) but consume more ammo (linearly), thus making it beneficial to fully charge the ranged attack.

Healing Item which refills the player's health.

Ammo Item which refills the player's ammo.

Graphical and Sound Assets

No graphical & sound assets were custom made for this project. Refer to the references section for all the assets used in the game.

Explanations for asset choice

Graphics
We chose graphical assets that fit the ancient Greek theme of the game. The texture of the walls and floor along with the torches on both sides of the walls are intended to fit the visual look of a labyrinth from that time. Two of the enemy models, the centaur and of course the minotaur, are figures from Greek mythology. The sword used is a 3d model replica of an actual ancient Greek sword. The borders of the UI health and stamina bars have a Greek patterned texture. The font used is also Greek-inspired.

Sound
Ominous background music was chosen to fit the foreboding and puzzling nature of the labyrinth. The enemies each have a unique damage sound effect in order for the player to clearly know which enemy they are attacking. A player damage sound effect was also added to give a clear indication of when the player was hurt along with the health bar decrease. Pickups have a sound effect to also clearly indicate to the player when they have been picked up.

Graphics Pipeline

World Space Texture Shader
The World Space Texture Shader was created to solve the issue of distorted texture mapping on the walls of the maze due to their differing sizes.

Distorted textures when using Standard Unity Shader

Fixed when using World Space Texture Shader

Instead of mapping the wall textures to the object UV maps, the texture is mapped to world space. The side of the wall that the texture is mapped to is first determined by calculating the direction of the normal of the wall and then assigning UV coordinates accordingly.

Along with the conversion to world space, lighting was also manually implemented in the shader since it was required to be a vertex/fragment shader rather than a Surface shader. This involved adding diffuse lighting, ambient occlusion and specular lighting. The specular lighting is calculated using the Blinn-Phong model. The lighting is done in two passes in order to incorporate the effects of all the lights in the scene.

Dissolve Shader
The Dissolve Shader is applied to enemies after they die to make them dissolve out rather than abruptly disappear when they are destroyed.

The shader works by sampling a noise texture, and then removing the pixels with a lower noise value (the darkest pixels in the noise texture). As time passes, the threshold for a pixel not being removed increases, until eventually all pixels have been removed. The randomness of the noise texture leads to a random-looking dissolve effect. The shader also incorporates different colours to look more interesting. Each colour has a different threshold that must be passed in order for it to be rendered, making the different colours merge into each other. In order to activate the shader only after the enemies die, a time variable is incremented from a script and its value passed into the shader.

Procedural Generation

The game’s levels are multiple sections placed sequentially. Each section has a maze inside, with walls between sections removed.

The first section of the level is always empty with a tube the player falls down from. The last section of the level is always empty with a hole the player falls into to finish the level.

Mazes are generated using what is essentially a depth-first search in a 2D array of cells. Each cell is initially set to have walls at every possible position. A random cell is selected to be the start for the search, and as the algorithm moves between cells, it marks that there should not be a wall between the respective cells. When the algorithm detects it cannot move between cells, it backtracks along the path it has taken to find a cell to enter.

Enemies, health items and stat increases have a set amount per section, and each category are placed independently of each other. They are placed inside the maze using a priority system on cells. Cells that are further away from previously placed entities are prioritised.

Particle System

The particle system that is to be assessed is the Fireball projectile, which is shot by the enemies when they attack the player.

The fireball is a combination of 5 particle systems that each contribute a particular visual effect to the overall fireball, such as the base material, outer glow, smoke and sparks. For the base fireball, an explosion sprite sheet is animated over time to create a fire-like flickering effect. The Colour, Size and Rotation of the particle system are modified over their lifetime to make the fireball more dynamic. The trailing effect of the smoke and sparks are created by setting their Simulation Space to World. The different shape of the sparks to the rest of the fireball is done by setting its Shape to Cone.

Querying and Observational Methods

The querying method used was a survey. 7 people participated, all between the ages of 18-22, with a fairly even gender split and varied gaming experience. The responses from our survey can be found here

The observational method used was the Think Aloud method, with the participants being asked to vocalise their thoughts while playing, which were recorded and analysed. 5 people participated, all between the ages of 19-21, with a fairly even gender split and varied gaming experience.

Some of the main improvements that were suggested by participants from both the querying and observational methods:

  • Make it clearer what each pickup does
  • Make it easier to collect pickups
  • Add a way to exit from the main game
  • Add an incentive to kill enemies rather than just run around them
  • Prevent enemies from spawning in one location rather than evenly distributed throughout the maze
  • Make the final boss & enemies in general harder
  • Reduce the time that the player has to wait before attacking again
  • Enemy health bars are too high to see
  • Add boss music to play during final level
  • Add a ranged attack

Changes from Participant Feedback

  • Added text that is displayed when the player collects pickups to make it clearer what each pickup is supposed to be
  • Made the pickup hit colliders larger so that the player can collect them more easily
  • Added a pause menu where the player can view the game instructions again, exit to menu or quit the game
  • Made enemies drop pickups when killed to give a greater incentive to kill them
  • Updated the amount pickups increase by due to more pickups being spawned
  • Made the enemies harder to run past by increasing their speed, and making their colliders no longer triggers
  • Adjusted enemy spawning to be more evenly distributed throughout the maze
  • Increased difficulty of final boss
  • Reduced the player attack cooldown time
  • Moved enemy health bars to be in front of enemy rather than above them
  • Added boss music
  • Added a charge-able ranged attack that shoots a bouncy ball.

References

Packages

Assets

Models
Enemies

Items

Textures/Materials

Fonts

Sounds

Learning resources

labyrinth-game's People

Contributors

c3phal0p0d avatar imx3non avatar athdeleonardis avatar github-classroom[bot] avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.