إنشاء لعبة على LWJGL # 1
كتابة اللعبة هي عملية معقدة ومثيرة للاهتمام تستغرق الكثير من الوقت. في سلسلة المقالات هذه ، سأوضح لك كيفية إنشاء لعبة جافا ثلاثية الأبعاد بسيطة باستخدام مكتبة LWJGL.
لإنشاء لعبتك ، تحتاج إلى ما يلي:
- القدرة على كتابة التعليمات البرمجية في Java (الحد الأدنى الضروري: فهم تشغيل الشروط ، الحلقات ، السلاسل ، المصفوفات ، الدوال ، الفئات)
- بيئة التطوير (سأستخدم Eclipse)
- مكتبة LWJGL
- بطاقة فيديو تدعم إصدار OpengGL لا تقل عن 3.3
- وقت الفراغ
- فكرة
من يهتم ، من فضلك ، تحت القطة.
الخطوة الأولى ، التحضير
كيفية تثبيت الكسوف .
قم بتنزيل
LWJGL 2.9.3 ، مكتبة رسومات ثلاثية الأبعاد ، قم
بإضافتها إلى مشروعك.
قم بتنزيل
slick-util ، وهي مكتبة تبسط تحميل القوام ، وأضفه إلى المشروع.
الخطوة الثانية ، تحقق
أولاً ، قم بإنشاء الفئة الرئيسية في الحزمة الرئيسية ، ضع التعليمات البرمجية التالية فيها:

إذا لم يتم تمييز السطر مع الإدخال باللون الأحمر ، فإن كل شيء على ما يرام (مظلل باللون الأصفر على الشاشة ، لأن هذه المكتبة لم يتم استخدامها بعد في الكود).
الخطوة الثالثة ، العرض
املأ الفصل الرئيسي بالرمز التالي:
رمز البدءimport org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; public class Main { static int width = 800, height = 600; static DisplayMode mainDisplayMode = new DisplayMode(width, height); static boolean running = true; static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } public static void main(String[] args) { try { Display.setLocation( (Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); } catch (LWJGLException ex) { System.err.println(ex.getStackTrace().toString()); Display.destroy(); System.exit(1); } while (running) { update(); } Display.destroy(); System.exit(0); } }
ما الذي يحدث هنا:
Display.setLocation( (Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create();
في هذه السطور:
- يضبط موضع العرض (في وسط الشاشة)
- يسمح بتغيير حجمه
- تم تمكين المزامنة الرأسية
- تعيين DisplayMode الذي يخزن أحجام الشاشة وبعض المعلمات الأخرى
- في السطر الأخير ، يتم إنشاء الشاشة وعرضها على الشاشة.
static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } }
في وظيفة التحديث ، والتي يتم استدعاؤها في حلقة لا نهائية:
- تحقق من نافذة تغيير الحجم
- تحديث العرض
- في سطر Display.sync (60) ، تتم مزامنة الشاشة مع 60 هرتز (إذا كان لديك تردد مختلف لتحديثات الشاشة ، على سبيل المثال 59 ، 76 ، 120 ، 144 ، وما إلى ذلك ، قم بتعيين ترددك).
- إغلاق النافذة
لاحظ كيف ينتهي البرنامج عندما ينقر المستخدم على الصليب ، تصبح علامة إغلاق النافذة ، Display.isCloseRequested () صحيحة ، ويصبح المتغير قيد التشغيل خاطئًا ، والتكرار التالي لن يتم تنفيذ حلقة (قيد التشغيل) وسيكون هناك انتقال إلى خطوط العرض .destroy () ، الذي يدمر العرض و System.exit (0) ، الذي ينهي نداء البرنامج.
الخطوة الرابعة ، OpenGL
لتهيئة OpenGL للوظيفة الرئيسية قبل حلقة (قيد التشغيل) ، تحتاج إلى إضافة الكود التالي:
if (!GLContext.getCapabilities().OpenGL33) { System.err.println(" OpenGL 3.3."); System.exit(0); }
يتحقق هذا الرمز من أن بطاقة الفيديو تدعم OpenGL 3.3 ، إذا كانت بطاقة الفيديو لا تدعم هذا الإصدار ، فحاول تحديث برنامج التشغيل أو التبديل إلى بطاقة فيديو أخرى (إذا كان لديك أكثر من بطاقة).
لذا ، يتم الفحص ، إذا كان كل شيء على ما يرام ، فإن بطاقة الفيديو تدعم OpenGL 3.3 ، ثم ننتقل. بعد رمز التحقق ، قبل الحلقة ، أضف الرمز التالي:
glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f);
سيقوم هذا الرمز بتكوين OpenGL على النحو التالي:
- قم بتشغيل الإضاءة الناعمة في التظليل
- قم بتشغيل القوام
- يقوم بتشغيل فحص العمق (بحيث تتداخل الأشياء القريبة مع الأشياء البعيدة)
- اضبط لون التنظيف
في الحلقة أثناء (الجري) ، قبل استدعاء وظيفة التحديث () ، أضف السطر
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
مما سيؤدي إلى مسح المخزن المؤقت للألوان ومخزن عمق عميق في كل مرة يتم تحديث الشاشة.
الرمز النهائي
انقر للعرض import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST; import static org.lwjgl.opengl.GL11.GL_SMOOTH; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.glClear; import static org.lwjgl.opengl.GL11.glClearColor; import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL11.glShadeModel; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GLContext; public class Main { static int width = 800, height = 600; static DisplayMode mainDisplayMode = new DisplayMode(width, height); static boolean running = true; static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } public static void main(String[] args) { try { Display.setLocation((Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); } catch (LWJGLException ex) { System.err.println(ex.getStackTrace().toString()); Display.destroy(); System.exit(1); } if (!GLContext.getCapabilities().OpenGL33) { System.err.println(" OpenGL 3.3."); System.exit(0); } glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f); while (running) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); update(); } Display.destroy(); System.exit(0); } }
بهذا نختتم المقالة الأولى حول كتابة لعبة على LWJGL ، إذا كان الاستطلاع يحتوي على أكثر من 50٪ من الإجابات الإيجابية ، فسأواصل كتابة سلسلة من المقالات.