0Pricing
Learn Rust Coding · บทเรียน

สร้างและเคลื่อนย้ายเอนทิตี

นำสิ่งต่าง ๆ ไปแสดงบนหน้าจอ

สร้างและเคลื่อนย้ายเอนทิตี เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

Commands: การสร้างที่เลื่อนเวลา

คุณไม่สามารถแก้ไข World โดยตรงขณะที่ระบบทำงานแบบขนานได้ แต่ให้เข้าคิวการเปลี่ยนแปลงเชิงโครงสร้างผ่าน Commands แทน

การสร้าง การลบ และการเพิ่มคอมโพเนนต์จะถูกบันทึกไว้ แล้วนำไปใช้เมื่อจบช่วงของกำหนดการ เพื่อให้การเข้าถึงปลอดภัย

fn setup(mut commands: Commands) {
    commands.spawn_empty();
}

การสร้างด้วย Bundle

Bundle คือกลุ่มคอมโพเนนต์ที่แทรกเข้าด้วยกัน Bundle ที่ง่ายที่สุดคือทูเพิลของคอมโพเนนต์

Bevy จะถือว่าองค์ประกอบแต่ละตัวของทูเพิลเป็นคอมโพเนนต์ที่ต้องแนบ ดังนั้นการเรียกสร้างเพียงครั้งเดียวก็สามารถมอบข้อมูลเริ่มต้นทั้งหมดให้เอนทิตีได้

fn setup(mut commands: Commands) {
    commands.spawn((
        Position { x: 0.0, y: 0.0 },
        Velocity { x: 1.5, y: 0.0 },
        Player,
    ));
}

มองเห็นด้วยกล้อง

จะไม่มีอะไรถูกเรนเดอร์หากไม่มีกล้อง สำหรับเกม 2D ให้สร้าง Camera2d ในระบบเริ่มต้น

กล้องเองก็เป็นเอนทิตีที่มีคอมโพเนนต์กล้องเช่นกัน ซึ่งเป็นอีกตัวอย่างหนึ่งของความสม่ำเสมอแบบ ECS ทุกอย่างในฉากคือเอนทิตี

fn setup(mut commands: Commands) {
    commands.spawn(Camera2d::default());
}

การสร้างสไปรต์

หากต้องการวาดบางสิ่ง ให้เอนทิตีมี Sprite และ Transform โดย Transform จะเก็บตำแหน่ง การหมุน และมาตราส่วนในพื้นที่โลก

สไปรต์สีไม่จำเป็นต้องใช้ทรัพยากรรูปภาพ จึงเหมาะสำหรับสร้างต้นแบบการเคลื่อนที่ก่อนนำเข้าภาพประกอบ

commands.spawn((
    Sprite::from_color(Color::srgb(0.2, 0.7, 1.0), Vec2::new(40.0, 40.0)),
    Transform::from_xyz(0.0, 0.0, 0.0),
    Velocity { x: 80.0, y: 0.0 },
));

Transform กับ Position แบบกำหนดเอง

ในเกม Bevy จริง โดยทั่วไปคุณจะย้าย Transform ที่มีมาให้แทน Position แบบกำหนดเอง เพราะการเรนเดอร์อ่าน Transform โดยตรง

ค่าการเลื่อนตำแหน่งคือ Vec3 สำหรับ 2D ให้เปลี่ยนค่า x และ y และเก็บ z ไว้กำหนดลำดับการวาด

#[derive(Component)]
struct Velocity { x: f32, y: f32 }

fn apply_velocity(mut q: Query<(&mut Transform, &Velocity)>) {
    for (mut tf, vel) in &mut q {
        tf.translation.x += vel.x;
        tf.translation.y += vel.y;
    }
}

การวนซ้ำคิวรีแบบแก้ไขได้

หากต้องการเปลี่ยนข้อมูลคอมโพเนนต์ ให้ขอ &mut T แล้ววนซ้ำผ่าน &mut query แต่ละรายการจะให้การอ้างอิงที่แก้ไขได้

Bevy รับประกันว่าจะไม่มีสองระบบถือการเข้าถึงแบบแก้ไขที่ขัดแย้งกันพร้อมกัน ดังนั้นลูปนี้จึงปลอดภัยแม้ขณะที่ระบบอื่นกำลังทำงาน

fn move_all(mut q: Query<&mut Transform, With<Player>>) {
    for mut tf in &mut q {
        tf.translation.x += 1.0;
    }
}

การสร้างเอนทิตีจำนวนมาก

ลูปช่วยให้คุณเติมข้อมูลในด่านได้ เรียก spawn ภายในลูป Rust for เพื่อสร้างตารางสิ่งกีดขวางหรือฝูงศัตรู

