كيفية إنشاء لعبة ثنائية الأبعاد باستخدام Python ومكتبة للأروقة

مرحبا يا هبر! أقدم إليكم ترجمة المقال كيفية إنشاء لعبة ثنائية الأبعاد باستخدام 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 # Set constants for the screen size SCREEN_WIDTH = 600 SCREEN_HEIGHT = 600 # Open the window. Set the window title and dimensions (width and height) arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, "Drawing Example") # Set the background color to white. # For a list of named colors see: # http://arcade.academy/arcade.color.html # Colors can also be specified in (red, green, blue) format and # (red, green, blue, alpha) format. arcade.set_background_color( arcade.color.WHITE) # Start the render process. This must be done before any drawing commands. arcade.start_render() # Draw the face x = 300 y = 300 radius = 200 arcade.draw_circle_filled( x, y, radius, arcade.color.YELLOW) # Draw the right eye x = 370 y = 350 radius = 20 arcade.draw_circle_filled( x, y, radius, arcade.color.BLACK) # Draw the left eye x = 230 y = 350 radius = 20 arcade.draw_circle_filled( x, y, radius, arcade.color.BLACK) # Draw the smile x = 300 y = 280 width = 120 height = 100 start_angle = 190 end_angle = 350 arcade.draw_arc_outline( x, y, width, height, arcade.color.BLACK, start_angle, end_angle, 10) # Finish drawing and display the result arcade.finish_render() # Keep the window open until the user hits the 'close' button arcade.run() 

استخدام وظيفة


بطبيعة الحال ، كتابة التعليمات البرمجية في سياق عالمي ليست جيدة. لحسن الحظ ، أصبح تحسين البرنامج باستخدام الميزات أمرًا سهلاً. هنا يمكننا رؤية مثال على رسم الصنوبر في مكان محدد (س ، ص) باستخدام الوظيفة:


 def draw_pine_tree(x, y) : """ This function draws a pine tree at the specified location. """ # Draw the triangle on top of the trunk. # We need three x, y points for the triangle. arcade.draw_triangle_filled( x + 40, y, # Point 1 x, y - 100, # Point 2 x + 80, y - 100, # Point 3 arcade.color.DARK_GREEN) # Draw the trunk arcade.draw_lrtb_rectangle_filled( x + 30, x + 50, y - 100, y - 140 , arcade.color.DARK_BROWN) 

للحصول على مثال كامل ، انظر الرسم مع الوظائف .


صورة


سيعرف مبرمج أكثر خبرة أن برامج الرسومات الحديثة تقوم أولاً بتحميل المعلومات الرسومية على بطاقة الفيديو ، ثم اطلب من بطاقة الفيديو أن تسحبها لاحقًا كحزمة. الممرات كما يدعم هذا. يستغرق رسم 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) : # Set up your game here pass def on_draw(self) : """ Render the screen. """ arcade.start_render() # Your drawing code goes here def update(self, delta_time) : """ All the logic to move, and the game logic goes here. """ pass def main( ) : game = MyGame( SCREEN_WIDTH, SCREEN_HEIGHT) game.setup( ) arcade.run() if __name__ = = "__main__": main() 

تحتوي فئة 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. """ # Create the sprite lists self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() # Score self.score = 0 # Set up the player # Character image from kenney.nl self. player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER) self.player_sprite.center_x = 50 # Starting position self.player_sprite.center_y = 50 self.player_list.append(self.player_sprite) # Create the coins for i in range( COIN_COUNT): # Create the coin instance # Coin image from kenney.nl coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN) # Position the coin coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(SCREEN_HEIGHT) # Add the coin to the lists self.coin_list.append(coin) 

يمكننا بسهولة رسم جميع العملات المعدنية في قوائم العملات المعدنية:


 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): # Generate a list of all coin sprites that collided with the player. coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list) # Loop through each colliding sprite, remove it, and add to the score. for coin in coins_hit_list: coin.kill() self.score += 1 

للحصول على مثال كامل ، راجع 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 .


platformers


صورة


التحول إلى منهاج مع وجهة نظر بسيطة للغاية. يحتاج المبرمج فقط إلى تبديل محرك الفيزياء إلى 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 بدء برمجة الرسومات والألعاب برمز سهل الفهم. ابتكر العديد من المبرمجين الجدد ألعابًا رائعة بعد وقت قصير من البداية. جربه!

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


All Articles