مرحبا يا هبر! أقدم إليكم ترجمة المقال كيفية إنشاء لعبة ثنائية الأبعاد باستخدام Python ومكتبة Arcade بواسطة Paul Vincent Craven
كيفية إنشاء لعبة ثنائية الأبعاد باستخدام Python ومكتبة للأروقة
تعرّف على كيفية البدء باستخدام Arcade ، وهي مكتبة Python سهلة الاستخدام لإنشاء ألعاب فيديو ثنائية الأبعاد.

Phython هي لغة رائعة للأشخاص الذين يتعلمون البرمجة ، وهي مثالية لأولئك الذين يرغبون في "القيام بشيء ما" ولا يقضون الكثير من الوقت في كود boilerplate. Arcade هي مكتبة Python لإنشاء ألعاب فيديو ثنائية الأبعاد سهلة الاستخدام وفعالة للغاية عندما تكتسب الخبرة. في هذه المقالة ، سأشرح كيفية بدء استخدام Python و Arcade لبرمجة ألعاب الفيديو.
بدأت التطوير على Arcade بعد تدريس الطلاب باستخدام مكتبة PyGame . قمت بالتدريس شخصيًا باستخدام PyGame لمدة 10 أعوام تقريبًا ، وقمت بتطوير ProgramArcadeGames .com للتدريس عبر الإنترنت. PyGame رائع ، لكنني في النهاية شعرت بإضاعة الوقت في تغطية الأخطاء التي لم يتم إصلاحها أبدًا .
كنت قلقة بشأن تدريس أشياء مثل حلقة الحدث ، والتي لم تعد الطريقة التي نشفر بها. كان عندي قسم كامل شرح فيه سبب انعكاس إحداثيات Y. نظرًا لأن PyGame نادراً ما تم تحديثه ، وهو قائم على مكتبة SDL 1 القديمة ، وليس على شيء أكثر حداثة ، مثل OpenGL ، لم يكن لدي أمل كبير في المستقبل.
كنت أرغب في إنشاء مكتبة كانت أسهل في الاستخدام ، وأكثر قوة ، واستخدمت بعض ميزات Python 3 الجديدة ، مثل الديكور والنصائح. هذا هو الممرات. وإليك كيفية البدء.
تركيب
يتوفر Arcade ، مثل العديد من الحزم الأخرى ، من خلال PyPi ، مما يعني أنه يمكنك تثبيت Arcade باستخدام أمر pip (أو أمر pipenv). إذا كان لديك Python مثبتًا بالفعل ، فيمكنك على الأرجح فتح موجه الأوامر على Windows واكتب:
pip install arcade
أو على نظام MacOS و Linux:
pip3 install arcade
للحصول على مزيد من إرشادات التثبيت المفصلة ، يمكنك الرجوع إلى وثائق تثبيت Arcade .
رسم بسيط
يمكنك فتح النافذة وإنشاء رسومات بسيطة مع بضعة أسطر من التعليمات البرمجية. لنقم بإنشاء مثال يرسم الابتسامة ، كما هو موضح في الصورة أدناه:

تُظهر الخوارزمية أدناه كيف يمكنك استخدام أوامر رسم Arcade للقيام بذلك. لاحظ أنك لا تحتاج إلى معرفة كيفية استخدام الفئات أو حتى تحديد الوظائف. تعد البرمجة باستخدام الملاحظات المرئية السريعة أمرًا رائعًا لأولئك الذين يريدون بدء تعلم البرمجة.
import arcade
استخدام وظيفة
بطبيعة الحال ، كتابة التعليمات البرمجية في سياق عالمي ليست جيدة. لحسن الحظ ، أصبح تحسين البرنامج باستخدام الميزات أمرًا سهلاً. هنا يمكننا رؤية مثال على رسم الصنوبر في مكان محدد (س ، ص) باستخدام الوظيفة:
def draw_pine_tree(x, y) : """ This function draws a pine tree at the specified location. """
للحصول على مثال كامل ، انظر الرسم مع الوظائف .

