Skip to main content
Системы содержат логику, которая обрабатывает и манипулирует сущностями на основе их компонентов. Система обычно работает со всеми сущностями, которые имеют определённый набор компонентов. Например, система «Движение» может обновлять позицию компонента «Позиция». Создайте систему движения с
bolt system system-movement
которая добавит новый компонент в ваше рабочее пространство:
use bolt_lang::*;
use component_position::Position;

declare_id!("FSa6qoJXFBR3a7ThQkTAMrC15p6NkchPEjBdd4n6dXxA");

#[system]
#[program]
pub mod system_movement {

    pub fn execute(ctx: Context<Components>, args_p: Vec<u8>) -> Result<Components> {
        let position = &mut ctx.accounts.position;
        position.x += 1;
        position.y += 1;
        Ok(ctx.accounts)
    }

    // Define the input components
    #[system_input]
    pub struct Components {
        pub position: Position,
    }
}
В этом простом примере мы создали сущность Player, которая содержит компонент Position с координатами x, y, z. Мы можем выполнить систему движения, чтобы изменить её состояние. Для более сложной динамики движения определим компонент Velocity:
use bolt_lang::*;

declare_id!("CbHEFbSQdRN4Wnoby9r16umnJ1zWbULBHg4yqzGQonU1");

#[component]
#[derive(Copy)]
pub struct Velocity {
    pub x: i64
}
Кто-то может захотеть ввести новый усилитель для более быстрого движения. Это можно сделать просто, добавив новую систему, которая будет действовать на компонент Position с использованием Velocity.
#[system]
pub mod system_apply_velocity {

    pub fn execute(ctx: Context<Components>, _args: Vec<u8>) -> Result<Components> {
        ctx.accounts.position.x += ctx.accounts.velocity.x;
        Ok(ctx.accounts)
    }

    #[system_input]
    pub struct Components {
        pub position: Position,
        pub velocity: Velocity,
    }
}
Эта новая система принимает на вход компоненты Position и Velocity и определяет логику усилителя. Понятия аккаунтов Solana или CPI здесь нет — прокси-программа World program управляет всем самостоятельно.