مرحبا بالجميع!
نستمر في مشاركتك أشياء مثيرة للاهتمام تم العثور عليها حول الثعبان الصغير. قررنا اليوم التعامل مع ألعاب ثنائية الأبعاد. هذا ، بالطبع ، أبسط قليلاً مما لدينا في دورة
مطور Python ، ولكن من المؤكد أنه ليس أقل إثارة للاهتمام.
نقلالمقال الأصلي - opensource.com/article/18/4/easy-2d-game-creation-python-and-arcade
بقلم بول فنسنت كرافندعنا نذهب.
Python هي لغة رائعة للمبتدئين لتعلم البرمجة. كما أنها مثالية لأولئك الذين يرغبون في "مجرد القيام والقيام" بدلاً من قضاء الكثير من الوقت على الكود المتداول.
Arcade هي مكتبة Python لإنشاء ألعاب ثنائية الأبعاد ، مع حد دخول منخفض ، ولكنها وظيفية للغاية في أيدي ذوي خبرة. في هذه المقالة ، سأشرح كيفية بدء استخدام Python و Arcade لبرمجة الألعاب.
لقد بدأت في التطوير على Arcade بعد تدريس أساسيات مكتبة
PyGame للطلاب. لقد قمت بتدريس PyGames شخصيًا لمدة 10 سنوات تقريبًا ، وقمت أيضًا بتطوير
ProgramArcadeGames.com للتعلم عبر الإنترنت. PyGames رائع ، لكنني أدركت في وقت ما أنني قد سئمت من إضاعة الوقت في تبرير الأخطاء
التي لن تصلح أبدًا .
كنت قلقة بشأن تدريس أشياء مثل
حلقة الحدث ، والتي لم يتم استخدامها تقريبًا. وكان هناك
قسم كامل شرحت فيه لماذا يتم تدوير الإحداثيات ص في الاتجاه المعاكس. نادرًا ما تم تحديث PyGames واستندت إلى مكتبة
SDL 1 القديمة ، بدلاً من شيء أكثر حداثة مثل
OpenGL . لم أعتمد على مستقبل مشرق.
في أحلامي ، كانت هناك مكتبة بسيطة وقوية تستخدم ميزات جديدة من Python 3 ، على سبيل المثال ، الديكورات وإشارات تلميح. اتضح أنها أركيد. دعونا نرى كيفية البدء في استخدامه.

التثبيت
Arcade ، مثل العديد من الحزم الأخرى ، متاح على
PyPi ، مما يعني أنه يمكنك تثبيت Arcade باستخدام الأمر pip (أو
pipenv ). إذا تم تثبيت Python بالفعل ، فعلى الأرجح يمكنك فقط فتح موجه أوامر Windows والكتابة:
pip install arcade
وعلى لينوكس وماك:
pip3 install arcade
للحصول على تعليمات التثبيت الأكثر تفصيلاً ، اقرأ
وثائق تثبيت Arcade.
رسم بسيط
يمكنك فتح النافذة ورسم رسم بسيط مع بضعة أسطر من التعليمات البرمجية. كمثال ، لنرسم مبتسمًا ، كما في الصورة أدناه:

يوضح البرنامج النصي أدناه كيفية القيام بذلك باستخدام
أوامر رسم Arcade. لاحظ أنه ليس عليك معرفة كيفية استخدام الفئات أو تعريف الوظائف. تعد البرمجة بملاحظات مرئية سريعة بداية جيدة لأولئك الذين يتعلمون فقط.
import arcade
استخدام الوظائف
بالطبع ، كتابة التعليمات البرمجية في سياق عالمي ليست أفضل طريقة. لحسن الحظ ، سيساعد استخدام الوظائف على تحسين التعليمات البرمجية. فيما يلي مثال على كيفية رسم شجرة في الإحداثيات المعينة (س ، ص) باستخدام الوظيفة:
def draw_pine_tree(x, y): """ """
للحصول على مثال كامل ، انظر
الرسم بالوظائف .

