reckfellENGINE

Интерполяция: запустить сравнение On и Off

Один полный C#-файл для Entity2D: одинаковое физическое движение с разной плавностью картинки.

На этой странице

Подготовить проект

В Project Settings включите physics/common/physics_interpolation. Для наглядного сравнения временно задайте physics/common/physics_ticks_per_second = 10, затем верните рабочую частоту проекта. Рендер должен выдавать заметно больше 10 кадров/с. Окно — 640×420 или больше.

Создайте отдельный уровень с корнем Entity2D, добавьте InterpolationDemo2D.cs, прикрепите его к корню, соберите и запустите F6. Не двигайте корень и не меняйте его масштаб. Внешние ресурсы не нужны. Синий квадрат использует On, белый Off; оба получают одну физическую X-координату. Сравните их движение, затем отключите глобальную настройку и повторите запуск: локальный On не должен восприниматься как независимая глобальная система.

Квадраты с режимами On и Off

InterpolationDemo2D.cs
C#
using System;
using Reckfell;

public partial class InterpolationDemo2D : Entity2D
{
    public Entity2D Smooth { get; private set; } = null!;
    public Entity2D Stepped { get; private set; } = null!;
    public float Speed { get; set; } = 120;
    public int Warps { get; private set; }
    private float _x = 80;
    private float? _warp;
    public override void _Ready()
    {
        Smooth = Marker(new Vector2(_x,120),new Color(.25f,.45f,1),PhysicsInterpolationModeEnum.On);
        Stepped = Marker(new Vector2(_x,260),Colors.White,PhysicsInterpolationModeEnum.Off);
        AddChild(new Label { Text = "On", Position = new Vector2(24,56), Modulate = new Color(.6f,.6f,.6f) });
        AddChild(new Label { Text = "Off", Position = new Vector2(24,196), Modulate = new Color(.6f,.6f,.6f) });
        ResetPhysicsInterpolation();
    }
    private Entity2D Marker(Vector2 position,Color color,PhysicsInterpolationModeEnum mode)
    {
        var marker = new Entity2D { Position = position, PhysicsInterpolationMode = mode };
        marker.AddChild(new Polygon2D { Polygon = new[] { new Vector2(-12,-12),new Vector2(12,-12),new Vector2(12,12),new Vector2(-12,12) }, Color = color });
        AddChild(marker); return marker;
    }
    public void RequestWarp(float x)
    {
        if (!float.IsFinite(x)) throw new ArgumentOutOfRangeException(nameof(x));
        _warp = x;
    }
    public override void _PhysicsProcess(double delta)
    {
        bool reset = _warp.HasValue;
        _x = _warp ?? (_x + Speed * (float)delta); _warp = null;
        if (_x > 560) { _x = 80; reset = true; }
        Smooth.Position = new Vector2(_x,120); Stepped.Position = new Vector2(_x,260);
        if (reset) { ResetPhysicsInterpolation(); Warps++; }
    }
}

Что делает код

Движение идёт только в _PhysicsProcess. Скорость 120 пикселей/с умножается на delta, потому что здесь изменяется Position напрямую, а не вызывается MoveAndSlide. После перехода за правую границу код переносит оба объекта и сбрасывает историю. RequestWarp задаёт перенос для следующего физического шага; обычное непрерывное движение не вызывает ResetPhysicsInterpolation каждый кадр.

Если различия нет, проверьте глобальную настройку, фактические FPS, режимы сущностей и отсутствие второго скрипта, который пишет Position в _Process. Если нет рисунка — тип корня, успешную C#-сборку, размер viewport и расположение камеры/Canvas в вашем проекте. Перед выпуском проверьте подключение к реальной иерархии.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.