إنشاء الكيانات وتحريكها
ضع العناصر على الشاشة
إنشاء الكيانات وتحريكها درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
الأوامر: الإنشاء المؤجّل
لا يمكنكم تعديل 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,
));
}كاميرا للرؤية
لا يمكن عرض أي شيء من دون كاميرا. في الألعاب ثنائية الأبعاد، تنشئون Camera2d في نظام بدء التشغيل.
الكاميرا نفسها كيان يحتوي على مكوّنات الكاميرا، وهذا مثال آخر على اتساق ECS. كل شيء في المشهد هو كيان.
fn setup(mut commands: Commands) {
commands.spawn(Camera2d::default());
}إنشاء Sprite
لرسم شيء ما، امنحوا الكيان Sprite بالإضافة إلى Transform. يحتفظ التحويل بالموضع والدوران والمقياس في إحداثيات العالم.
لا يحتاج Sprite الملوّن إلى أصل صورة، وهذا مفيد عند إنشاء نموذج أولي للحركة قبل استيراد الرسومات.
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 مقابل الموضع المخصّص
في ألعاب Bevy الحقيقية، تحرّكون عادةً Transform المضمّن بدلًا من Position مخصّص، لأن العرض يقرأ Transform مباشرةً.
الترجمة هي Vec3. في الألعاب ثنائية الأبعاد، تغيّرون 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;
}
}التكرار على Query بشكل قابل للتعديل
لتغيير بيانات المكوّن، تطلبون &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(). يؤدي ذلك إلى تحرير مكوّناته وإعادة استخدام فهرس الكيان.
عادةً ما تحذفون الكيان من نظام استعلم عن معرّف 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 للطبقات
في الألعاب ثنائية الأبعاد، تحدد قيمة z في ترجمة التحويل ترتيب الرسم. تُرسم القيم الأعلى لـ z في المقدمة.
امنحوا الخلفية قيمة z منخفضة واللاعب قيمة أعلى، حتى لا تختفي Sprites خلف المشهد.
// 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();تحقّق سريع
فكّروا في كيفية تطبيق التغييرات البنيوية.
مراجعة: الإنشاء والحركة
تنشئون الكيانات باستخدام الحزم عبر Commands، وتعرضونها باستخدام Sprite وTransform، وتحركونها بتعديل التحويل داخل نظام Update.
حذف الكيانات وإدراج المكوّنات هما أيضًا أوامر. سنجعل الحركة لاحقًا تستجيب لإدخال لوحة المفاتيح والزمن المنقضي الفعلي.
الأسئلة الشائعة
هل درس «إنشاء الكيانات وتحريكها» مجاني؟
نعم — نص درس «إنشاء الكيانات وتحريكها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء الكيانات وتحريكها»؟
ضع العناصر على الشاشة تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «إنشاء الكيانات وتحريكها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عقلية ECS
- إنشاء الكيانات وتحريكها
- التعامل مع الإدخال والوقت
- التصادمات وحالة اللعبة