You landed on Julian's portfolio!
I'm a
Gameplay Programmer, who also love to take deep dives in lower level programming, using
languages like C++ to build intricate systems, custom engines, and games from scratch.
Projects
Bubble Bobble
Julgen, 15 May 2024
CUSTOM ENGINE
SOLO
Julgen Game Engine
Julgen, 15 May 2024
CUSTOM ENGINE
SOLO
BLOG
Shoot'n Scoot
Unity C#, May 2024
TEAM
After Burner II
OpenGL C++, 16 Jun 2023
CUSTOM ENGINE
PLAYABLE WEB
SOLO
Just Keep Swimming
Unreal 5, 15 Feb 2024
GAME JAM
TEAM
Parry Tank
Unity C#, 13 Nov 2023
PLAYABLE WEB
SOLO
PirateBay
Unity C#, 19 May 2022
Wheel Spin
Unreal 5, 19 June 2023
BreadEnd
Unreal 5, 28 Jan 2024
TrainTrouble
Unity C#, 29 Aug 2019
Fools Fight
Unity C# Photon, 05 Feb 2021
Kitchen Champions
Unity C#, 1 Oct 2019
Julian
Rijken
Initially, I found great enjoyment in level design, 3D modeling, and crafting
interactive
environments within the Source engine. This experience ignited a deep motivation to
delve
further into the intricacies of game development and understand the mechanics behind
bringing virtual worlds to life.
Later, during my time at Grafisch Lyceum Utrecht, I had the opportunity to explore
programming, which turned out to be an even more fulfilling aspect of game development
for
me. Collaborating with a team to create entirely new gaming experiences and witnessing
the
joy our creations brought to countless players further solidified my desire to pursue a
career as a game developer.
Presently, my focus lies on low level programming with C++, all tho I am ardently
dedicated
to honing my skills with more high level software like Unity using C# and Unreal Engine.
Skills
Primary - Proficient
Secondary - Some Experience
Software
Game Engines
Unreal Engine 4/5
Unity 5
Godot
Game Maker
Source Control
Git
Perforce
Frameworks/Libraries
GLM
SDL
OpenGL
Photon Engine
Dear ImGui
WPF
Doxygen
GLFW
Qt
Vulkan
DirectX11
Tools
Maya
Photoshop
RenderDoc
Gimp
Houdini
Substance Painter
Blender
Premiere Pro
IDE
Qt Creator
Visual Studio
Visual Studio Code
Rider/Clion
Programming languages
C++
C#
Python
SQL
HTML 5
CSS 3
Java
JavaScript
Lua
C
Human Languages
Dutch - Native
English - Fluent
Other
Virtual Reality
OVR & Extensive HMD knowledge
DIY
Building Computers (6 Build)
3D Printing
Arduino
EMail
contact@julianrijken.com
Feel free to contact me on any platform about any topic
Additional Projects
Graphics Programming
Software Rasterizer
C++ 2023
Software Raytracer
C++ 2023
DX11
C++ DirectX11 2023
Vulkan
C++ Vulkan 2024
Graphic arts
Factory Environment
Unreal 5, 14 Jan 2024
3D Modeling
Maya, Jun 6 2023
2D Graphics
Photoshop, Jan 24 2023
Source Level Design
Hammer Editor, 16 Jul 2016
Procedural Windmills
Houdini 20, May 2024
Archived Projects
Haptic Feedback Suit
Unity C#, 4 Feb 2020
Rapid Prototyping
Unity C#, 2018
Rapid Prototyping
Unreal Blueprints, 2023
Malaga Game Jam
Unity C#, 31 Jan 2020
One Button
Unity C#, 1 Jul 2019
Strawberry Game Jam
Unity C#, 19 May 2022
Water Museum
Unity C#, 17 Nov 2019
Twin Stick Shooter
Unity C#, 6 May 2019
Morph
Unity C#, 11 Feb 2020
TrainTrouble
About the game
Train trouble is an action packed local multiplayer game. You have to get as many
passengers to their destination whilst, at the same time, competing against other
players.
What i did
I was responsible for programming the entire game as a solo developer. I was
confronted with buffering lists for the railway wagons and because this was the
first time I made a game in Unity together with a team I learned a lot about Git in
the progress.
This game is a party game created for the Xbox, you have to complete the minigames
in
time so you don't lose the kitchen championship!
What i did
I really liked making this game since I had the chance to create a controller input
system and all sorts of fun minigames. I learned to work with the new input system
and I created a way to load scenes in async mode with a nice transition and using
enums pick a scene by name.
techniques Used
Unity: New Input System - Universal Render Pipeline
C#: Load Scene Async
Engine
Language
Programmer
Artists
Unity
C#
Julian Rijken
Sam Loef
Jurian Vierbergen
Ian Derksen
Twin Stick Shooter
About the game
Twin stick shooter is a top down shooter based in an underwater laboratory where the
objective is to take down the enemy robots, solve puzzles and kill the bosses using
various weapons from knifes to flamethrowers.
What i did
In this project I created the player, Menu UI and GUI, Inventory and item pickup
system, shooting mechanics / switching between weapons and health system. On top of
this I also started working in the High Definition Render Pipeline "HDRP" for Unity
for the fist time. This being one of the first games I made; I'm still really proud
of all the amazing mechanics I made for this game. This was an amazing opportunity
to learn about the unity animator, advanced GUI systems and all of the C# code I
created like the inventory and shooting mechanics.
techniques Used
Unity: New Input System - High Definition Render Pipeline - Cinemachine -
ShaderGraph - Blend Trees
The game is a underwater simulation to show children the consequences of water
pollution, see video below. The game was made for
Netherlands
Watermuseum
.
What i did
I was responsible for creating the coral growing system, the underwater effects and
all of the interaction with the UI and the touch screen. I learned to work with
touch screen, device emulator and shader graph.
techniques Used
Unity: New Input System - ShadeGraph - Universal Render Pipeline
Morph is a game about a alien blob that fell from space, the blob wants to blend in
with the people on the earth. When the blob sees an animal he unlocks the ability to
morph in to the animal. You will have to solve puzzles by morphing in to different
animals to make your way through the level.
What i did
My focus was on the player and creating a system for the player to morph between
different animals. This was the first time working with 2D physics and hand drawn
frame animations.
techniques Used
Unity: New Input System - Timeline
Engine
Language
Programmer
Artists
Unity
C#
Julian Rijken
Jonne Keizer
Aaron Knoop
Leuke van der Poel
Femke Jonker
One Button Game Jam
About the game
The game is only controlled by your mouse, drift around the level getting the
highest
multiplier/score and preform sick stunts.
What i did
I did all the programming for the game. I enjoyed making the car controller and
inventing a cool menu that can be used by only moving the mouse. The game jam "from
school" took 4 days. This was the first game jam I participated in.
Engine
Language
Programmer
Artists
Unity
C#
Julian Rijken
Anne Roos Leeuwis
Quinn Lobato
Mike van den Berg
OWO Haptic Feedback Suit
Flora The Explorer
About the game
The game is a demo for the OWO haptic feedback suit. The goal of the game is to
reach
the end of the temple and along the way you will be confronted by various traps, so
that you can experience the feeling of the suit.
What i did
I was picked as one of 2 people in each class to go to Malaga! I was in Malaga for 2
weeks, I entered the Malaga game jam and created a game for a gaming company which
was creating a haptic feedback suit.
We only had 2 days to create this whole game so you can imagine the rush we had to
go
through. I was in charge of the camera cutscenes, the audio and the player, I also
had the chance again to work with shader graph for the sand.
Engine
Language
Programmer
Artists
Unity
C#
Julian Rijken
Floor van den Bank
Aron Knoop
Thym Kruijt
Malaga Game Jam
About the game
The game is a simple platformer game where you have to jump away from a monster
that's chasing you while you have to repair hatches together so you can escape from
the monster.
What i did
This was a really interesting experience for me, it was the first time I joined a
real game jam, and the first time I was working with people who were speaking a
different language than I. In the end it was more about the experience of making a
game and to make a game quickly with completely random people, who can barely
understand me, and I'm still really thankful that I got the opportunity to join a
game jam in a different country and to meet so many new people.
Software Rasterizer
About
The images below are rendered on the CPU with no graphics library. This is done with
the rasterization method. I managed to render some of my own meshes with the
following features:
Obj parsing -
Mtl parsing -
Textures / Opacity -
Multiple point lights -
Directional light
Observed Area
Opacity Textures
MTL Parsing Visualizer
Software Raytracer
About
The images below are rendered on the CPU with no graphics library. This is done with
the raytracing method. Using the generalized lighting equation, I managed to get
reflections and lights working with metallic and specular surfaces. Doing both a
rasterizer and ray tracer was a great way of learning about the pros and cons of
both methods like performance, given reflections.
DirectX 11 Graphics Programming
About
You might see a recurring patterns if you already looked at the software
raytracer/rastarizer, this time I attempted with DX11. This one got textures and a
directional light working.
Vulkan
About
The forth in the lineup is Vulkan! Vulkan was by far the most boilerplate I have
ever written! It's amazing to see how much control is possible, ironically my goal
was to abstract the api and create a simple way to render different meshes and
materials.
Source Level Design
Besides programming I also like to design. I always loved making my own Counter
strike maps, and to play them together with friends. I have uploaded these maps to
my steam workshop which you can visit here.
Air Drop System For CSGO
This is a simple airdrop system I made for Counter Strike Global Offensive inside of
the source
engine.
3D Modeling
I can also make 3D models, have a look!
2D Graphics
I can also make 2D art, have a look!
3D Factory Environment
I can also make 3D art, have a look!
Houdini Procedural Dutch Windmills
Rapid Prototyping
It is important to develop prototyping skills. The game you see below is an
adventure
game prototype where I tried to learn about flying AI, the level was also made by
me.
Play Testing
The games below are play tested for one of the aesthetics like: "Competition –
Sensation, Fantasy, Narrative, Challenge, Fellowship, Discovery, Expression,
Submission." After the play test results I picked out the game that matched the most
to the aesthetic I was trying to achieve. I added some features I got from the
feedback. We used Google forms for the answers.
After Burner II
About the game
This game is a faithful remake of the original AfterBurner II for the Sega Genesis.
It includes all the cool features from the original, such as barrel rolls, various
stages with distinct flight behaviors, enemies that follow Bezier curves, and much
more. I strongly encourage you to experience this game firsthand. Feel free to try
it out using the button below!
What i did
This is my first game created using C++ and SDL. I've built a whole game
object/component system behind the scenes, kinda like Unity, and added lots of other
stuff to make this big 3D game possible. I'm really looking forward to getting
better at C++ since there are so many cool things in the project that I'd love to
make even better. I guess you could call this my first shot at making a game with
C++!
Engine
Language
Programmer
Custom SDL
C++
Julian Rijken
Parry Tank
About the game
Parry tank is an endless tank game with the goal of driving as far as possible.
Unlike other tank games, you can't actually fire at enemies. You will have to
reflect incoming bullets and use your land mines to overcome obstacles.
What I did
This was a solo project where I had to explore all parts of the development process.
My goal for this project was to focus a bit more on user experience and making the
game easy to play.
Engine
Language
Programmer
Unity
C#
Julian Rijken
Fools Fight
About the game
Conquer your opponents within an arena by striking them on the head with a hammer
until you emerge as the final contender standing. The hammer has the power to
instantly eliminate your opponents with a single blow. The participant who remains
standing at the end of each round earns a point. Ultimately, the player boasting the
highest point tally at the conclusion of the final round clinches victory in the
game.
What i did
In this project, I have delved into the realm of crafting a multiplayer game. This
served as my first attempt utilizing Unity and Photon for networking capabilities. I
am enthusiastic about continuing to explore the realm of multiplayer gaming, as I
find lots of joy in the shared experience of playing games together.
Arrr, me hearties! Pirate Bay be the grand finale of me project what I crafted fer
me
studies at GLU. In this here game, ye'll be sailin' yer ship 'cross the mighty sea,
gatherin' all the precious treasures whilst steerin' clear o' them scurvy enemy
vessels and treacherous obstacles. The game even be offerin' power-ups, bestowin'
yer ship with special abilities to make her sail smooth. Yarrr!
What i did
In a mere span of 2 weeks, I accomplished the remarkable feat of creating an entire
game single-handedly. This endeavor encompassed not only crafting a comprehensive
technical design document and meticulous code documentation but also adeptly
managing a scrum board, complete with a dedicated point system. This game stands as
a true testament to the incredible skills I have cultivated over the course of the
past 4 years!
Engine
Language
Programmer
Unity
C#
Julian Rijken
Julian Is Hard At Work To Get This Finished :)
About the game
ye, what about it
What i did
ye what did Julian do this time :>
Engine
Language
Programmer
Engine
Language
Julian Rijken
Shoot'n Scoot
About the game
Shoot'n Scoot is a couch PVP game, set in a futuristic western theme. Its turn based
approach, to combat, allows for thrilling and unexpected excitement!
The game takes place in the Wild West of the future. Your goal is to be the last
robot standing in the ultimate western dual. By positioning yourselves strategically
and anticipating other robots' behavior, you will shoot and scoot your way to
victory!
What i did
I was in charge of supporting the team with everything Unity and most of the gameplay
programming. I loved exploring the character movement (as per usual ;P) and this
time the characters are fully physics based. This allows some sweet interaction when
bumping in to each other. This project for the most part made me realize that I
would love to work one some larger scale projects :)
Engine
Language
Programmers
Artists
Unity
C#
Julian Rijken
Çağla
Gaspard Lammertyn
Niklas Reincke
Bubble Bobble
About the game
This classic game has two adorable characters jumping around, shooting and avoiding
enemies to save their girlfriends.
What i did
Bubble Bobble allowed me to push the boundaries of the Julgen game engine and helped
me explore various game programming patterns. It also allowed me to work more with
CMake and Git Submodules. The game was made with the C++ standard guidelines in mind
and is build with easy to read code without sacrificing functionality or guidelines.
Engine
Language
Programmer
Julgen
C++
Julian Rijken
Julgen Game Engine
About
Julgen attempts to simplify the game development process while upholding the C++
Core Guidelines. This pure C++ Game Engine uses the Game Object Component system,
giving the user access to an Update loop, integrated input including commands,
tweening, physics, sound, scene management, time information and various components.
These components include an Animator, BoxCollider, Camera, Rigidbody,
SpriteRenderer, TextRenderer.
Julgen is build using CMake and can be implemented as a submodule and will handle
window creation all for you. All the user needs to do is load a scene and add
objects to it.
Getting Started
Keeping the vision of making a simple to use game engine with the full power of C++
I have setup the engine so that you can start with just a single cpp file. Similar
to your standard main.cpp, Julgen requires the user to define PreInit() and
GameStart().
Similar to a Awake() and Start():
PreInit() can be used to setup the window title and resolution.
GameStart() will be the start of the game, here you can load resources or scenes.
Loading Scenes
As you might have noticed in the code, the scenes are also loaded from the code. I
will be working on a GUI version of the engine in the future, but for now this
system works quite well :)
All the user does is create a void method with a scene& parameter, this allows easy
access to the scene being loaded. Scenes are binded at first, allowing for them to
be reused.
#include <Camera.h>
#include <Julgen.h>
#include <Resources.h>
#include <Scene.h>
#include <SceneManager.h>
#include <SpriteRenderer.h>
void jul::Julgen::PreInit() {}
void ExampleScene(jul::Scene& scene)
{
// Add camrea to the scene
auto* camera = scene.AddGameObject("Camera");
camera‑>AddComponent<jul::Camera>(5, 16.0 / 9.0);
// Add image to the screen
auto* logo = scene.AddGameObject("Logo");
logo‑>AddComponent<jul::SpriteRenderer>(jul::Resources::GetSprite("Logo"));
}
void jul::Julgen::GameStart()
{
// Load image
Resources::LoadSprite("Logo", "Julgen_Logo_BB_Retro.png", 32);
// Bind scene (can be used to load multiple times)
SceneManager::BindScene(0, ExampleScene);
// Load scene
SceneManager::LoadScene(0);
}
This first iteration of the game loop already has lots of things I'd like to
adress. The way objects are destroyed only at the end of the frame works
quite well but takes a lot of resources just looping over all objects. Lot's
of these checks could be avoided by smartly moving objects between
containers and would be a fun project for in the future.
void jul::Julgen::RunOneFrame()
{
#ifdef USE_STEAMWORKS
SteamAPI_RunCallbacks(); // Valve Please Run :)
#endif
// GameTimeUpdate
GameTime::Update();
m_Lag += GameTime::GetDeltaTime();
// ProcessInput
Input::GetInstance().ProcessInput(m_IsApplicationQuitting);
// FixedUpdate
while (m_Lag >= GameTime::GetFixedDeltaTime())
{
Locator::Get<Physics>().UpdateIsActive();
SceneManager::GetInstance().FixedUpdate();
Locator::Get<Physics>().UpdateWorld();
m_Lag -= GameTime::GetFixedDeltaTime();
}
// Update
SceneManager::GetInstance().Update();
// Message Dispatch
MessageQueue::Dispatch();
// Tween Update
TweenEngine::GetInstance().Update();
// Late Update
SceneManager::GetInstance().LateUpdate();
// Render
RenderManager::GetInstance().PickCamera();
RenderManager::GetInstance().Render();
// Load / Unload Game Objects and Scenes
// Loop state happends inside of process scenes
SceneManager::GetInstance().ProcessScenes();
GameTime::AddToFrameCount();
}
Example Game
What better than making a game to demonstrate the engine!
Using the Tappy Plane asset pack from Kenney I will be
making small little game going over all the steps.
We start by just loading the plane sprite with a idle animation
void MainScene(jul::Scene& scene)
{
// Add camrea to the scene
auto* camera = scene.AddGameObject("Camera");
camera‑>AddComponent<jul::Camera>(5, 16.0 / 9.0);
// Add image to the screen
auto* plane = scene.AddGameObject("Logo");
plane‑>AddComponent<jul::SpriteRenderer>(jul::Resources::GetSprite("Logo"));
plane‑>AddComponent<jul::Animator>()‑>Play("Idle", true);
}
void jul::Julgen::GameStart()
{
// Load image
Resources::LoadSprite(
"Logo",
"TappyPlane/planeYellow1.png",
88, // The sprite is 88 pixels wide, this will make the place 1 unit
{ 0.5f, 0.5f }, // We want the plane to pivot around it's center
1, // 1 row
3, // 3 cols
// The animation is called Idle, with 3 frames and 8 frames per second
// Sprite animations also allow reusing frames as seen here
{
{ "Idle", SpriteAnimation{ { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 1, 0 } }, 8 } }
}
);
// Bind scene (can be used to load multiple times)
SceneManager::BindScene(0, MainScene);
// Load scene
SceneManager::LoadScene(0);
}
Basic component in Julgen
The following is the default structure for a component
#ifndef PLANE_H
#define PLANE_H
#include <Component.h>
namespace tp
{
class Plane final : public jul::Component
{
public:
Plane(jul::GameObject* parentPtr);
private:
// All Optional
void Update() override;
void LateUpdate() override;
void FixedUpdate() override;
void OnDestroy() override;
};
} // namespace tp
#endif // PLANE_H
// CPP File
#include "Plane.h"
tp::Plane::Plane(jul::GameObject* parentPtr) :
jul::Component(parentPtr, "Plane") // Optinally give the component a name
{}
Creating the plane component
To create the plane we can add some simple code to our component that makes the
plane fall down. We will also change the angle to add some player feedback to the
plane.
#include "Plane.h"
#include <GameTime.h>
#include <MathExtensions.h>
#include <Transform.h>
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/gtx/string_cast.hpp>
tp::Plane::Plane(jul::GameObject* parentPtr) :
jul::Component(parentPtr, "Plane")
{}
void tp::Plane::OnBumpInput(const jul::InputContext& context)
{
// We only wanna trigger on button down
if(context.state != jul::ButtonState::Down)
return;
// When bumping, change the velocity
m_VerticalVelocity += BUMP_VELOCITY;
}
void tp::Plane::Update()
{
// Add and clamp velocity
m_VerticalVelocity += GRAVITY_FORCE * jul::GameTime::GetDeltaTime();
m_VerticalVelocity = std::clamp(m_VerticalVelocity, ‑MAX_VELOCITY, MAX_VELOCITY);
// Apply Gravity
// done without physics to simplify
GetTransform().Translate(0, m_VerticalVelocity, 0);
// Rotate plane based on velocity
const double targetAngle =
‑jul::math::MapValueInRangeClamped(m_VerticalVelocity, ‑MAX_VELOCITY, MAX_VELOCITY, ‑FALL_ANGLE, FALL_ANGLE);
GetTransform().SetLocalRotation(0, 0, targetAngle);
}
We also add the component to the plane game object and bind the input to the
function. There are many ways to takle the input, but for simplicity we will
directly bind the function.
In this step we will just add obstacles visually. This is done in the form of two
new component; a GameState, this because we need some form of keeping track of the
obstacles and a AutoMove component. We want to make the components as generic as
possible to allow for flexible development.
#include "GameState.h"
#include <AutoMove.h>
#include <GameTime.h>
#include <Resources.h>
#include <SceneManager.h>
#include <SpriteRenderer.h>
tp::GameState::GameState(jul::GameObject* parentPtr) :
jul::Component(parentPtr, "GameState") {}
void tp::GameState::Update()
{
m_SpawnTimer += jul::GameTime::GetDeltaTime();
if(m_SpawnTimer > m_SpawnInterval)
{
m_SpawnTimer -= m_SpawnInterval;
m_SpawnInterval = jul::math::RandomRange(SPAWN_INTERVAL_MIN, SPAWN_INTERVAL_MAX);
SpawnObstacle();
}
}
void tp::GameState::SpawnObstacle()
{
// Get active scene
// In Julgen this is done manually for more control and clarity
// Engines like Unity just use the primary scene by default
auto& currentScene = jul::SceneManager::GetPrimaryScene();
const double spawnHeight = jul::math::RandomRange(OBSTACLE_HEGIHT_MIN, OBSTACLE_HEGIHT_MAX);
// We will make a hierarchy, so we need a parent obstacle
auto* obstacleGOPtr = currentScene.AddGameObject("Obstacle", { 8, spawnHeight, 0 });
obstacleGOPtr->AddComponent<tp::AutoMove>(glm::vec3{ -FLY_SPEED, 0, 0 });
// We will make a hierarchy, so we need a parent obstacle
auto* topSpikeGOPtr = currentScene.AddGameObject("TopSpike", { 0, 3, 0 });
topSpikeGOPtr->GetTransform().SetParent(&obstacleGOPtr->GetTransform(), false);
topSpikeGOPtr->AddComponent<jul::SpriteRenderer>(jul::Resources::GetSprite("SpikeTop"));
auto* bottomSpikeGOPtr = currentScene.AddGameObject("TopSpike", { 0, -3, 0 });
bottomSpikeGOPtr->GetTransform().SetParent(&obstacleGOPtr->GetTransform(), false);
bottomSpikeGOPtr->AddComponent<jul::SpriteRenderer>(jul::Resources::GetSprite("SpikeBottom"));
// we will add some slight variation to the terrain
topSpikeGOPtr->GetTransform().SetLocalRotation(0, 0, jul::math::RandomRange(-3, 3));
bottomSpikeGOPtr->GetTransform().SetLocalRotation(0, 0, jul::math::RandomRange(-3, 3));
// Objects should ideally be reused or be destroyed when off screen
// Because of this being an simple example game I chose to just destroy the objects delayd
// This ofcourse has issues when changing the fly speed
obstacleGOPtr->DestroyDelayed(10);
}
Collision and EndScreen
All we have left to finish this little example game is collision with the spikes and
going out of the screen. Julgen has Box2D integrated, so it's a piece of cake to add
box colliders. All we need to do is add colliders and rigididbodys to the pillars
and plane. This allows for the ICollisionListener to work.
// Add Plane
auto* planeGOPtr = scene.AddGameObject("Plane");
auto* planeComponentPtr = planeGOPtr->AddComponent<tp::Plane>();
planeGOPtr->AddComponent<jul::SpriteRenderer>(jul::Resources::GetSprite("Plane"));
planeGOPtr->AddComponent<jul::Animator>()->Play("Idle", true);
// New for the collision
planeGOPtr->AddComponent<jul::Rigidbody>(
jul::Rigidbody::Settings{ .mode = jul::Rigidbody::Mode::Dynamic, .manuallyMove = true });
planeGOPtr->AddComponent<jul::BoxCollider>(jul::BoxCollider::Settings{
.size{ 1, 1},
.center{0.5f, -0.5f}
});
// And the same goes for the spikes
auto* bottomSpikeGOPtr = currentScene.AddGameObject("BottomSpike", { 0, -3, 0 });
bottomSpikeGOPtr->GetTransform().SetParent(&obstacleGOPtr->GetTransform(), false);
bottomSpikeGOPtr->AddComponent<jul::SpriteRenderer>(jul::Resources::GetSprite("SpikeBottom"));
bottomSpikeGOPtr->AddComponent<jul::Rigidbody>(jul::Rigidbody::Settings{ .mode = jul::Rigidbody::Mode::Static });
bottomSpikeGOPtr->AddComponent<jul::BoxCollider>(jul::BoxCollider::Settings{
.size{ 0.1, 1.2},
.center{0.5f, -0.5f}
});
Then simply in the plane component, derive from ICollisionListener and override
OnCollisionBegin. You might have noticed that we use the MessageQueue. This is to
decouple the game over code from the player plane.
To round it off, we listened to the on-player-death message and display the game
over screen. We can use Julgen's tween engine to polish the game with a bounce
effect.
tp::GameState::GameState(jul::GameObject* parentPtr) :
jul::Component(parentPtr, "GameState")
{
jul::MessageQueue::AddListener(MessageType::PlayerDead, this, &GameState::OnPlayerDead);
}
void tp::GameState::OnPlayerDead(const jul::Message& /*unused*/)
{
jul::GameTime::SetTimeScale(0);
// Add Background
auto* gameOverTextGOPtr = jul::SceneManager::GetPrimaryScene().AddGameObject("GameOverText");
gameOverTextGOPtr->AddComponent<jul::SpriteRenderer>(jul::Resources::GetSprite("GameOverText"), 100);
jul::TweenEngine::Start(
{
.duration = 2.0,
.igunoreTimeScale = true,
.easeFunction = jul::EaseFunction::BounceOut,
.onUpdate = [gameOverTextGOPtr](double value)
{
gameOverTextGOPtr->GetTransform().SetLocalScale(glm::vec3{ value, value, value });
}
},gameOverTextGOPtr); // Here we pass the gameobject. This allows the tween to stop when it gets destroyed
}
You can also add a restart command and bind it using the input system.
class ResetGameCommand final : public jul::BaseCommand
{
public:
void Execute(const jul::InputContext& context) override
{
if(context.state != jul::ButtonState::Down)
return;
jul::SceneManager::LoadScene(0);
jul::GameTime::SetTimeScale(1);
}
};
// In GameStart()
Input::Input::RegisterCommand((int)tp::InputBind::Reset, 0, true);
I hope you enjoyed this little game demo in Julgen. The engine has much to offer
with it's Tweening system and also has a very nice delegate/event system. For more
info feel free to check the GitHub page or give the engine a try yourself ;)
Engine
Language
Programmer
Julgen
C++
Julian Rijken
Just Keep Swimming
About the game
Just Keep Swimming is an upside down take on the 2.5D platformer genre. When a plug
gets pulled from the bottom of the ocean causing the water level to drop, you, a
small but chonky pufferfish, embark on a race against the clock to seal that hole.
What i did
This was a three-day long game jam where I was in charge as a dev lead! Together
with Kris Catteau as an art lead, we managed to handle a team of 10 people and
produce a finished product.
I was personally in charge of the character controller, cutscenes, and most
importantly, making sure everyone knew what to do :)
Jam Winner!
JKS started as a fun experiment, trying a game jam with 10 people. Our role
management and teamwork happened to lead us to receiving the community award!
Engine
Language
Programmers
Artists
Unreal
Blueprints
Julian Rijken
Finn Bogaert
Xander Berten
Daan van Splunter
Michiel Eeckhout
Shashwat Patkar
Jakub Fratczak
Kris Catteau
Ward Vervoort
Wout Decroos
Wheel Spin
About the game
A fun little racing game that emphasizes on drifting. Your goal, to drift to the end
of the level with the highest possible points and making your way through the
obstacles.
What i did
This project was a nice experimentation with persistent levels and some cell shading
work. The game also makes use of custom modular level assets that allow me to
quickly build the level.
Engine
Language
Programmer
Unreal 5
Blueprints
Julian Rijken
Bread End
About the game
Inspired by the viral YouTube video of that one slice of bread falling over, you
embark on a yeasty and crusty bread throwing spree to end that piece of bread.
What i did
I was also, as usual :), in charge of the player controller. This one was
extremely fun as it's not the usual player movement but rather a piece of bread that
you can grab. The bread gets picked up using a joint and some fancy ray casts to go
from screen to world.
Most of the coding work revolved around detecting the specific endings, like if the
player is laying still, at the right spot at the right time with the right item and
the right unlocks, you get the point haha.
Engine
Language
Programmers
Artists
Unreal 5
Blueprints
Julian Rijken
woutjaah
Jakub Fratczak
Kris Catteau
Xander Berten
Strawberry Game Jam
About the game
A simple but exciting game where you traverse oncoming walls by spinning around the
center.
What i did
I spend much time on an advanced level editor that allowed me to procedurally set up
the oncoming walls. I also made a custom shader to render the walls to make them
look crisp and be highly customizable.