سيعرف مبرمج أكثر خبرة أن برامج الرسومات الحديثة تقوم أولاً بتحميل المعلومات الرسومية على بطاقة الفيديو ، ثم اطلب من بطاقة الفيديو أن تسحبها لاحقًا كحزمة. الممرات كما يدعم هذا. يستغرق رسم 10000 مستطيل بشكل فردي حوالي 800 ثانية. يستغرق رسمها كحزمة أقل من 0.001 ثانية.
فئة النافذة
عادةً ما ترث البرامج الأكبر حجمًا من فئة Window أو تستخدم أدوات تزيين . يتيح هذا للمبرمج كتابة التعليمات البرمجية لمعالجة الرسم والتحديث ومعالجة إدخال المستخدم. فيما يلي نموذج تشغيل برنامج النافذة.
import arcade SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 class MyGame( arcade.Window): """ Main application class. """ def __init__(self, width, height) : super( ) .__init__(width, height) arcade.set_background_color( arcade.color.AMAZON) def setup( self) :
تحتوي فئة Window على عدة طرق يمكن لبرامجك تجاوزها لتوفير وظائف البرنامج. فيما يلي بعض من الأكثر استخدامًا:
on_draw: كل رمز رسم الشاشة يذهب هنا.
تحديث: جميع التعليمات البرمجية لنقل العناصر الخاصة بك وتنفيذ منطق اللعبة هنا. وهذا ما يسمى حوالي 60 مرة في الثانية الواحدة.
on_key_press: تعامل مع الأحداث عند الضغط على المفتاح ، على سبيل المثال ، أعط سرعة اللاعب.
on_key_release: العمليات عند تحرير المفتاح ، وهنا يمكنك إيقاف حركة اللاعب.
on_mouse_motion: يتم استدعاء كل مرة يتحرك فيها الماوس.
on_mouse_press: يسمى عند النقر فوق زر الماوس.
set_viewport: تستخدم هذه الوظيفة في التمرير عندما يكون عالمك أكبر بكثير مما يمكنك رؤيته على شاشة واحدة. مكالمة set_viewport تسمح للمبرمج بتعيين أي جزء من هذا العالم مرئي حاليًا.
العفاريت
Sprites هي طريقة سهلة لإنشاء كائن نقطي ثنائي الأبعاد في Arcade. يحتوي Arcade على طرق تجعل الرسم والحركة والتشكيلات المتحركة أسهل. يمكنك أيضًا استخدام العفاريت بسهولة لاكتشاف الاصطدامات بين الكائنات.
خلق العفريت
من السهل إنشاء مثيل لفئة Sprite Arcade من الرسومات. يحتاج المبرمج فقط إلى اسم ملف صورة لكي يكون العفاريت ، ورقمياً اختيارياً ، لتكبير الصورة لأعلى أو لأسفل. على سبيل المثال:
SPRITE_SCALING_COIN = 0,2 coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)
سيؤدي هذا الرمز إلى إنشاء نص برمجي باستخدام الصورة المخزنة في coin_01.png. سيتم تقليل الصورة إلى 20٪ من طولها الأصلي وعرضها.

العفاريت القوائم
وعادة ما يتم تنظيم العفاريت في القوائم. هذه القوائم تسهيل إدارة العفاريت. ستستخدم العفاريت الموجودة في القائمة برنامج OpenGL لدفعة العفاريت الرسمية كمجموعة. يضع الكود أدناه لعبة مع لاعب ومجموعة من العملات التي يجمعها اللاعب. نستخدم قائمتين ، واحدة للاعب والأخرى للقطع النقدية.
def setup(self): """ Set up the game and initialize the variables. """
يمكننا بسهولة رسم جميع العملات المعدنية في قوائم العملات المعدنية:
def on_draw(self): """ Draw everything """ arcade.start_render() self.coin_list.draw() self.player_list.draw()
العفريت كشف الاصطدام
العفريت كشف الاصطدام
تتيح لنا وظيفة check_for_collision_with_list أن نرى ما إذا كان العفاريت يلتقي بعفريت آخر في القائمة. يمكننا استخدام هذا لمعرفة جميع العملات التي يتصل بها عفريت اللاعب. باستخدام طريقة بسيطة للحلقة ، يمكننا التخلص من العملة المعدنية من اللعبة وزيادة نقاطنا.
def update(self, delta_time):
للحصول على مثال كامل ، راجع collect_coins.py .
لعبة الفيزياء
تشمل العديد من الألعاب نوعًا من الفيزياء. أبسطها هي برامج من أعلى إلى أسفل تمنع اللاعب من اختراق الجدران. تضيف المنصات مزيدًا من التعقيد إلى الجاذبية وتحريك المنصات. تستخدم بعض الألعاب محرك فيزياء ثنائي الأبعاد كامل الكتلة مع كتلة ، احتكاك ، نوابض ، وأكثر من ذلك.
أعلى لأسفل الألعاب