يعرف المبرمجون الأكثر خبرة أن البرامج الحديثة تقوم أولاً بتحميل المعلومات الرسومية على بطاقة الفيديو ، ثم تطلب منها رسم ملف دفعي.
Arcade مدعوم ، الرسم الفردي لـ 10000 مستطيل يستغرق 0.8 ثانية. سيستغرق سحب نفس المبلغ باستخدام ملف دفعي أقل من 0.001 ثانية.
فئة النافذة
عادة ما تعتمد البرامج الكبيرة على فئة
Window أو تستخدم
الديكور . يسمح هذا للمبرمج بكتابة تعليمات برمجية تتحكم في عرض مدخلات المستخدم وتحديثها ومعالجتها. فيما يلي نموذج لبرنامج يستند إلى Window.
import arcade SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 class MyGame(arcade.Window): """ . """ 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. لديها طرق تجعل من السهل رسم وتحريك وتحريك النقوش المتحركة. يمكنك أيضًا استخدام النقوش المتحركة لتتبع التصادمات بين الكائنات.
إنشاء العفريت
من السهل جدًا إنشاء مثيل Arcite
Sprite . يحتاج المبرمج فقط إلى اسم ملف الصورة الذي سيستند إليه العفريت ، واختيارًا ، عدد المرات لتكبير الصورة أو تصغيرها. على سبيل المثال:
SPRITE_SCALING_COIN = 0.2 coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)
ينشئ هذا الرمز نقشًا متحركًا باستخدام الصورة coin_01.png. سيتم تخفيض الصورة إلى 20٪ من الصورة الأصلية.
قائمة العفريت
يتم تنظيم العفاريت عادة في قوائم. أنها تساعد على تبسيط إدارتها. ستستخدم الرموز المتحركة في القائمة برنامج OpenGl لعرض دفعات المجموعة. يعمل الكود أدناه على إعداد اللعبة ، حيث يوجد لاعب والعديد من العملات المعدنية التي يجب على اللاعب جمعها. نستخدم قائمتين - واحدة للاعب والأخرى للعملات المعدنية.
def setup(self): """ . """
يمكننا بسهولة رسم جميع العملات المعدنية في قائمة العملات:
def on_draw(self): """ """ 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. ثم يتم إنشاء محرك فعلي في رمز التثبيت لفئة Window:
self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
يتلقى player_sprite متجهًا للحركة بسمتين هما change_x و change_y. حالة استخدام بسيطة هي تحريك لاعب باستخدام لوحة المفاتيح.
MOVEMENT_SPEED = 5 def on_key_press(self, key, modifiers): """ """ 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): """, """ 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: self.player_sprite.change_x = 0
على الرغم من حقيقة أن هذا الرمز يحدد سرعة اللاعب ، إلا أنه لا يتحرك. طريقة التحديث في فئة Window تستدعي physics_engine.update () ، والتي ستجعل اللاعب يتحرك ، ولكن ليس من خلال الجدران.
def update(self, delta_time): """ """ 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.تعلم من مثال
التعلم بالقدوة هو أحد أفضل الطرق. تحتوي مكتبة Arcade على قائمة كبيرة من
نماذج البرامج التي يمكنك التركيز عليها عند إنشاء لعبة. تكشف هذه الأمثلة عن مفاهيم الألعاب التي يطالب بها طلابي عبر الإنترنت وغير متصل لعدة سنوات.
تشغيل العروض التوضيحية مع تثبيت Arcade ليس بالأمر الصعب على الإطلاق. في بداية البرنامج لكل مثال ، يوجد تعليق مع أمر يجب إدخاله في سطر الأوامر لتشغيل هذا المثال. على سبيل المثال:
python -m arcade.examples.sprite_moving_platforms
النهاية
كما هو الحال دائمًا ، نحن في انتظار تعليقاتك وأسئلتك التي يمكنك تركها هنا أو الذهاب إلى
Stas في
يوم مفتوح .