*Carrier doesn't have a GitHub link because the team struggled to make the Unreal project work with GitHub and the old repo wouldn't contain any of the work I've done.
*BTD6 Tricks and Tips doesn't have a GitHub link because the project is stored on Expo's servers and it won't let me download it to put it on GitHub. An Expo error prevents this when the Snack download is too large.
*BTD6 Tricks and Tips doesn't have a GitHub link because the project is stored on Expo's servers and it won't let me download it to put it on GitHub. An Expo error prevents this when the Snack download is too large.
1. Implement multiple completed games, including 3D games, using common tools, languages, and software for web, console, PC, or mobile platforms.
I'm Amazed - https://github.com/vexurayr/GPE230_Foulks
This 3D game was made using Unreal Engine, further developing my knowledge of Blueprints and becoming familiar with Unreal's C++ syntax. Over the course of this game's creation, I learned for the first time how to code inside Unreal using C++ and I set up enemies to pathfind through the maze along waypoints again. I learned how to use a sphere trace to get nearby enemies in order to stun them, how to make a pickup that checks for the player on collision and changes the player's stats, how to wire up sliders to control volume levels, how to save game data such as audio slider positions and screen resolution, how to use AnimNotifys to call code during a frame of an animation, how to use a spring arm to make a more fluid player camera, how to "highlight" an enemy hit by a raycast, and how to to use an IKRig and IKRetargeter to make the animations on one skeleton play on a different skeleton. That last bit was possible after learning about Mixamo, where I could gather some new player animations for free. Lastly, I learned how to utilize Unreal's Niagara particle system and Unreal's UMG for UI design.
This 3D game was made using Unreal Engine, further developing my knowledge of Blueprints and becoming familiar with Unreal's C++ syntax. Over the course of this game's creation, I learned for the first time how to code inside Unreal using C++ and I set up enemies to pathfind through the maze along waypoints again. I learned how to use a sphere trace to get nearby enemies in order to stun them, how to make a pickup that checks for the player on collision and changes the player's stats, how to wire up sliders to control volume levels, how to save game data such as audio slider positions and screen resolution, how to use AnimNotifys to call code during a frame of an animation, how to use a spring arm to make a more fluid player camera, how to "highlight" an enemy hit by a raycast, and how to to use an IKRig and IKRetargeter to make the animations on one skeleton play on a different skeleton. That last bit was possible after learning about Mixamo, where I could gather some new player animations for free. Lastly, I learned how to utilize Unreal's Niagara particle system and Unreal's UMG for UI design.
Digital Sun - https://github.com/vexurayr/Digital-Sun
This 3D game was made using Unity and C#. I was in charge of all the programming and I wasn't restricted by class requirements, so I got to try designing one of the systems on the bucket list of game mechanics I want to implement. Some of the things I learned specifically for the inventory were how to pick items up with a button press using a raycast, display information about the object the player is looking at, prevent items from being picked up with a full inventory, make UI show the items in the inventory, make UI interactions, like swapping, combining, and dropping, change the data inside the player's inventory, how to restrict item placement, such as only allowing chestplates in a chestplate slot, how to make an item appear in the world when placed in a hand slot, how to use an item's functionality inside the inventory and of an item in the currently selected hand slot, how to drop items so they physically stack rather than clip into each other, and down to the smallest details, how to make the UI currently being dragged always appear on top of the other UI elements. On top of the inventory, I learned how to make an extremely reusable BaseValues system for all the survival elements, health, hunger, thirst, stamina, defense, and temperature, I learned how to make the scene's temperature change depending on the time of day, how to make and play animations on a button press, how to check/remove items from the player's inventory and give them back the crafted item, how to drink straight from a source of water or store water in a canteen to be drank from later, how to make an oven take fuel and an item like uncooked meat, consume the the items, and after a delay output cooked meat, how to use a navmesh for AI pathfinding, how to make a loading screen that persists until the scene is fully loaded, and how to spawn things under conditions like being far enough away from the player and while the player isn't facing the spawn location.
This 3D game was made using Unity and C#. I was in charge of all the programming and I wasn't restricted by class requirements, so I got to try designing one of the systems on the bucket list of game mechanics I want to implement. Some of the things I learned specifically for the inventory were how to pick items up with a button press using a raycast, display information about the object the player is looking at, prevent items from being picked up with a full inventory, make UI show the items in the inventory, make UI interactions, like swapping, combining, and dropping, change the data inside the player's inventory, how to restrict item placement, such as only allowing chestplates in a chestplate slot, how to make an item appear in the world when placed in a hand slot, how to use an item's functionality inside the inventory and of an item in the currently selected hand slot, how to drop items so they physically stack rather than clip into each other, and down to the smallest details, how to make the UI currently being dragged always appear on top of the other UI elements. On top of the inventory, I learned how to make an extremely reusable BaseValues system for all the survival elements, health, hunger, thirst, stamina, defense, and temperature, I learned how to make the scene's temperature change depending on the time of day, how to make and play animations on a button press, how to check/remove items from the player's inventory and give them back the crafted item, how to drink straight from a source of water or store water in a canteen to be drank from later, how to make an oven take fuel and an item like uncooked meat, consume the the items, and after a delay output cooked meat, how to use a navmesh for AI pathfinding, how to make a loading screen that persists until the scene is fully loaded, and how to spawn things under conditions like being far enough away from the player and while the player isn't facing the spawn location.
Mini Treads - https://github.com/vexurayr/GPE205-AustinF
This 3D game was made using Unity and C#. Some of the things I learned how to do was make pickups spawn at a spawner on a timer, apply their powerup to the thing that collided with the pickup, how to make permanent powerups and powerups that remove their effect after a delay, how to make different AI behaviors in finite state machines, how to make the AI "see" and "hear," how to randomly generate tile prefabs along a grid, how to utilize the singleton structure, how to play audio at custom times, how to setup multiplayer splitscreen and add controls for a gamepad, how to switch between multiple cameras, how to make something shoot on a cooldown, how to recreate MOBA style UI cooldowns, how to store lives and award points, how to make a save system capable of saving basic variable types on any script by using interfaces and JSON, and how to control sound groups with volume sliders. Controlling audio with sliders, among other things, I've basically learned twice because Unreal and Unity have their own structure for those systems.
This 3D game was made using Unity and C#. Some of the things I learned how to do was make pickups spawn at a spawner on a timer, apply their powerup to the thing that collided with the pickup, how to make permanent powerups and powerups that remove their effect after a delay, how to make different AI behaviors in finite state machines, how to make the AI "see" and "hear," how to randomly generate tile prefabs along a grid, how to utilize the singleton structure, how to play audio at custom times, how to setup multiplayer splitscreen and add controls for a gamepad, how to switch between multiple cameras, how to make something shoot on a cooldown, how to recreate MOBA style UI cooldowns, how to store lives and award points, how to make a save system capable of saving basic variable types on any script by using interfaces and JSON, and how to control sound groups with volume sliders. Controlling audio with sliders, among other things, I've basically learned twice because Unreal and Unity have their own structure for those systems.
2. Design, develop, and implement the architecture and infrastructure needed to support a complete game project.
I'm Amazed - https://github.com/vexurayr/GPE230_Foulks
Putting the gameplay of escaping mazes and the enemies that roam them aside, I'm Amazed strives for completion by adding a pause menu to exit the maze and go back to the main menu instead of exiting the application, or if the player just needed a break, they can resume where they left off. On the main menu, the player has options to start play immediately and hop into the first stage, to open a level select menu and choose any of the levels they've beaten or are next to beat, to open an options menu where the player can select the screen resolution and adjust the volume of sound classes, or to quit the game. The settings in the options menu save between sessions, so the player doesn't have to adjust them every time they launch the game. When the player escapes a maze, the victory menu appears so they may travel to the next stage or go back to the main menu. When the player dies, they have the option of restarting the level or going back to the main menu. The player is informed of the controls in the first level. Some sounds that have been added are maze background and main menu music, a sound for when the AI lands a punch on the player, when the player uses their stun ability, when UI is interacted with, when a pickup is grabbed, and a chime for when the player wins or dies. The UI in every maze informs the player of their health and the cooldown of their stun ability. Particles emit from the player when they use their stun ability and from any enemy hit by the stun ability.
Putting the gameplay of escaping mazes and the enemies that roam them aside, I'm Amazed strives for completion by adding a pause menu to exit the maze and go back to the main menu instead of exiting the application, or if the player just needed a break, they can resume where they left off. On the main menu, the player has options to start play immediately and hop into the first stage, to open a level select menu and choose any of the levels they've beaten or are next to beat, to open an options menu where the player can select the screen resolution and adjust the volume of sound classes, or to quit the game. The settings in the options menu save between sessions, so the player doesn't have to adjust them every time they launch the game. When the player escapes a maze, the victory menu appears so they may travel to the next stage or go back to the main menu. When the player dies, they have the option of restarting the level or going back to the main menu. The player is informed of the controls in the first level. Some sounds that have been added are maze background and main menu music, a sound for when the AI lands a punch on the player, when the player uses their stun ability, when UI is interacted with, when a pickup is grabbed, and a chime for when the player wins or dies. The UI in every maze informs the player of their health and the cooldown of their stun ability. Particles emit from the player when they use their stun ability and from any enemy hit by the stun ability.
Mini Treads - https://github.com/vexurayr/GPE205-AustinF
This game creates a more complete game experience by starting the player on a main menu, from which their options are starting the game to begin a match against AI or a friend, opening the settings menu, or closing the game. Inside the options menu, the player can change volume sliders, choose to face AI solo or face a friend in splitscreen multiplayer, choose to use the daily map so any games they play that day will generate the map and spawn positions the exact same, and choose the difficulty of the AI enemies to affect their health, damage, and speed in the beginning and the rates that those values change when future waves of AI spawn. These settings are all saved to and loaded from a file so the player doesn't have to always change them. A pause menu can be opened during gameplay, allowing the player to take a break if needed, adjust audio settings if needed, return to gameplay, or go to the main menu. When the player runs out of lives, a game over screen appears for them to see their score and return to the main menu. A variation of this appears when playing splitscreen multiplayer that reinforces which player won the battle and allows them to return to the main menu. Some audio that has been added to the game includes music for the main menu and gameplay, sound effects for an idle tank, UI interactions, player spawning, shooting, taking damage, death, and grabbing a pickup. The UI tells the player their current health and the health of the enemies, the cooldown of their tank's turret, and if their next shot will fire a stun projectile instead of the normal projectile. The wheels of the tanks and the pickups also have subtle animations.
This game creates a more complete game experience by starting the player on a main menu, from which their options are starting the game to begin a match against AI or a friend, opening the settings menu, or closing the game. Inside the options menu, the player can change volume sliders, choose to face AI solo or face a friend in splitscreen multiplayer, choose to use the daily map so any games they play that day will generate the map and spawn positions the exact same, and choose the difficulty of the AI enemies to affect their health, damage, and speed in the beginning and the rates that those values change when future waves of AI spawn. These settings are all saved to and loaded from a file so the player doesn't have to always change them. A pause menu can be opened during gameplay, allowing the player to take a break if needed, adjust audio settings if needed, return to gameplay, or go to the main menu. When the player runs out of lives, a game over screen appears for them to see their score and return to the main menu. A variation of this appears when playing splitscreen multiplayer that reinforces which player won the battle and allows them to return to the main menu. Some audio that has been added to the game includes music for the main menu and gameplay, sound effects for an idle tank, UI interactions, player spawning, shooting, taking damage, death, and grabbing a pickup. The UI tells the player their current health and the health of the enemies, the cooldown of their tank's turret, and if their next shot will fire a stun projectile instead of the normal projectile. The wheels of the tanks and the pickups also have subtle animations.
Boss of Souls - https://github.com/vexurayr/Boss-of-Souls
This game jam game demonstrates a more complete experience by including a main menu, where the player can choose to start the game, open a settings or credits menu, or leave the game. The settings menu lets the player adjust the volume of audio mixer groups, and those settings are saved. The credits shows everything that was used for the jam. Controls are shown on the main menu. During gameplay, the player can open a pause menu, which reminds the player of the controls, lets them adjust the volume, resume gameplay, or exit to the main menu. When the player dies, a game over screen will inform them of how long they survived and lets them go back to the main menu. The UI in the game informs the player of their health and the enemy's health. Some audio that has been added is music for the main menu and gameplay, sound effects for UI interactions, punching, taking damage, enemies shooting their bow or swinging their sword, dying, and when the next wave of enemies spawn. Particles emit from the player's hands once they fall below half health, acting as a reminder that the player has entered the "second phase" of a typical boss and powered up with increased move speed, jump height, and damage.
This game jam game demonstrates a more complete experience by including a main menu, where the player can choose to start the game, open a settings or credits menu, or leave the game. The settings menu lets the player adjust the volume of audio mixer groups, and those settings are saved. The credits shows everything that was used for the jam. Controls are shown on the main menu. During gameplay, the player can open a pause menu, which reminds the player of the controls, lets them adjust the volume, resume gameplay, or exit to the main menu. When the player dies, a game over screen will inform them of how long they survived and lets them go back to the main menu. The UI in the game informs the player of their health and the enemy's health. Some audio that has been added is music for the main menu and gameplay, sound effects for UI interactions, punching, taking damage, enemies shooting their bow or swinging their sword, dying, and when the next wave of enemies spawn. Particles emit from the player's hands once they fall below half health, acting as a reminder that the player has entered the "second phase" of a typical boss and powered up with increased move speed, jump height, and damage.
3. Implement and analyze fundamental data structures and algorithms associated with game applications supporting gameplay mechanics.
Austin's Auto Battler - https://github.com/vexurayr/CSC275-Final--Auto-Battler
This auto battler game was made using C++ and runs off a command prompt. The gameplay consists of reading your character and the enemy fight each other with random acts each perform to deal damage, earning XP for defeating enemies until you level up, and spending that level on a slightly random jump in damage, max health, XP gain, or a full heal. This continues for as long as you'd like, with enemies progressively getting harder, but you can always save your progress and return later. The project was created to demonstrate an understanding of many things, like threads, which are able to make music play without disrupting the next displayed text. While, do while, and for loops are used for menus, making sure the game doesn't close preemptively, continuing combat until the player or enemy dies, saving and loading data, letting the player make decisions, and checking if their input is appropriate. File I/O let me save and load data like the player's name and level to a .txt file. Inheritance helped me build the Player and Enemy classes, which share data from the BaseCharacter class. Polymorphism in virtual functions made it easier to give the Player and Enemy different functionality while simplifying the process of calling the functions for each. Encapsulation, getters, and setters made sure data was only accessed and manipulated when necessary. Exception handling made sure the program didn't crash in events like the player inputting a string when the program was expecting a number.
This auto battler game was made using C++ and runs off a command prompt. The gameplay consists of reading your character and the enemy fight each other with random acts each perform to deal damage, earning XP for defeating enemies until you level up, and spending that level on a slightly random jump in damage, max health, XP gain, or a full heal. This continues for as long as you'd like, with enemies progressively getting harder, but you can always save your progress and return later. The project was created to demonstrate an understanding of many things, like threads, which are able to make music play without disrupting the next displayed text. While, do while, and for loops are used for menus, making sure the game doesn't close preemptively, continuing combat until the player or enemy dies, saving and loading data, letting the player make decisions, and checking if their input is appropriate. File I/O let me save and load data like the player's name and level to a .txt file. Inheritance helped me build the Player and Enemy classes, which share data from the BaseCharacter class. Polymorphism in virtual functions made it easier to give the Player and Enemy different functionality while simplifying the process of calling the functions for each. Encapsulation, getters, and setters made sure data was only accessed and manipulated when necessary. Exception handling made sure the program didn't crash in events like the player inputting a string when the program was expecting a number.
Digital Sun - https://github.com/vexurayr/Digital-Sun
The gameplay of this Unity game consists of hunting, foraging, organizing and resource management, crafting, cooking, and fighting off nature and predators to survive as long as possible, make it through numerous environments, and defeat a final boss to unlock your freedom from the simulation. The most complicated system to set up was the player's inventory, which made use of multiple classes and inheritance, but at its core, the inventory comes down to a couple of lists, a dynamically changing array of items representing what the player has picked up and equipped, and for loops to check where an item can be added on being picked up or removed from crafting. The most powerful concept I learned and implemented in this project was singletons, or a class that is only instantiated once in the scene so that it may be referenced by any other class, such as enemies pulling data from the one and only Difficulty Manager to have their stats adjusted before relying on the Spawner Manager to determine where they should spawn because it has all the spawn points stored. A lot of polymorphism is seen in the survival systems, which inherit from Base Values, to track and adjust current and max values. Pseudo-randomness was used in map generation, making things spawn in different locations by shuffling lists of spawner objects in a for loop.
The gameplay of this Unity game consists of hunting, foraging, organizing and resource management, crafting, cooking, and fighting off nature and predators to survive as long as possible, make it through numerous environments, and defeat a final boss to unlock your freedom from the simulation. The most complicated system to set up was the player's inventory, which made use of multiple classes and inheritance, but at its core, the inventory comes down to a couple of lists, a dynamically changing array of items representing what the player has picked up and equipped, and for loops to check where an item can be added on being picked up or removed from crafting. The most powerful concept I learned and implemented in this project was singletons, or a class that is only instantiated once in the scene so that it may be referenced by any other class, such as enemies pulling data from the one and only Difficulty Manager to have their stats adjusted before relying on the Spawner Manager to determine where they should spawn because it has all the spawn points stored. A lot of polymorphism is seen in the survival systems, which inherit from Base Values, to track and adjust current and max values. Pseudo-randomness was used in map generation, making things spawn in different locations by shuffling lists of spawner objects in a for loop.
Burgeria - https://github.com/vexurayr/Jave-Burgeria
This simple little Java game runs in a command window, made for the purposes of a class competition. The gameplay follows a similar approach to Papa's Burgeria, where the player receives an order for a burger, and they must prepare said burger by typing in ingredients. The closer the burger and order match, the more points the player receives. After just learning about a certain algorithm in a C++ class, I wanted to implement a stack for both the customer's order and the burger being prepared. The player pops an ingredient on or pops the last one off, and the burger is compared to the order by removing the last thing from each stack. While, do while, and for loops were used to keep the game running or compare the entire burger and order, a string array stores all possible ingredients, randomness is used to change up the length of the order and the requested ingredients, exception handling is used everywhere with threads to make text does not appear all at once, and inheritance allowed the Customer and Burger class to extend Ingredients for the data it contained.
This simple little Java game runs in a command window, made for the purposes of a class competition. The gameplay follows a similar approach to Papa's Burgeria, where the player receives an order for a burger, and they must prepare said burger by typing in ingredients. The closer the burger and order match, the more points the player receives. After just learning about a certain algorithm in a C++ class, I wanted to implement a stack for both the customer's order and the burger being prepared. The player pops an ingredient on or pops the last one off, and the burger is compared to the order by removing the last thing from each stack. While, do while, and for loops were used to keep the game running or compare the entire burger and order, a string array stores all possible ingredients, randomness is used to change up the length of the order and the requested ingredients, exception handling is used everywhere with threads to make text does not appear all at once, and inheritance allowed the Customer and Burger class to extend Ingredients for the data it contained.
4. Use software development processes to analyze a project problem, and to design, build, and test a corresponding software solution.
Carrier -
The very first thing I had to do as programming lead for Carrier was create an AI for the game's mythological sea creature enemies. The immediate problem: Unreal's AI specifically caters to grounded pawns. It doesn't matter how far the nav mesh bounds volume extends, if the pawn isn't next to the ground, it will not move. So Unreal's AI implementation won't work for a pawn in the middle of the ocean. It took many iterations and learning the full extent of Unreal's AI capabilities, but I eventually reached the conclusion that a nav mesh could not possibly be utilized for a pawn in water. The second attempt for the Leviathan AI used physics and impulses, but there was no clear way to track the current forces the actor was experiencing to reverse the forces in order for the AI to properly slow down and come to a stop. The third version was the start of a good idea, using the AI's current position and a random position and making a spline between those, but more iterations came like trying to use a nav mesh for movement and simply altering the z position of the pawn. Then I discovered linear interpolation, the missing piece to improve my spline plan. By inputting the start and end points, simply changing the alpha value would make the Leviathan move. There was one issue with this, but I made the AI's speed less dependent on the distance of the spline, and continued adding more functions so the AI could face its destination, it could move along waypoints, and it could chase the player.
The very first thing I had to do as programming lead for Carrier was create an AI for the game's mythological sea creature enemies. The immediate problem: Unreal's AI specifically caters to grounded pawns. It doesn't matter how far the nav mesh bounds volume extends, if the pawn isn't next to the ground, it will not move. So Unreal's AI implementation won't work for a pawn in the middle of the ocean. It took many iterations and learning the full extent of Unreal's AI capabilities, but I eventually reached the conclusion that a nav mesh could not possibly be utilized for a pawn in water. The second attempt for the Leviathan AI used physics and impulses, but there was no clear way to track the current forces the actor was experiencing to reverse the forces in order for the AI to properly slow down and come to a stop. The third version was the start of a good idea, using the AI's current position and a random position and making a spline between those, but more iterations came like trying to use a nav mesh for movement and simply altering the z position of the pawn. Then I discovered linear interpolation, the missing piece to improve my spline plan. By inputting the start and end points, simply changing the alpha value would make the Leviathan move. There was one issue with this, but I made the AI's speed less dependent on the distance of the spline, and continued adding more functions so the AI could face its destination, it could move along waypoints, and it could chase the player.
Digital Sun - https://github.com/vexurayr/Digital-Sun
I'm proud of the inventory system I made for Digital Sun, but the biggest problem was getting the data to correctly change when UI is interacted with. The solution I ended with did the job, but new inventory and UI interactions were becoming increasingly tedious to implement, so I'd find a new solution if I had to do it again. Nonetheless, I had to start by figuring out how to tie sprites to a single index of the player's inventory, so the inventory script and a script dedicated to UI are in close contact to make sure each UI element properly displays the info of the correlating inventory slot. Clicking and dragging UI is a system built into Unity, but I had to tie it in with the previously mentioned scripts. When the UI being dragged is released over another inventory slot, the data of the inventory slots tied to the two UI assets would be compared and either a swap or a combine would happen. With each addition to the inventory, the hand slots, armor slots, and oven slots, there were new lists to track inventory items, which meant indexes were overlapping, and I had to make specific functions for every possible way the inventories could interact with each other so that trying to move an item from inventory slot 1 to hand slot 2 wouldn't just move the item from inventory slot 1 to inventory slot 2.
I'm proud of the inventory system I made for Digital Sun, but the biggest problem was getting the data to correctly change when UI is interacted with. The solution I ended with did the job, but new inventory and UI interactions were becoming increasingly tedious to implement, so I'd find a new solution if I had to do it again. Nonetheless, I had to start by figuring out how to tie sprites to a single index of the player's inventory, so the inventory script and a script dedicated to UI are in close contact to make sure each UI element properly displays the info of the correlating inventory slot. Clicking and dragging UI is a system built into Unity, but I had to tie it in with the previously mentioned scripts. When the UI being dragged is released over another inventory slot, the data of the inventory slots tied to the two UI assets would be compared and either a swap or a combine would happen. With each addition to the inventory, the hand slots, armor slots, and oven slots, there were new lists to track inventory items, which meant indexes were overlapping, and I had to make specific functions for every possible way the inventories could interact with each other so that trying to move an item from inventory slot 1 to hand slot 2 wouldn't just move the item from inventory slot 1 to inventory slot 2.
Time Zone Converter - https://github.com/vexurayr/Time-Zone-Converter
The idea for this project came not from a technical problem but a real world problem, where team meetings often got mixed up as we all had to meet from three different states. I had to learn the ins and outs of Tkinter to make the GUI as well as how to utilize the pytz package for time zone data. The final touches were linking all the buttons and comparing two selected time zones and making sure that the outputted time difference was calculated correctly, given I was comparing not just times but dates as well.
The idea for this project came not from a technical problem but a real world problem, where team meetings often got mixed up as we all had to meet from three different states. I had to learn the ins and outs of Tkinter to make the GUI as well as how to utilize the pytz package for time zone data. The final touches were linking all the buttons and comparing two selected time zones and making sure that the outputted time difference was calculated correctly, given I was comparing not just times but dates as well.
5. Demonstrate development skills using multiple programming languages, development environments, and platforms, including advanced and/or experimental topics in game programming.
BTD6 Tricks and Tips -
This app was developed for mobile devices using Expo Snack, a JavaScript framework that extends React Native. This was my first experience with JavaScript, but part of the programming resembled HTML, so I could at least familiarize myself with the language. Now this platform may be impressive due to it compiling as you code and making it possible to see results on your phone while you are coding on your computer, but I would classify Expo as experimental. It's great for rapid prototyping, horrendous for any project where you start to involve images, videos, audio, or for simply tracking data. Many times the project will be stuck on a white screen despite the code being correct or freeze up when you have data change on a button press. For those reasons, the projects themselves couldn't get much more technical than changing pages and displaying text.
This app was developed for mobile devices using Expo Snack, a JavaScript framework that extends React Native. This was my first experience with JavaScript, but part of the programming resembled HTML, so I could at least familiarize myself with the language. Now this platform may be impressive due to it compiling as you code and making it possible to see results on your phone while you are coding on your computer, but I would classify Expo as experimental. It's great for rapid prototyping, horrendous for any project where you start to involve images, videos, audio, or for simply tracking data. Many times the project will be stuck on a white screen despite the code being correct or freeze up when you have data change on a button press. For those reasons, the projects themselves couldn't get much more technical than changing pages and displaying text.
Austin's Auto Battler - https://github.com/vexurayr/CSC275-Final--Auto-Battler
This command prompt game runs using C++ and Visual Studio. With C++ being my first ever experience with programming (minus HTML), there were many foreign concepts. The project may demonstrate that, but taking those two C++ classes was the most educational process as it launched my programming career. I got to understand not just basic principles like data types, loops, and classes, but also the benefits of multi-threaded coding, file I/O, inheritance, encapsulation, polymorphism, abstraction, and exception handling. Because those classes so heavily emphasized OOP, I have developed a firm mindset for OOP, and with that I struggle to imagine how one goes about programming something without utilizing OOP. But I'm glad I was thrown in the deep end with C++, struggling with concepts like pointers and bit shifting, until eventually I understood and they didn't seem so complex. It gave me a solid baseline for tackling any other language.
This command prompt game runs using C++ and Visual Studio. With C++ being my first ever experience with programming (minus HTML), there were many foreign concepts. The project may demonstrate that, but taking those two C++ classes was the most educational process as it launched my programming career. I got to understand not just basic principles like data types, loops, and classes, but also the benefits of multi-threaded coding, file I/O, inheritance, encapsulation, polymorphism, abstraction, and exception handling. Because those classes so heavily emphasized OOP, I have developed a firm mindset for OOP, and with that I struggle to imagine how one goes about programming something without utilizing OOP. But I'm glad I was thrown in the deep end with C++, struggling with concepts like pointers and bit shifting, until eventually I understood and they didn't seem so complex. It gave me a solid baseline for tackling any other language.
Clock Stop - https://github.com/vexurayr/Clock-Stop
This Tkinter program runs using Python and Visual Studio Code. It wasn't my first experience with the language, but it was my first experience with reinforcement learning, adding to my knowledge of AI right beside FSMs, behavior trees, and utility theory. The class focused on OpenAI's RL API, Gymnasium, but for my final, I wanted to make my own project, which meant I needed to create an AI that used RL without a Gym dependency. I had to research and teach myself some of the processes that Gym was doing behind the scenes, discovering Q-Learning and numpy arrays. After quite some time, I made a program where the AI can train using data from the environment, store state, action pairs with a value for determining how worthwhile that action is to take given the environment's current state, and it uses the epsilon greedy policy to hone in on a set of actions that earns the AI the biggest reward. It's a cool form of AI, but it's hardly appropriate for a game, as the AI will only work if that environment never changes.
This Tkinter program runs using Python and Visual Studio Code. It wasn't my first experience with the language, but it was my first experience with reinforcement learning, adding to my knowledge of AI right beside FSMs, behavior trees, and utility theory. The class focused on OpenAI's RL API, Gymnasium, but for my final, I wanted to make my own project, which meant I needed to create an AI that used RL without a Gym dependency. I had to research and teach myself some of the processes that Gym was doing behind the scenes, discovering Q-Learning and numpy arrays. After quite some time, I made a program where the AI can train using data from the environment, store state, action pairs with a value for determining how worthwhile that action is to take given the environment's current state, and it uses the epsilon greedy policy to hone in on a set of actions that earns the AI the biggest reward. It's a cool form of AI, but it's hardly appropriate for a game, as the AI will only work if that environment never changes.
6. Establish collaboration, mentorship, and professional leadership skills by working with other disciplines to deliver highly polished and completed projects.
Deceptive Turtle - https://github.com/vexurayr/UAT-March-Game-Jam
In this game jam project, I got to design, program, and collaborate in an effort to submit a game in time while keeping the group on track, keeping scope in mind, and assisting whenever help was needed. After the split, everyone who stuck around got along great. I might have spent more time assisting than completing new design or programming work in order to mentor our two first time jammers, find solutions when others were encountering problems, and making sure the team wouldn't have to worry about GitHub, changing the entire project over to URP so we could integrate 2D lighting, or any other things that might slow them down. Together I worked on systems like the player's movement and shooting, camera movement and post processing, infinite background, scene lighting, the player's flashlight, and our audio manager, our other programmers handled the AI, spawning, and points system, and our designers were in charge of finding art assets, audio, and adding the UI. I made a pass over everything to make sure the project was as polished and presentable as possible, such as fixing stretched images, centering UI, and balancing audio.
In this game jam project, I got to design, program, and collaborate in an effort to submit a game in time while keeping the group on track, keeping scope in mind, and assisting whenever help was needed. After the split, everyone who stuck around got along great. I might have spent more time assisting than completing new design or programming work in order to mentor our two first time jammers, find solutions when others were encountering problems, and making sure the team wouldn't have to worry about GitHub, changing the entire project over to URP so we could integrate 2D lighting, or any other things that might slow them down. Together I worked on systems like the player's movement and shooting, camera movement and post processing, infinite background, scene lighting, the player's flashlight, and our audio manager, our other programmers handled the AI, spawning, and points system, and our designers were in charge of finding art assets, audio, and adding the UI. I made a pass over everything to make sure the project was as polished and presentable as possible, such as fixing stretched images, centering UI, and balancing audio.
Dungeon Xpress - https://github.com/Quaintman2000/Dungeon-Xpress
In this production studio project, I got to complete a lot of design work that would be used by the artists and programmers in the group, as well as work that would aid the project's future designers. The team always got a laugh out of each other, seemed like we were constantly forming new inside jokes. As designers, our primary contact was with the leads, who would inform us of everything we needed to concept and what needed to be fixed if it didn't quite fit the vision of the game. But every bit of work we designed would at one point or another be looked at by an artist, such as the art references for everything related to the skeleton dragon or what the animation for the Rogue's abilities would look like, or by a programmer, such as the document covering what every consumable in the game does, how line of sight is used for players to be stealthy, or how every enemy in the room becomes alert when combat begins. Feedback from the leads also made sure our concepts were as understandable to the other disciplines as possible. On top of the documents, diagrams, and white boxing and set designing levels so the dungeons could have more variation, I reached out about working on audio, which is something that wasn't intended to be done this semester. With the lead's approval, I created sound effects for each character's ability and action, footsteps, grunts, basic voice lines, ability select/deselect, UI interactions, and music for the main menu.
In this production studio project, I got to complete a lot of design work that would be used by the artists and programmers in the group, as well as work that would aid the project's future designers. The team always got a laugh out of each other, seemed like we were constantly forming new inside jokes. As designers, our primary contact was with the leads, who would inform us of everything we needed to concept and what needed to be fixed if it didn't quite fit the vision of the game. But every bit of work we designed would at one point or another be looked at by an artist, such as the art references for everything related to the skeleton dragon or what the animation for the Rogue's abilities would look like, or by a programmer, such as the document covering what every consumable in the game does, how line of sight is used for players to be stealthy, or how every enemy in the room becomes alert when combat begins. Feedback from the leads also made sure our concepts were as understandable to the other disciplines as possible. On top of the documents, diagrams, and white boxing and set designing levels so the dungeons could have more variation, I reached out about working on audio, which is something that wasn't intended to be done this semester. With the lead's approval, I created sound effects for each character's ability and action, footsteps, grunts, basic voice lines, ability select/deselect, UI interactions, and music for the main menu.
Carrier -
In this production studio project, I completed many programming tasks and maintained communication with the artists and designers to make sure features were implemented as described and all art made could be properly shown off and work with the features of the thing the art is for. For example, we needed a turret that could rotate horizontally and vertically, so we had to explain how the model needed to be broken up for this to be possible. As programming lead, I also got to shadow lots of my team's work, the other programmer would come to me if there was an issue, and I could always point him in the right direction or propose a solution I've considered. Frequent meetings with the programmers helped make sure we'd reach milestone goals and meetings with the other leads informed us of the state of the entire project, what was done or needed to be done, and if there were any active issues, considering solutions for the other discipline. For instance, I've worked some with the design lead to try and find a solution for Unreal's refusal to import umaps. Us programmers had a similar problem, often meeting to get our work working in the other's project. Another thing I planned on doing was recording videos for the team to learn how to use Perforce, until the server went down and we were relying on Google Drive again. Tight communication between every member in the team helped keep us aware of everybody's work and made sure nothing was missing from the milestone builds. I haven't been in a group yet where people didn't get along, but it felt like this group bonded better than in any other group project I've gotten to work on so far.
In this production studio project, I completed many programming tasks and maintained communication with the artists and designers to make sure features were implemented as described and all art made could be properly shown off and work with the features of the thing the art is for. For example, we needed a turret that could rotate horizontally and vertically, so we had to explain how the model needed to be broken up for this to be possible. As programming lead, I also got to shadow lots of my team's work, the other programmer would come to me if there was an issue, and I could always point him in the right direction or propose a solution I've considered. Frequent meetings with the programmers helped make sure we'd reach milestone goals and meetings with the other leads informed us of the state of the entire project, what was done or needed to be done, and if there were any active issues, considering solutions for the other discipline. For instance, I've worked some with the design lead to try and find a solution for Unreal's refusal to import umaps. Us programmers had a similar problem, often meeting to get our work working in the other's project. Another thing I planned on doing was recording videos for the team to learn how to use Perforce, until the server went down and we were relying on Google Drive again. Tight communication between every member in the team helped keep us aware of everybody's work and made sure nothing was missing from the milestone builds. I haven't been in a group yet where people didn't get along, but it felt like this group bonded better than in any other group project I've gotten to work on so far.