بالنسبة للألعاب البسيطة من أعلى إلى أسفل ، يحتاج برنامج arcade إلى قائمة من الجدران لا يمكن للاعب (أو أي شيء آخر) المرور من خلالها. عادة ما أسميها wall_list. ثم يتم إنشاء محرك الفيزياء في رمز التثبيت لفئة النافذة باستخدام:
self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
يتلقى Player_sprite ناقل حركة له سمتان: change_x و change_y. مثال بسيط على ذلك هو تحريك اللاعب باستخدام لوحة المفاتيح. على سبيل المثال ، قد يكون ذلك في فرع مخصص لفئة Window:
MOVEMENT_SPEED = 5 def on_key_press(self, key, modifiers) : """Called whenever a key is pressed. """ if key = = arcade.key.UP: self.player_sprite.change_y = MOVEMENT_SPEED elif key = = arcade.key.DOWN: self.player_sprite.change_y = -MOVEMENT_SPEED elif key = = arcade.key.LEFT: self.player_sprite.change_x = -MOVEMENT_SPEED elif key = = arcade.key.RIGHT: self.player_sprite.change_x = MOVEMENT_SPEED def on_key_release(self, key, modifiers) : """Called when the user releases a key. """ if key = = arcade.key.UP or key = = arcade.key.DOWN: self.player_sprite.change_y = 0 elif key = = arcade.key.LEFT or key = = arcade.key.RIGHT: selfplayer_sprite.change_x = 0
على الرغم من أن هذا الرمز يحدد سرعة المشغل ، إلا أنه لا يحرك المشغل. في طريقة تحديث فئة النافذة ، عند استدعاء Physics_engine.update () ، سينتقل اللاعب ، ولكن ليس عبر الجدران.
def update(self, delta_time): """ Movement and game logic """ self.physics_engine.update()
للحصول على مثال كامل ، راجع sprite_move_walls.py .

التحول إلى منهاج مع وجهة نظر بسيطة للغاية. يحتاج المبرمج فقط إلى تبديل محرك الفيزياء إلى PhysicsEnginePlatformer وإضافة ثابت الجاذبية.
self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite, self.wall_list, gravity_constant= GRAVITY)
يمكنك استخدام برنامج مثل Tiled لوضع البلاط / الكتل التي تشكل مستواك.
على سبيل المثال ، راجع sprite_tiled_map.py .
للفيزياء ثنائية الأبعاد الكاملة ، يمكنك دمج مكتبة PyMunk.
تعلم من مثال
مثال على ذلك أحد أفضل الطرق للتعلم. تحتوي مكتبة Arcade على قائمة طويلة من أمثلة البرامج التي يمكن للناس استخدامها لإنشاء ألعاب. يوضح كل مثال من هذه الأمثلة مفهوم اللعبة التي طلبها الطلاب في دروسي أو على الإنترنت عبر السنين.
من السهل تشغيل أي من هذه العروض التوضيحية بعد تثبيت Arcade. يحتوي كل من الأمثلة على تعليق في بداية البرنامج بأمر يمكنك إدخاله في سطر الأوامر لتشغيل المثال ، على سبيل المثال:
python -m arcade.examples.sprite_moving_platforms
معلومات موجزة
يتيح لك Arcade بدء برمجة الرسومات والألعاب برمز سهل الفهم. ابتكر العديد من المبرمجين الجدد ألعابًا رائعة بعد وقت قصير من البداية. جربه!