Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Java
Gamedevelopment

مقدمة ل JavaFX لتطوير اللعبة

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by Basrah (you can also view the original English article)

JavaFX هو منصة عبر أدوات واجهة المستخدم الرسومية ل Java، وهو الخلف للمكتبات "جافا سوينغ". في هذا البرنامج التعليمي، سوف نستكشف ملامح JavaFX التي جعلها سهلة الاستخدام للبدء في برمجة الألعاب في جاوة.

ويفترض هذا البرنامج التعليمي كنت تعرف كيفية التعليمات البرمجية في جافا. إذا لم يكن كذلك، تحقق من تعلم جافا للروبوت، ومقدمة "برمجة الكمبيوتر مع جافا": 101 و 201، جافا أول رئيس أو جرينفوت أو تعلم جافا بالطريقة الصعبة الشروع في العمل.

التثبيت

إذا قمت بالفعل تطوير التطبيقات مع جافا، ربما لا تحتاج إلى تنزيل أي شيء على الإطلاق: المضمنة مع حزمة جدك (أدوات تطوير جافا) القياسية JavaFX منذ JDK الإصدار 7u6 (آب/أغسطس 2012). إذا لم تكن قد قمت بتحديث التثبيت الخاص بك جافا في كل حين، رئيس لجافا تحميل الموقع لأحدث إصدار.

فئات الإطار الأساسي

إنشاء برنامج JavaFX يبدأ مع فئة التطبيق، التي تشمل جميع التطبيقات JavaFX. الفئة الرئيسية الخاصة بك يجب استدعاء الأسلوب launch()، الذي سوف ثم استدعاء الأسلوب init () والأسلوب start ()، انتظر التطبيق لإنهاء ثم ثم استدعاء الأسلوب stop (). من هذه الأساليب، إلا الأسلوب start () تجريدية ويجب أن يتم تجاوز.

الفئة المرحلة هو المستوى الأعلى الحاوية JavaFX. عندما يتم تشغيل أحد تطبيقات، مرحلة أولى إنشاء ويتم تمريرها إلى الأسلوب ابدأ للتطبيق. مراحل التحكم في خصائص النافذة الأساسية مثل العنوان والرمز والرؤية، ريسيزابيليتي، ووضع ملء الشاشة والزينة؛ يتم تكوين هذه الأخيرة باستخدام ستاجيستيلي. قد يكون شيدت مراحل إضافية حسب الاقتضاء. بعد أن يتم تكوين مرحلة ويتم إضافة المحتوى، يتم استدعاء الأسلوب تظهر.

يعرف كل هذا، يمكن أن نكتب مثال الحد أدنى التي تطلق نافذة في JavaFX:

تنظيم المحتوى

يتم تنظيم المحتوى في JavaFX (مثل النص والصور وواجهة مستخدم التحكم) باستخدام بنية بيانات مثل شجرة المعروفة برسم مشهد، الذي يجمع ويرتب عناصر رسومية مشهد.

JavaFX Scene Graph
تمثيل لرسم مشهد JavaFX.

ويسمى عنصر عام لرسم مشهد في JavaFX عقده. كل عقده في شجرة قد عقده "العائل"، باستثناء عقده خاصة سميت "الجذر". مجموعة عبارة عن عقده يمكن أن يكون لها العديد من عناصر العقدة "الطفل". التحولات رسومية (الترجمة، والتناوب، والحجم) والتأثيرات المطبقة على مجموعة تنطبق أيضا على أبنائها. ويمكن أن تكون على غرار العقد استخدام JavaFX أوراق الأنماط المتتالية (CSS)، استخدام مماثلة تماما CSS لتنسيق مستندات HTML.

الفئة مشهد يحتوي على كافة المحتويات لرسم مشهد، ويتطلب جذر العقدة تعيين (في الممارسة، وهذا كثيرا ما مجموعة). يمكنك تعيين حجم المشهد على وجه التحديد؛ خلاف ذلك، حجم مشهد سوف يكون تلقائياً حساب استناداً إلى المحتوى الخاص به. يجب تمرير كائن مشهد إلى المرحلة (بطريقة setScene()) ليتم عرضها.

الرسومات التقديم

تقديم الرسومات هناك أهمية خاصة للمبرمجين اللعبة! في JavaFX، هو الكائن قماش صورة التي يمكن أن نستخلصها النص والأشكال والصور، واستخدام الكائن جرافيكسكونتيكست المقترن به. (لهؤلاء المطورين دراية أدوات "جافا سوينغ"، هذا مشابهة للكائن الرسومات الذي تم تمريره إلى الأسلوب paint() في فئة JFrame).

