Documentation Index
Fetch the complete documentation index at: https://docs.magicblock.gg/llms.txt
Use this file to discover all available pages before exploring further.
Systems には、components に基づいて entities を処理・操作するロジックが含まれます。通常、system は特定の components を持つすべての entities に対して動作します。たとえば “Movement” system は “Position” component の位置を更新するかもしれません。
次のコマンドで movement system を作成します。
bolt system system-movement
これにより workspace に新しい system が追加されます。
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,
}
}
この簡単な例では、x、y、z 座標を持つ Position component を保持する Player entity を作成しました。movement system を実行することでその状態を変更できます。
より高度な移動ロジックのために、Velocity component を定義してみましょう。
use bolt_lang::*;
declare_id!("CbHEFbSQdRN4Wnoby9r16umnJ1zWbULBHg4yqzGQonU1");
#[component]
#[derive(Copy)]
pub struct Velocity {
pub x: i64
}
移動速度を上げる新しい power-up を追加したい場合は、Velocity を使って Position component に作用する新しい system を追加するだけで実現できます。
#[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,
}
}
この新しい system は Position と Velocity components を入力に取り、power-up のロジックを定義します。Solana accounts や CPI を直接扱う必要はなく、プロキシである World program がそれらをすべて処理します。