การวนซ้ำแต่ละครั้งจะเข้าคิวคำสั่งของตนเอง และคำสั่งทั้งหมดจะถูกนำไปใช้พร้อมกันที่ขอบเขตของช่วง

fn spawn_row(mut commands: Commands) {
    for i in 0..5 {
        commands.spawn((
            Sprite::from_color(Color::WHITE, Vec2::splat(20.0)),
            Transform::from_xyz(i as f32 * 30.0, 0.0, 0.0),
        ));
    }
}

การลบเอนทิตี

ลบเอนทิตีทั้งหมดด้วย commands.entity(id).despawn() การทำเช่นนี้จะคืนคอมโพเนนต์และนำดัชนีเอนทิตีกลับมาใช้ใหม่

โดยทั่วไปคุณจะลบเอนทิตีจากระบบที่คิวรี ID Entity ของเอนทิตีนั้น เช่น กระสุนที่ออกนอกหน้าจอ

fn cleanup(mut commands: Commands, q: Query<(Entity, &Transform)>) {
    for (e, tf) in &q {
        if tf.translation.y > 600.0 {
            commands.entity(e).despawn();
        }
    }
}

การเพิ่มคอมโพเนนต์ภายหลัง

คุณสามารถแนบคอมโพเนนต์ใหม่ให้เอนทิตีที่มีอยู่ขณะรันไทม์ผ่าน insert วิธีนี้ใช้มอบแท็ก Shield ให้ผู้เล่นที่ได้รับพลังเพิ่ม

การนำออกทำในลักษณะเดียวกันด้วย remove::<T>() ทั้งสองอย่างเป็นการเปลี่ยนแปลงเชิงโครงสร้าง จึงต้องทำผ่าน Commands

commands.entity(player).insert(Shield { hits: 3 });
// later
commands.entity(player).remove::<Shield>();

Z สำหรับการจัดเลเยอร์

ใน 2D ค่า z ของการเลื่อนตำแหน่งใน Transform จะกำหนดลำดับการวาด ค่า z ที่สูงกว่าจะถูกเรนเดอร์ทับอยู่ด้านบน

กำหนดค่า z ให้ฉากหลังต่ำ และให้ผู้เล่นสูงกว่า เพื่อไม่ให้สไปรต์หายไปหลังฉาก

// background behind, player in front
commands.spawn((bg_sprite, Transform::from_xyz(0.0, 0.0, 0.0)));
commands.spawn((player_sprite, Transform::from_xyz(0.0, 0.0, 10.0)));

การเชื่อมการทำงานเข้าด้วยกัน

สร้างใน Startup และเคลื่อนที่ใน Update ระบบเริ่มต้นจะสร้างกล้องและเอนทิตีเพียงครั้งเดียว ส่วนระบบอัปเดตจะขยับสิ่งเหล่านั้นทุกเฟรม

การแยกเช่นนี้ช่วยให้การเริ่มต้นไม่ปะปนอยู่ในเส้นทางการทำงานหลักของแต่ละเฟรม

App::new()
    .add_plugins(DefaultPlugins)
    .add_systems(Startup, setup)
    .add_systems(Update, apply_velocity)
    .run();

ตรวจสอบความเข้าใจ

ลองคิดดูว่าการเปลี่ยนแปลงเชิงโครงสร้างถูกนำไปใช้อย่างไร

สรุป: การสร้างและการเคลื่อนที่

คุณสร้างเอนทิตีด้วย Bundle ผ่าน Commands เรนเดอร์ด้วย Sprite และ Transform และทำให้เคลื่อนที่โดยแก้ไข Transform ในระบบ Update

การลบเอนทิตีและการแทรกคอมโพเนนต์ก็เป็นคำสั่งเช่นกัน ต่อไปเราจะทำให้การเคลื่อนที่ตอบสนองต่ออินพุตจากแป้นพิมพ์และเวลาที่ผ่านไปจริง

คำถามที่พบบ่อย

บทเรียน “สร้างและเคลื่อนย้ายเอนทิตี” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “สร้างและเคลื่อนย้ายเอนทิตี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “สร้างและเคลื่อนย้ายเอนทิตี”

นำสิ่งต่าง ๆ ไปแสดงบนหน้าจอ คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “สร้างและเคลื่อนย้ายเอนทิตี” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนวคิดแบบ ECS
  2. สร้างและเคลื่อนย้ายเอนทิตี
  3. จัดการข้อมูลนำเข้าและเวลา
  4. การชนและสถานะเกม
← กลับไปที่ Learn Rust Coding