الكائن جرافيكسكونتيكست يحتوي على ثروة قدرات التخصيص قوية. لاختيار الألوان لرسم النص والأشكال، يمكنك تعيين التعبئة (الداخلية) والسكتة الدماغية ألوان (الحدود)، وكائنات الطلاء: وهذه يمكن أن تكون بلون واحد أو متدرجة المعرفة من قبل المستخدم (لينيرجرادينت أو راديالجرادينت) أو حتى إيماجيباتيرن. يمكنك أيضا تطبيق واحد أو أكثر الكائنات تأثير النمط، مثل الإضاءة، أو الظل، أو جوسيانبلور، وتغيير الخطوط من الافتراضي باستخدام فئة الخط.

فئة الصور يجعل من السهل تحميل الصور من مجموعة متنوعة من التنسيقات من ملفات والاستفادة منها عن طريق الفئة جرافيكسكونتيكست. من السهل إنشاء إنشاء إجرائياً الصور باستخدام فئة وريتابليماجي جنبا إلى جنب مع الفئات بيكسيلريدير وبيكسيلوريتير.

باستخدام هذه الفئات، يمكن أن نكتب تستحق أكثر بكثير "Hello, World"-على غرار المثال كما يلي. للإيجاز، ونحن سوف تشمل فقط الأسلوب start () هنا (ونحن سوف تخطي عبارات الاستيراد والأسلوب main ())؛ ومع ذلك، يمكن الاطلاع على كامل شفرة المصدر العامل في الريبو GitHub المصاحب لهذا البرنامج التعليمي.

حلقة اللعبة

بعد ذلك، نحتاج إلى بذل برامجنا دينامية، بمعنى أن لعبة الدولة تتغير بمرور الوقت. سوف ننفذ حلقة لعبة: حلقة لانهائية بتحديث الكائنات اللعبة ويجعل المشهد على الشاشة، ومن الناحية المثالية بمعدل 60 مرة في الثانية الواحدة.

أسهل طريقة لتحقيق هذا في JavaFX هو استخدام فئة أنيماتيونتيمير، حيث الأسلوب (قد كتب المسماة handle()) التي سوف تسمى بمعدل 60 مرة في الثانية الواحدة، أو كقريبة من هذا المعدل كما هو ممكن. (هذه الفئة لا يجب أن تستخدم فقط لأغراض الرسوم المتحركة؛ فقادرة على أكثر بكثير).

استخدام فئة أنيماتيونتيمير صعب قليلاً: أنها فئة مجردة، فإنه لا يمكن إنشاء مباشرة — يجب أن تمتد الفئة قبل أن يمكن إنشاء مثيل. ومع ذلك، لدينا أمثلة بسيطة، سوف نتقدم الفئة بكتابة فئة داخلية مجهولة. يجب تعريف هذه الفئة الداخلية handle() الأسلوب المجرد، الذي سيتم تمرير وسيطة واحدة: وقت النظام الحالي في نانو ثانية. بعد تعريف فئة داخلية، ونحن فورا استدعاء الأسلوب start ()، الذي يبدأ في الحلقة. (يمكن إيقاف الحلقة بواسطة استدعاء الأسلوب stop ()).

مع هذه الفئات، يمكن تعديل هذا المثال "Hello, World"، إنشاء رسم متحرك تتألف من الأرض تدور حول الشمس ضد صورة خلفية النجوم.

وهناك طرق بديلة لتنفيذ حلقة لعبة في JavaFX. اتباع نهج أطول قليلاً (ولكن أكثر مرونة) يشمل فئة المخطط الزمني، وتسلسل حركة تتكون من مجموعة من الكائنات KeyFrame. لإنشاء حلقة لعبة، يجب تعيين الفترة الزمنية لتكرار إلى أجل غير مسمى، وإطار مفتاحي واحد فقط المطلوب، مع مدة تعيين إلى 0.016 ثانية (لبلوغ 60 دورات لكل ثانية). يمكن الاطلاع على هذا التنفيذ في الملف Example3T.java في الريبو GitHub.

الإطار القائم على الرسوم المتحركة

آخر عنصر برمجة لعبة المطلوبة عادة هو الإطار القائم للرسوم المتحركة: عرض سلسلة من الصور في تعاقب سريع لخلق الوهم في الحركة.

افتراض أن كافة الحركات حلقة وعرض كافة الإطارات لنفس عدد الثواني، تنفيذ أساسية يمكن أن تكون بسيطة كما يلي:

لإدماج هذه الفئة في المثال السابق، يمكن أن نخلق الجسم الغريب متحركة، تهيئة الكائن باستخدام التعليمات البرمجية:

..., وداخل أنيماتيونتيمير، إضافة سطر واحد من التعليمات البرمجية:

