كتابة لعبة على LWJGL

إنشاء لعبة على 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(); 

في هذه السطور:

  1. يضبط موضع العرض (في وسط الشاشة)
  2. يسمح بتغيير حجمه
  3. تم تمكين المزامنة الرأسية
  4. تعيين DisplayMode الذي يخزن أحجام الشاشة وبعض المعلمات الأخرى
  5. في السطر الأخير ، يتم إنشاء الشاشة وعرضها على الشاشة.

 static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } 

في وظيفة التحديث ، والتي يتم استدعاؤها في حلقة لا نهائية:

  1. تحقق من نافذة تغيير الحجم
  2. تحديث العرض
  3. في سطر Display.sync (60) ، تتم مزامنة الشاشة مع 60 هرتز (إذا كان لديك تردد مختلف لتحديثات الشاشة ، على سبيل المثال 59 ، 76 ، 120 ، 144 ، وما إلى ذلك ، قم بتعيين ترددك).
  4. إغلاق النافذة

لاحظ كيف ينتهي البرنامج عندما ينقر المستخدم على الصليب ، تصبح علامة إغلاق النافذة ، 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 على النحو التالي:

  1. قم بتشغيل الإضاءة الناعمة في التظليل
  2. قم بتشغيل القوام
  3. يقوم بتشغيل فحص العمق (بحيث تتداخل الأشياء القريبة مع الأشياء البعيدة)
  4. اضبط لون التنظيف

في الحلقة أثناء (الجري) ، قبل استدعاء وظيفة التحديث () ، أضف السطر

 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٪ من الإجابات الإيجابية ، فسأواصل كتابة سلسلة من المقالات.

Source: https://habr.com/ru/post/ar427979/


All Articles