Venture Engine
Unsere hauseigene Game-Engine ist für 2.5D-Spiele in der Third-Person-Perspektive konzipiert. 2.5D bedeutet in diesem Fall 2D Charaktere und Objekte in einer 3D Welt mit perspektivischer Kamera.
Core Technologien
Zielplattformen
- Windows x86_64
- Linux x86_64 und arm64
- macOS arm64
- PlayStation 5 und PlayStation 6
- Nintendo Switch 2
Logik und Gameplay
Die gesamte Spiellogik ist als ECS-System implementiert. Diese Systeme werden automatisch in einer für maximale Parallelität optimierten Reihenfolge ausgeführt.
Beispiel System in Jai:
MovePlayer :: (
players: ECS.Query(ECS.Read(Tag), ECS.Write(World.PositionComponent), ECS.Write(ControllerComponent)),
frame: ECS.Res(App.FrameStats),
inputs: ECS.Inputs,
camera: ECS.ResMut(Camera.State)
) {
movement := inputs.Axis2D(Binding.Movement).GetValue();
sprinting := inputs.Action(Binding.Sprint).IsPressed();
for players.each() {
it.controller.direction = movement;
it.position.position += it.controller.direction * frame.deltaTimeS * MoveSpeed(sprinting);
if controller.cameraInDeadZone {
// ...
}
}
Init :: () {
ECS.AddSystem(ECS.Schedule.Update, MovePlayer);
}
Selbes system in C++:
void MovePlayer(ECS::Query<ECS::Read<Tag>, ECS::Write<World::PositionComponent>, ECS::Write<ControllerComponent>> players,
ECS::Res<const App::FrameStats> frame,
ECS::Inputs inputs,
ECS::ResMut<Camera::State> camera)
{
const MyMath::WorldVect movement = inputs.Axis2D(Binding::Movement).GetValue();
const bool sprinting = inputs.Action(Binding::Sprint).IsPressed();
for (auto [entity, position, controller] : players.each()) {
(void)entity;
controller.direction = movement;
position.position += controller.direction * frame->deltaTimeS * MoveSpeed(sprinting);
if (controller.cameraInDeadZone) {
// ...
}
}
void Init() {
ECS::AddSystem(ECS::Schedule::Update, MovePlayer);
}