..at المكان المناسب. لمثال التعليمات برمجية عمل كاملة، راجع الملف Example3AI.java في الريبو GitHub.

معالجة إدخال المستخدم

كشف ومعالجة إدخال المستخدم في JavaFX واضح ومباشر. إجراءات المستخدم التي يمكن الكشف عنها بواسطة النظام، مثل ضغطات المفاتيح ونقرات الماوس، تسمى الأحداث. في JavaFX، تتسبب هذه الإجراءات تلقائياً توليد كائنات (مثل كيييفينت وموسيفينت) التي تقوم بتخزين البيانات المرتبطة بها (مثل موقع مؤشر الماوس أو الضغط على المفتاح الفعلي). أي فئة JavaFX التي تطبق الفئة افينتارجيت، مثل مشهد، يمكن "الاستماع" للأحداث والتعامل معها؛ في الأمثلة التالية، سنوضح كيفية إعداد مشهد لمعالجة أحداث مختلفة.

نظرة عابرة من خلال وثائق لفئة المشهد، هناك العديد من الطرق التي استمع للتعامل مع أنواع مختلفة من مدخلات من مصادر مختلفة. على سبيل المثال، يمكن تعيين setOnKeyPressed() الأسلوب EventHandler الذي سيتم تنشيط عندما يتم ضغط مفتاح، يمكن تعيين setOnMouseClicked() الأسلوب EventHandler الذي ينشط عند الضغط على زر ماوس، وهلم جرا. الفئة EventHandler يخدم غرض واحد: لتغليف أسلوب (يسمى handle()) التي يتم استدعاؤها عند حدوث الحدث المطابق.

عند إنشاء EventHandler، يجب عليك تحديد نوع الحدث التي يتعامل بها: يمكنك تعريف EventHandler<KeyEvent> أو EventHandler<MouseEvent>، على سبيل المثال-</MouseEvent> </KeyEvent> أيضا، غالباً ما يتم إنشاء افينثاندليرس كفئات داخلية مجهولة، كما أنهم عادة ما تستخدم فقط مرة واحدة (عند أنها يتم تمريرها كوسيطة إلى واحد من الأساليب المذكورة أعلاه).

معالجة أحداث لوحة المفاتيح

غالباً ما تتم معالجة إدخال المستخدم داخل حلقة اللعبة الرئيسية، وهكذا يجب الاحتفاظ بسجل كامل للمفاتيح التي تعمل حاليا. أحد السبل لتحقيق ذلك بإنشاء كائنات ArrayList سلسلة. عند الضغط على مفتاح البداية، نضيف تمثيل سلسلة من KeyCode كيييفينت إلى القائمة؛ عندما يتم تحرير المفتاح، نحن إزالته من القائمة.

في المثال أدناه، تحتوي لوحة الرسم القماشية على صورتين من مفاتيح الأسهم؛ عند الضغط على مفتاح، تصبح الصورة المقابلة الخضراء.


ويرد مصدر التعليمات البرمجية في ملف Example4K.java في الريبو GitHub.

معالجة أحداث الماوس

الآن دعنا نلقي نظرة على مثال يركز على الفئة موسيفينت بدلاً من الفئة كيييفينت. في هذه اللعبة المصغرة، يكسب اللاعب نقطة في كل مرة يتم النقر فوق الهدف.


منذ افينثاندليرس هي الطبقات الداخلية، يجب أن يكون أي من المتغيرات التي يستخدمونها النهائي أو "فعالية النهائي"، بمعنى أنه يمكن أن لا يكون reinitialized المتغيرات. في المثال السابق، تم تمرير البيانات إلى EventHandler واسطة ArrayList، يمكن أن تتغير قيمها دون طريق إعادة تهيئة (عن طريق أساليب add() و remove()).

ومع ذلك، في حالة أنواع البيانات الأساسية، والقيم التي لا يمكن تغيير تهيئة مرة واحدة. إذا كنت تريد EventHandler الوصول إلى أنواع البيانات الأساسية التي تم تغييرها في أي مكان آخر في البرنامج، يمكنك إنشاء فئة برنامج تضمين التي تحتوي على المتغيرات العمومية أو طرق، لفت/واضع. (في المثال أدناه، إينتفالوي هو فئة الذي يحتوي على متغير int عامة تسمى قيمة).

وترد التعليمات البرمجية المصدر الكامل في الريبو GitHub؛ الفئة الرئيسية من Example4M.java.

إنشاء فئة العفريت أساسية مع JavaFX

