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

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);
}