لعبة الساحر

Starter pack

في هذا الدرس، سنقوم بدمج محرك VFX الخاص بنا مع العديد من الأمور التي تعلمناها خلال هذه الدورة لإنشاء لعبة ثلاثية الأبعاد بسيطة: ساحر يقاتل الأورك الشرير باستخدام التعاويذ والسحر. 🧙‍♂️

أساس قوي لمشروعات تطوير الألعاب الخاصة بك على الويب!

مشروع البداية

مشروع البداية يحتوي على:

مشروع بداية لعبة الساحر

إليك كيف يبدو مشروع البداية.

مستعد للبدء؟ 🪄

مرحبًا بكم في هوجورتس 🏰

قبل تنفيذ أي نوع من المنطق اللعبة، دعونا نمارس مهاراتنا السحرية في هوجورتس من خلال إنشاء تعاويذ باستخدام محرك المؤثرات البصرية الذي أنشأناه في الدرس المخصص.

كما فعلنا في درس الألعاب النارية، يمكننا استخدام النسخة المنشورة من محرك المؤثرات البصرية. لنقم بإضافته إلى مشروعنا:

yarn add wawa-vfx@^1.0.0

باستخدام @^1.0.0، نضمن أننا نستخدم دائمًا الإصدار الرئيسي 1 من الحزمة مع تضمين أحدث الإصدارات الثانوية والإصلاحات. بهذه الطريقة، يمكننا الاستفادة من أحدث الميزات وإصلاحات الأخطاء دون تغييرات تتسبب في كسر الكود.

الآن في ملف Magic.jsx، دعونا نقوم بإنشاء مكون <VFXS /> الذي سيحتوي على جميع مكونات <VFXParticles /> لمشروعنا.

import { VFXParticles } from "wawa-vfx";

export const Magic = ({ ...props }) => {
  // ...

  return (
    <group {...props}>
      <VFXS />
      {/* ... */}
    </group>
  );
};

const VFXS = () => {
  return (
    <>
      <VFXParticles
        name="sparks"
        settings={{
          nbParticles: 100000,
          renderMode: "billboard",
          intensity: 3,
          fadeSize: [0.1, 0.1],
        }}
      />
  );
};

وبجواره مكون Spells الذي سيحتوي على جزء العرض الخاص بتعاويذنا.

// ...
export const Magic = ({ ...props }) => {
  // ...

  return (
    <group {...props}>
      <VFXS />
      <Spells />
      {/* ... */}
    </group>
  );
};

const Spells = () => {
  return <></>;
};

أحب أن أمزج بين عدة مكونات في نفس الملف عندما تكون مرتبطة بشكل وثيق. يجعل ذلك من السهل فهم منطق الملف. لا تتردد في تقسيمها إلى مجلدات/ملفات منفصلة إذا كنت تفضل ذلك.

دعونا نستعد لأول تعويذة لنا، وهي تعويذة Void.

تعويذة الفراغ

دعونا نقوم بإنشاء مكون باسم Void ليتم عرضه في مكون Spells.

// ...
import { VFXEmitter } from "wawa-vfx";

// ...

const Spells = () => {
  return (
    <>
      <Void />
    </>
  );
};

const Void = ({ ...props }) => {
  return (
    <group {...props}>
      <VFXEmitter debug emitter="sparks" />
    </group>
  );
};

مكون VFXEmitter سيصدر جسيمات من المصدر sparks الذي أنشأناه في مكون VFXS.

مع تعيين debug إلى true سنحصل على أدوات تحكم بصرية لتشكيل التأثير الذي نريد تحقيقه.

حسنًا، لننشئ تعويذة ستجعل الأورك يرتجفون!

التأثير البصري الجيد هو مزيج من الإعدادات المناسبة والتوقيت الصحيح.

لنفكك ما نريد تحقيقه مع تعويذة Void.