في ألعاب الفيديو، والعفريت هو عبارة عن كيان مرئي واحد. أدناه هو مثال على فئة العفريت الذي يقوم بتخزين صورة وموقف، فضلا عن معلومات السرعة (بالنسبة للكيانات المتنقلة) ومعلومات العرض/الارتفاع استخدامه عند حساب المربعات المحيطة لأغراض الكشف عن التصادم. ولدينا أيضا الأساليب القياسية، لفت/واضع لمعظم هذه البيانات (حذف للإيجاز)، وبعض الأساليب القياسية اللازمة في تطوير اللعبة:

  • update (): يحسب موقف جديد استناداً إلى السرعة العفريت.
  • render(): يرسم صورة المعاون إلى لوحة الرسم القماشية (عن طريق الفئة جرافيكسكونتيكست) استخدام الموقف إحداثيات.
  • getBoundary(): إرجاع كائن JavaFX Rectangle2D، مفيدة في الكشف عن التصادم ونظرا لأن يتقاطع مع الأسلوب.
  • intersects(): يحدد ما إذا كان المربع المحيط من هذا العفريت يتقاطع مع هذا العفريت آخر.

يتم تضمين التعليمات البرمجية المصدر الكامل في Sprite.java في الريبو GitHub.

استخدام فئة العفريت

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

هذه التعليمات البرمجية تقترض بكثافة من الأمثلة السابقة: إعداد الخطوط لعرض النتيجة, تخزين إدخال لوحة المفاتيح مع ArrayList وتنفيذها في حلقة اللعبة مع أنيماتيونتيمير، وإنشاء فئات المجمع للقيم البسيطة التي تحتاج إلى تعديل خلال حلقة اللعبة.

One code segment of particular interest involves creating a Sprite object for the player (briefcase) and an ArrayList of Sprite objects for the collectibles (money bags):

جزء رمز آخر من الفائدة هو إنشاء AnimationTimer ، الذي تم تكليفه بـ:

  • حساب الوقت المنقضي منذ آخر تحديث
  • ضبط سرعة المشغل حسب المفاتيح التي يتم الضغط عليها حاليًا
  • تنفيذ كشف التصادم بين المشغل والمقتنيات ، وتحديث النتيجة وقائمة المقتنيات عند حدوث ذلك (يتم استخدام Iterator بدلاً من ArrayList مباشرة لتجنب استثناء التعديل المتزامن عند إزالة الكائنات من القائمة)
  • عرض النقوش المتحركة والنص على لوحة الرسم

كالعادة ، يمكن العثور على الكود الكامل في ملف الكود المرفق (Example5.java) في الريبو GitHub.

الخطوات التالية

  • هناك مجموعة من البرامج التعليمية التمهيدية على موقع Oracle ، والتي ستساعدك على تعلم مهام JavaFX الشائعة: Getting Started with JavaFX Sample Applications.
  • قد تكون مهتمًا بتعلم كيفية استخدام Scene Builder ، بيئة تخطيط مرئية لتصميم واجهات المستخدم. يقوم هذا البرنامج بتوليد FXML ، وهي لغة تعتمد على XML والتي يمكن استخدامها لتعريف واجهة مستخدم لبرنامج JavaFX. لهذا ، راجع JavaFX Scene Builder: Getting Started.
  • FX Experience هي مدونة ممتازة ، يتم تحديثها بانتظام ، وتحتوي على معلومات ونماذج للمشروعات التي تهم مطوري JavaFX. العديد من العروض المدرجة هي ملهمة جدا!
  • لدى José Pereda أمثلة ممتازة من ألعاب أكثر تقدمًا تم تصميمها باستخدام JavaFX في مستودع GitHub التابع له.
  • يتكون مشروع JFxtras من مجموعة من المطورين الذين قاموا بإنشاء مكونات JavaFX إضافية والتي توفر وظائف مطلوبة عادة مفقودة من JavaFX.
  • يمكّنك مشروع JavaFXPorts من حزم تطبيق JavaFX للنشر على نظامي iOS و Android.
  • يجب عليك وضع إشارة مرجعية على المراجع الرسمية لـ JavaFX ، على وجه الخصوص ، دليل JavaFX الخاص بـ Oracle ووثائق API.
  • بعض الكتب التي تمت مراجعتها بشكل جيد على JavaFX تتضمن Pro JavaFX 8 وJavaFX 8 - مقدمة حسب المثال واهتمام خاص لمطوري الألعاب ، بدء تطوير ألعاب جافا 8.

خاتمة

في هذا البرنامج التعليمي ، تعرفت على فئات JavaFX المفيدة في برمجة الألعاب. لقد عملنا من خلال سلسلة من الأمثلة على زيادة التعقيد ، وبلغت ذروتها في لعبة على غرار جمع sprite. أنت الآن على استعداد للتحقيق في بعض الموارد المذكورة أعلاه ، أو للتعمق في بدء اللعبة الخاصة بك والبدء في ذلك. حظا سعيدا في مساعيك!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.