أولاً، نريد مرحلة التحضير. هذه هي اللحظة التي يتم فيها جمع الطاقة قبل إطلاق التعويذة. كلما كان التحضير أفضل، زاد الشعور بالتوقع لدى اللاعب، وبدا التعويذة أكثر قوة.

تحضيرنا سيكون مكوّنًا من:

  • جسيمات تصدر ببطء للأعلى
  • كرة تنمو تدريجيًا
  • أحرف مكتوبة تدور على الأرض كما لو كانت التعويذة تُلقى

ثم، نريد مرحلة الانفجار. هذه هي اللحظة التي تُطلق فيها التعويذة وتتحرر الطاقة. كلما كان الانفجار أفضل، زاد الشعور بالرضا لدى اللاعب.

انفجارنا سيكون مكوّنًا من:

  • انفجار الكرة (جعلها تختفي)
  • جسيمات تتحرك في كل الاتجاهات

ولكل تأثير بصري، سنضيف تأثير صوتي لنجعله أكثر غمرًا.

دعونا نلعب بإعدادات مكون VFXEmitter لنحقق التأثير المطلوب للجسيمات التحضيرية.

إليكم ما توصلت إليه:

<VFXEmitter
  emitter="sparks"
  settings={{
    duration: 0.5,
    delay: 0,
    nbParticles: 20,
    spawnMode: "time",
    loop: false,
    startPositionMin: [-0.5, 0, -0.5],
    startPositionMax: [0.5, 1, 0.5],
    startRotationMin: [0, 0, 0],
    startRotationMax: [0, 0, 0],
    particlesLifetime: [0.5, 1],
    speed: [0, 1],
    directionMin: [0, 0, 0],
    directionMax: [0, 0.1, 0],
    rotationSpeedMin: [0, 0, 0],
    rotationSpeedMax: [0, 0, 0],
    colorStart: ["#4902ff"],
    colorEnd: ["#ffffff"],
    size: [0.1, 0.4],
  }}
/>

نرى الجسيمات ترتفع ببطء إلى الأعلى.

بدلاً من الجسيمات المربعة، دعونا نستخدم المثلثات. لتحقيق ذلك، يمكننا استخدام cone geometry مع الإعدادات المناسبة.

// ...

const VFXS = () => {
  return (
    <>
      <VFXParticles
        name="sparks"
        geometry={<coneGeometry args={[0.5, 1, 8, 1]} />}
        settings={{
          nbParticles: 100000,
          renderMode: "billboard",
          intensity: 3,
          fadeSize: [0.1, 0.1],
        }}
      />
    </>
  );
};

// ...

تبدو الجسيمات مثل المثلثات الآن.

الآن دعونا نضيف الكرة المتزايدة. لتحقيق ذلك نحتاج إلى إضافة مكون جديد VFXParticles لمكون VFXS:

const VFXS = () => {
  return (
    <>
      {/* ... */}
      <VFXParticles
        name="spheres"
        geometry={<sphereGeometry args={[1, 32, 32]} />}
        settings={{
          nbParticles: 1000,
          renderMode: "mesh",
          intensity: 5,
          fadeSize: [0.7, 0.9],
          fadeAlpha: [0, 1],
        }}
      />
    </>
  );
};

من خلال ضبط fadeSize إلى [0.7, 0.9] نجعل الكرة تنمو ببطء حتى 70% من حياتها ثم تختفي بسرعة خلال آخر 10%.

Three.js logoReact logo

React Three Fiber: The Ultimate Guide to 3D Web Development

✨ You have reached the end of the preview ✨

Go to the next level with Three.js and React Three Fiber!

Get full access to this lesson and the complete course when you enroll:

  • 🔓 Full lesson videos with no limits
  • 💻 Access to the final source code
  • 🎓 Course progress tracking & completion
  • 💬 Invite to our private Discord community
Unlock the Full Course – Just $85

One-time payment. Lifetime updates included.