كيفية برمجة ألعاب الكمبيوتر (بالصور)

جدول المحتويات:

كيفية برمجة ألعاب الكمبيوتر (بالصور)
كيفية برمجة ألعاب الكمبيوتر (بالصور)
Anonim

هل لديك فكرة عن لعبة كمبيوتر وتريد أن تجعلها حقيقة؟ أو هل تساءلت يومًا عن كيفية كتابة ألعاب الكمبيوتر؟ تعلمك مقالة ويكي هاو هذه كيفية كتابة ثلاث ألعاب كمبيوتر أساسية بلغة بايثون. ستحتاج إلى فهم أساسي لبايثون ومفاهيم البرمجة العامة لتطوير لعبتك الأولى.

خطوات

جزء 1 من 3: صنع لعبة نصية

5692759 1
5692759 1

الخطوة 1. اختر لغة البرمجة

تختلف جميع لغات البرمجة ، لذا سيتعين عليك تحديد اللغة التي ستستخدمها لكتابة لعبتك. تدعم كل لغة برمجة رئيسية إدخال النص وإخراج النص وإنشاءات if (الأشياء الرئيسية التي تحتاجها للعبة بسيطة تستند إلى النص) ، لذا استكشف الخيارات وحدد أيها تشعر بالراحة أكثر وتكرس للتعلم. فيما يلي بعض العوامل التي يجب مراعاتها:

  • ما هي اللغة المستخدمة في الغالب؟

    تم تصميم بعض لغات البرمجة ، مثل JavaScript ، لاستخدامها على الويب ، بينما تم تصميم لغات أخرى ، مثل Python أو C أو C ++ ، لتشغيل برامج الكمبيوتر. بالنسبة إلى لعبتك ، استهدف لغة ذات نطاق استخدام أوسع ، مثل Python أو C أو C ++ أو جافا سكريبت.

  • ما مدى صعوبة التعلم؟

    على الرغم من أن كتابة برنامج ما يجب أن يكون سهلاً بدرجة كافية بعد بعض التدريبات في أي لغة برمجة عادية (على سبيل المثال ، ليست لغة مصممة خصيصًا لتكون مربكة مثل Malbolge) ، فإن بعضها يكون أكثر ودية للمبتدئين من الآخرين. تتطلب Java و C ، على سبيل المثال ، فهم مفاهيم البرمجة الأكثر عمقًا من شيء مثل Python ، والتي تشتهر ببنائها الأكثر سهولة ويسهل الوصول إليها.

  • أين يمكنني استخدامه؟

    ربما تريد أن يتمكن الأشخاص الذين يعملون على أنظمة مختلفة ، مثل Linux أو Mac أو Windows ، من ممارسة لعبتك. لذلك يجب ألا تستخدم لغة مدعومة فقط على عدد قليل من الأنظمة ، مثل Visual Basic ، وهو مدعوم فقط على Windows.

ستستخدم هذه المقالة Python للحصول على أمثلة للعبة قائمة على النصوص ، ولكن يمكنك البحث عن كيفية تنفيذ المفاهيم في أي لغة برمجة أخرى.

5692759 2
5692759 2

الخطوة الثانية. جهز حاسوبك

المكونان الأساسيان اللذان ستحتاجهما هما محرر نصوص ، حيث ستكتب التعليمات البرمجية الخاصة بك ، والمترجم الذي ستستخدمه لتحويله إلى لعبة. إذا كنت تريد اتباع المثال الوارد في هذه المقالة ، فيجب عليك تثبيت Python ومعرفة كيفية تشغيل البرامج. إذا كنت ترغب في ذلك ، يمكنك إعداد IDE (بيئة سطح المكتب المتكاملة) ، والتي تجمع بين التحرير والترجمة وتصحيح الأخطاء في برنامج واحد. يُطلق على IDE في Python اسم IDLE. ولكن يمكنك أيضًا استخدام أي محرر نصوص يدعم النص العادي ، مثل Notepad لنظام التشغيل Windows أو TextEdit لنظام التشغيل macOS أو Vim لنظام التشغيل Linux.

5692759 3
5692759 3

الخطوة 3. اكتب بعض التعليمات البرمجية لتحية اللاعب

سيرغب المشغل في معرفة ما يجري وما يجب عليه فعله ، لذلك يجب عليك طباعة بعض النصوص له.

  • يتم ذلك باستخدام وظيفة print () في بايثون. لتجربته ، افتح ملفًا جديدًا بامتداد.py ، وأدخل الكود التالي فيه ، واحفظه وشغّله:

    اطبع ("مرحبًا بك في لعبة التخمين بالأرقام!") ، اطبع ("أدخل رقمًا صحيحًا بين 1 و 1000:")

5692759 4
5692759 4

الخطوة 4. قم بإنشاء رقم عشوائي

لنصنع لعبة نصية تطلب من اللاعب تخمين الرقم الصحيح. أول شيء يتعين علينا القيام به هو إنشاء رقم عشوائي في بداية اللعبة حتى لا يخمن اللاعب دائمًا نفس الرقم. نظرًا لأن الرقم سيظل كما هو طوال البرنامج ، فستحتاج إلى تخزين الرقم العشوائي في متغير.

  • لا تحتوي Python على وظيفة أرقام عشوائية مضمنة ، ولكنها تحتوي على مكتبة قياسية (وهذا يعني أن المستخدم لن يضطر إلى تثبيت أي شيء إضافي). لذا انتقل إلى بداية الكود الخاص بك (قبل وظائف print ()) واكتب سطر استيراد عشوائي.
  • استخدم وظيفة عشوائية. يطلق عليه randint () ، وهو موجود في المكتبة العشوائية التي قمت باستيرادها للتو ، ويأخذ القيمة الدنيا والقصوى التي يمكن أن يستخدمها الرقم كوسيطة. لذا ارجع إلى نهاية الكود وأدخل السطر التالي:

    rightNum = random.randint (0 ، 1000)

5692759 5
5692759 5

الخطوة 5. الحصول على مدخلات من المشغل

في اللعبة ، يريد اللاعب فعل شيء ما أو التفاعل مع شيء ما. في لعبة نصية ، هذا ممكن عن طريق إدخال نص. الآن بعد أن أصبح لدينا رقم عشوائي ، يجب أن تطلب الأسطر التالية من التعليمات البرمجية من اللاعب إدخال أفضل تخمين لديهم.

  • نظرًا لأن الرمز الذي أدخلته يطبع التعليمات لإدخال رقم إلى المشغل ، يجب أيضًا قراءة الرقم الذي يدخله. يتم ذلك باستخدام الإدخال () في Python 3 ، و raw_input () في Python 2. يجب أن تكتب في Python 3 ، حيث سيصبح Python 2 قديمًا قريبًا. أضف السطر التالي إلى التعليمات البرمجية الخاصة بك لتخزين مدخلات اللاعب في متغير يسمى الرقم:

    userNum = المدخلات ()

5692759 6
5692759 6

الخطوة 6. قم بتحويل مدخلات المشغل إلى نوع بيانات قابل للاستخدام

لقد أدخل اللاعب رقمًا - ماذا الآن؟

  • اجعل إدخال اللاعب رقمًا. الآن ، قد يبدو هذا محيرًا لأنهم أدخلوا للتو رقمًا. ولكن هناك سبب وجيه: تفترض بايثون أن كل المدخلات عبارة عن نص ، أو "سلسلة" ، كما يطلق عليها في البرمجة. يحتوي هذا النص على الرقم الذي تريد الحصول عليه. تحتوي لغة Python على وظيفة تقوم بتحويل سلسلة تحتوي فقط على رقم إلى رقم بداخلها. نوع:

    userNum = int (userNum)

5692759 7
5692759 7

الخطوة 7. قارن رقم اللاعب بالرقم الصحيح

بمجرد أن يُدخل اللاعب رقمه ، ستحتاج إلى مقارنته بالرقم الذي تم إنشاؤه عشوائيًا. إذا لم تكن الأرقام متطابقة ، يمكن أن تجعل لعبتك اللاعب يجرب رقمًا آخر. إذا كانت الأرقام متطابقة ، يمكنك إخبار اللاعب الذي خمّنه بشكل صحيح ، وإنهاء البرنامج. يتم ذلك باستخدام الكود التالي:

while userNum! = rightNum: userNum = int (input ())

5692759 8
5692759 8

الخطوة 8. قدم ملاحظات للاعب

أثناء قيامك بالفعل بمعالجة المدخلات الخاصة بهم ، لن يرى اللاعب هذا. ستحتاج بالفعل إلى طباعة النتائج على المشغل حتى يفهم ما يحدث.

  • بالتأكيد ، يمكنك فقط إخبار اللاعب ما إذا كان رقمه صحيحًا أم خاطئًا. ولكن مع هذا النهج ، قد يضطر اللاعب إلى التخمين 1000 مرة في أسوأ الحالات ، وهو أمر ممل للغاية.
  • لذا أخبر اللاعب ما إذا كان رقمه صغيرًا جدًا أم كبيرًا جدًا. سيؤدي ذلك إلى تقليل عدد التخمينات لديهم بشكل كبير. على سبيل المثال ، إذا خمن اللاعب 500 أولاً ، وأجابته اللعبة "كبير جدًا. حاول مرة أخرى" ، سيكون هناك 500 رقم محتمل فقط بدلاً من 1000. يتم ذلك باستخدام تركيبات if ، لذا استبدل الطباعة ("خطأ. حاول مرة أخرى. ") بواحد.
  • اعلم أن التحقق مما إذا كان الرقمان متماثلان يتم باستخدام == وليس مع =. = يعين القيمة اليمنى منه للمتغير الأيسر منه!
  • إذا كان userNum <rightNum: print ("صغير جدًا. حاول مرة أخرى:") إذا كان userNum> rightNum: print ("كبير جدًا. حاول مرة أخرى:")

5692759 9
5692759 9

الخطوة 9. اختبر الكود الخاص بك

بصفتك مبرمجًا ، يجب أن تتأكد من أن الكود الخاص بك يعمل قبل اعتباره منتهيًا.

  • عند البرمجة بلغة python ، تأكد من تصحيح المسافات البادئة. يجب أن يبدو الرمز الخاص بك على النحو التالي:

    استيراد الطباعة العشوائية ("مرحبًا بك في لعبة التخمين بالأرقام!") print ("أدخل عددًا صحيحًا بين 1 و 1000:") rightNum = random.randint (0 ، 1000) userNum = input () userNum = int (userNum) while userNum! = rightNum: if userNum <rightNum: print ("صغير جدًا. حاول مرة أخرى:") if userNum> rightNum: print ("كبير جدًا. حاول مرة أخرى:") userNum = int (input ()) print ("لقد خمنت بشكل صحيح.")

5692759 10
5692759 10

الخطوة 10. التحقق من صحة الإدخال

لا ينبغي أن يكون اللاعب قادرًا على كسر اللعبة بمجرد إدخال الشيء الخطأ. يعني "التحقق من صحة الإدخال" التأكد من أن اللاعب أدخل الشيء الصحيح قبل معالجته.

  • افتح اللعبة مرة أخرى وحاول إدخال أي شيء ليس رقمًا. ستخرج اللعبة بخطأ في القيمة. لتجنب ذلك ، يمكنك تنفيذ طريقة للتحقق مما إذا كان الإدخال رقمًا أم لا.
  • تحديد وظيفة. نظرًا لأن التحقق من صحة الإدخال طويل جدًا ، وعليك القيام بذلك عدة مرات ، يجب عليك تحديد وظيفة. لن يتطلب الأمر أي وسيطات وإرجاع رقم. أولاً ، اكتب def numInput (): في الجزء العلوي من الكود الخاص بك ، مباشرة أسفل الاستيراد العشوائي.
  • احصل على مدخلات اللاعب مرة واحدة. استخدم دالة input () وقم بتعيين النتيجة إلى المتغير inp.
  • عندما لا يكون إدخال اللاعب رقمًا ، اطلب منه إدخال رقم. للتحقق مما إذا كانت السلسلة عبارة عن رقم ، استخدم وظائف isdigit () ، والتي تسمح فقط برقم كامل ، لذلك لن تضطر إلى التحقق من ذلك بشكل منفصل.
  • إذا كان الإدخال رقمًا ، قم بتحويله من سلسلة إلى رقم وإرجاع النتيجة. استخدم الدالة int () لتحويل السلسلة إلى عدد صحيح. سيؤدي هذا إلى جعل التحويل في الكود الرئيسي غير ضروري ، ويجب عليك إزالته من هناك.
  • استبدل جميع المكالمات بالإدخال () في الكود الرئيسي بالمكالمات إلى numInput ().
  • سيبدو رمز دالة numInput () كما يلي:
  • def numInput (): inp = input () بينما ليس inp.isdigit (): print ("طُلب منك إدخال رقم صحيح! أدخل عددًا صحيحًا:") inp = input () return int (inp)

5692759 11
5692759 11

الخطوة 11. اختبر اللعبة مرة أخرى

أدخل الأشياء الخاطئة عن قصد لمعرفة ما يحدث ، ثم أصلح أي أخطاء عند ظهورها.

حاول إدخال بعض النصوص عندما يطلب منك البرنامج رقمًا. الآن ، بدلاً من الخروج برسالة خطأ ، سيطلب منك البرنامج رقمًا مرة أخرى

5692759 12
5692759 12

الخطوة 12. اقترح إعادة تشغيل اللعبة عندما تنتهي

بهذه الطريقة ، يمكن للاعب أن يلعب لعبتك لفترة أطول دون الحاجة إلى إعادة تشغيلها باستمرار.

  • ضع كل التعليمات البرمجية باستثناء الاستيراد وتعريف الوظيفة في حلقة while. عيّن True كشرط: سيكون هذا صحيحًا دائمًا ، لذا ستستمر الحلقة إلى الأبد.
  • اسأل اللاعب عما إذا كان يريد اللعب مرة أخرى بعد أن خمّن الرقم بشكل صحيح. استخدم وظيفة الطباعة ().
  • إذا أجابوا بـ "لا" ، تخلصوا من المظهر. إذا أجابوا على أي شيء آخر ، فتابع. يتم كسر الحلقة باستخدام تعليمة break.
  • انقل "مرحبًا بك في لعبة التخمين بالأرقام" خارج حلقة التكرار. ربما لا يرغب اللاعب في الترحيب به في كل مرة يلعب فيها اللعبة. حرك طباعة التعليمات ("مرحبًا بك في لعبة التخمين بالأرقام!" فوق بينما صحيح: ، لذلك ستتم طباعتها مرة واحدة فقط ، عندما يبدأ المستخدم اللعبة الأولى.
5692759 13
5692759 13

الخطوة 13. اختبر اللعبة

ستحتاج إلى اختبار لعبتك في كل مرة تقوم فيها بتنفيذ ميزة جديدة.

  • تأكد من الإجابة بـ "نعم" و "لا" مرة واحدة على الأقل للتأكد من أن كلا الخيارين يعملان. إليك ما يجب أن تبدو عليه التعليمات البرمجية الخاصة بك:

    استيراد رقم تعريف عشوائي numInput (): inp = إدخال () بينما ليس inp.isdigit (): طباعة ("طُلب منك إدخال رقم صحيح! أدخل رقمًا صحيحًا:") inp = إدخال () عودة int (inp) طباعة ("مرحبًا بك في لعبة التخمين بالأرقام!") بينما صحيح: طباعة ("أدخل عددًا صحيحًا بين 1 و 1000:") rightNum = random.randint (0 ، 1000) userNum = numInput () بينما userNum! = rightNum: if userNum <rightNum: print ("صغير جدًا. حاول مرة أخرى:") إذا كان userNum> rightNum: print ("كبير جدًا. حاول مرة أخرى:") userNum = numInput () print ("خمنت بشكل صحيح.") print ("Do you هل تريد اللعب مرة أخرى؟ أدخل لا للإنهاء. ") إذا كان الإدخال () ==" لا ": فاصل

5692759 14
5692759 14

الخطوة 14. اكتب ألعابًا نصية أخرى

ماذا عن كتابة مغامرة نصية بعد ذلك؟ أو لعبة مسابقة؟ كن مبدعا.

نصيحة: من المفيد أحيانًا البحث في الوثائق إذا لم تكن متأكدًا من كيفية عمل شيء ما أو كيفية استخدام الوظيفة. توجد وثائق Python 3 على https://docs.python.org/3/. أحيانًا يؤدي البحث عن كل ما تريد القيام به على الإنترنت إلى نتائج جيدة.

جزء 2 من 3: صنع لعبة برسومات ثنائية الأبعاد

5692759 15
5692759 15

الخطوة 1. اختر مكتبة رسومات

يعد إنشاء الرسومات أمرًا معقدًا للغاية ، وتوفر معظم لغات البرمجة (بما في ذلك Python و C ++ و C و JavaScript) دعمًا ضئيلًا أو معدومًا للرسومات في المركز أو المكتبات القياسية. لذلك سيتعين عليك استخدام مكتبة خارجية لتتمكن من عمل رسومات ، على سبيل المثال Pygame for Python.

حتى مع وجود مكتبة رسومات ، يجب أن تقلق بشأن أشياء مثل كيفية عرض قائمة ، وكيفية التحقق مما نقر عليه المشغل ، وكيفية عرض المربعات ، وما إلى ذلك. إذا كنت تفضل التركيز على تطوير اللعبة الفعلية ، فيمكنك استخدام مكتبة محرك ألعاب مثل Unity ، والتي تنفذ هذه الأشياء بسهولة

ستستخدم هذه المقالة Python مع Cocos2D لإظهار كيفية إنشاء منصة ثنائية الأبعاد بسيطة. قد لا توجد بعض المفاهيم المذكورة في محركات الألعاب الأخرى. الرجوع إلى وثائقهم لمزيد من المعلومات.

5692759 16
5692759 16

الخطوة 2. قم بتثبيت مكتبة الرسومات التي اخترتها

من السهل تثبيت Cocos2D for Python. يمكنك الحصول عليه من https://python.cocos2d.org/index.html ، أو عن طريق تشغيل sudo pip3 install cocos2d إذا كنت تستخدم Linux.

5692759 17
5692759 17

الخطوة 3. قم بإنشاء دليل جديد للعبتك والوسائط الخاصة بك

ستستخدم أشياء مثل الصور والأصوات في لعبتك. احتفظ بهذه الأشياء في نفس دليل البرنامج. لا ينبغي أن يحتوي هذا الدليل على أي شيء آخر بحيث يمكنك بسهولة معرفة الأصول التي لديك في اللعبة.

5692759 18
5692759 18

الخطوة 4. قم بإنشاء ملف كود جديد في الدليل الجديد

أطلق عليه اسم main ، مع امتداد الملف للغة البرمجة الخاصة بك. إذا كتبت برنامجًا كبيرًا ومعقدًا حيث يكون من المنطقي أن يكون لديك ملفات برامج متعددة ، فسيظهر لك هذا الملف الرئيسي.

في هذا المثال ، سننشئ ملفًا يسمى main.py يحتوي على جميع التعليمات البرمجية الخاصة بنا

5692759 19
5692759 19

الخطوة 5. إنشاء نافذة اللعبة

هذا هو الشرط الأساسي للعبة ذات رسومات.

  • استيراد الوحدات الفرعية cocos2d اللازمة: cocos.director و cocos.scene و cocos.layer. يتم ذلك باستخدام من subModuleName import * ، حيث يكون اسم الوحدة النمطية الفرعية هو الوحدة الفرعية التي تريد استيرادها. الفرق بين … استيراد * واستيراد … هو أنك لست مضطرًا لوضع اسم الوحدة أمام كل ما تستخدمه من تلك الوحدة مع السابق.
  • حدد فئة فرعية MainMenuBgr من ColorLayer. هذا يعني بشكل أساسي أن أي خلفية قائمة رئيسية تقوم بإنشائها سوف تتصرف مثل طبقة لونية مع بعض التغييرات التي تجريها.
  • ابدأ مدير Cocos. هذا سوف يعطيك نافذة جديدة. إذا لم تقم بتعيين تسمية توضيحية ، فستحتوي النافذة على نفس التسمية التوضيحية لاسم الملف (main.py) ، والتي لن تبدو احترافية. السماح بتغيير حجم النافذة عن طريق تعيين تغيير حجمها إلى True.
  • تحديد وظيفة showMainMenu. يجب أن تضع الكود الخاص بإظهار القائمة الرئيسية في وظيفة لأن هذا سيسمح لك بالعودة بسهولة إلى القائمة الرئيسية عن طريق استدعاء الوظيفة مرة أخرى.
  • اصنع مشهدًا. يتكون المشهد من طبقة واحدة في الوقت الحالي ، وهي كائن من فئة MainMenuBgr التي حددتها.
  • قم بتشغيل هذا المشهد في النافذة.
  • من cocos.director import * من cocos.scene import * من cocos.layer import * class MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenu، self)._ init _ (0، 200، 255، 255) def showMainMenu (): menuSc = Scene (MainMenuBgr ()) المخرج.

5692759 20
5692759 20

الخطوة 6. أضف قائمة رئيسية إلى النافذة

إلى جانب اللعبة الفعلية ، ستحتاج إلى إضافة قائمة يمكن للاعب استخدامها لإغلاق النافذة ، من بين عناصر أخرى يمكنك إضافتها لاحقًا.

  • استيراد cocos.menu (مرة أخرى مع التعليمات من) و pyglet.app (هذه المرة مع الاستيراد).
  • حدد MainMenu كفئة فرعية من Menu.
  • اضبط محاذاة القائمة الرئيسية. يجب عليك ضبط المحاذاة الرأسية والأفقية بشكل منفصل.
  • قم بإنشاء قائمة بعناصر القائمة وإضافتها إلى القائمة. يجب أن يكون لديك عناصر القائمة "بدء اللعبة" و "إنهاء" على الأقل. يجب وضع كل عنصر من عناصر القائمة داخل الأقواس. يجب أن يكون لكل عنصر تسمية ووظيفة رد نداء تحدد ما يحدث عندما ينقر اللاعب عليه. بالنسبة لعنصر "بدء اللعبة" ، استخدم وظيفة بدء اللعبة (ستكتبها قريبًا) ، بالنسبة للعنصر "إنهاء" ، استخدم "pyglet.app.exit" (موجود بالفعل). قم بإنشاء القائمة الفعلية عن طريق استدعاء self.create_menu (menuItems).
  • حدد لعبة البداية (). فقط ضع التعريف في الوقت الحالي ، ستحل محله عندما تكتب اللعبة الفعلية.
  • انتقل إلى المكان في التعليمات البرمجية الخاصة بك حيث قمت بإنشاء مشهد menuSc ، وقم بإضافة كائن MainMenu إليه.
  • يجب أن تبدو الكود الخاص بك بالكامل الآن كما يلي:

    من cocos.director import * من cocos.menu import * من cocos.scene import * من cocos.layer import * import pyglet.app class MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenuBgr، self)._ init _ (0 ، 200، 255، 255) class MainMenu (Menu): def _init _ (self): super (MainMenu، self)._ init _ ("") self.menu_valign = CENTER self.menu_halign = CENTER menuItems = [(MenuItem ("Start Game) "، startGame))، (MenuItem (" Quit "، pyglet.app.exit))] self.create_menu (menuItems) def startGame (): pass def showMainMenu (): menuSc = Scene (MainMenuBgr ()) menuSc.add (MainMenu ()) Director.run (menuSc) manager.init (عنوان = "IcyPlat - منصة بسيطة" ، يمكن تغيير حجمها = صحيح) showMainMenu ()

5692759 21
5692759 21

الخطوة 7. اختبر الكود الخاص بك

اختبر الكود مبكرًا ، بينما لا يزال قصيرًا وبسيطًا نسبيًا. ثم يمكنك تحديد وتصحيح أي أخطاء في البنية الأساسية قبل أن تصبح الأمور معقدة للغاية.

يجب أن يفتح الرمز من التعليمات نافذة مكتوب عليها "IcyPlat - منصة بسيطة." الخلفية زرقاء فاتحة ويمكنك تغيير حجم النافذة. عند النقر فوق "بدء اللعبة" في القائمة ، لن يحدث شيء (حتى الآن). عند النقر فوق "إنهاء" ، سيتم إغلاق النافذة

5692759 22
5692759 22

الخطوة 8. إنشاء كائن

الكائن هو "كائن لعبة" ، أو صورة ثنائية الأبعاد. يمكن أن تكون العفاريت كائنات داخل اللعبة ، وأيقونات ، وزخارف خلفية ، وشخصيات ، وأي شيء آخر يمكنك تمثيله بصورة في اللعبة. سنبدأ بإنشاء كائن لشخصية يمكن للاعب التفاعل معها.

  • قم باستيراد الوحدة الفرعية cocos.sprite باستخدام التعبير from-import-expression.
  • ابحث عن صورة لتمثيل الكائن. لا يمكنك عرض كائن ما إذا لم يكن لديك صورة له. يمكنك رسم واحدة ، أو يمكنك الحصول على واحدة من الإنترنت (احترس من التراخيص ، إذا كنت تخطط لنشر لعبتك). في هذا المثال ، توجه إلى https://opengameart.org/content/tux-classic-hero-style واحفظ صورة-p.webp" />
  • قم بإنشاء طبقة ككائن جديد لفئة ScrollableLayer. ثم قم بإنشاء الكائن ككائن Sprite واضبط موضعه على (8 ، 250). كمرجع ، النقطة (0 ، 0) موجودة في الركن الأيسر السفلي. هذا مرتفع جدًا ، لكنه سيضمن عدم تعلق البطريق في الجليد.
  • أضف الكائن إلى طبقة الكائن.
  • قم بإنشاء مشهد جديد من طبقة الكائن وتشغيله.
  • def startGame (): figLayer = ScrollableLayer () fig = Sprite ('pingu.png') fig.position = (75، 100) figLayer.add (fig) # gameSc = Scene (figLayer) Director.run (gameSc)

  • قم بتشغيل الكود. يجب أن ترى شكل بطريق صغير (أو أيًا كان ما ترسمه) على خلفية سوداء بعد النقر بدء اللعبة.
5692759 23
5692759 23

الخطوة 9. حلم المناظر الطبيعية الخاصة بك

في معظم الألعاب ، يجب ألا تطفو النقوش المتحركة في الفراغ. يجب أن يقفوا على سطح ما ، مع وجود شيء حولهم. في الألعاب ثنائية الأبعاد ، يتم ذلك غالبًا باستخدام مجموعة مربعات وخريطة مربعة. تحدد مجموعة المربعات بشكل أساسي نوع المربعات السطحية ومربعات الخلفية الموجودة ، وكيف تبدو.

  • قم بإنشاء مجموعة البلاط.ستكون مجموعة البلاط لهذه اللعبة أساسية للغاية: قطعة واحدة للجليد وبلاط واحد للسماء. بلاط الجليد المستخدم في هذا المثال من هنا ، تحت CC-BY-SA 3.0.
  • إنشاء صورة مجموعة البلاط. هذه صورة لجميع المربعات ، والتي يجب أن تكون جميعها بنفس الحجم (قم بتحريرها إذا لم تكن كذلك) ولها الحجم الذي تريد رؤيته في اللعبة ، بجانب بعضها البعض. احفظ صورتك باسم icyTiles.png.
  • إنشاء وصف مجموعة البلاط. هذا ملف XML. يحتوي ملف XML على معلومات حول حجم المربعات في صورة مجموعة التجانب ، والصورة التي يجب استخدامها ، ومكان العثور على المربع الموجود هناك. قم بإنشاء ملف XML باسم icyTiles.xml بالرمز أدناه:

         
    
5692759 24
5692759 24

الخطوة 10. قم بعمل خريطة مربعة للمناظر الطبيعية الخاصة بك

خريطة المربعات هي خريطة تحدد أي المربع يكون عنده في أي موضع في مستواك. في المثال ، يجب عليك تحديد وظيفة لإنشاء خرائط التجانب لأن تصميم خرائط التجانب يدويًا أمر شاق للغاية. عادةً ما تحتوي اللعبة الأكثر تقدمًا على نوع من محرر المستوى ، ولكن للتعرف على تطوير اللعبة ثنائية الأبعاد ، يمكن أن توفر الخوارزمية مستويات جيدة بما فيه الكفاية.

  • اكتشف عدد الصفوف والأعمدة المطلوبة. لهذا ، قسّم حجم الشاشة على حجم البلاط أفقيًا (أعمدة) وعموديًا (صفوف). تقريب الرقم لأعلى ؛ أنت بحاجة إلى وظيفة من وحدة الرياضيات لذلك ، لذا أضف من سقف استيراد الرياضيات إلى الواردات في الجزء العلوي من التعليمات البرمجية الخاصة بك.
  • افتح ملفًا للكتابة. سيؤدي هذا إلى مسح كل المحتوى السابق للملف ، لذا اختر اسمًا لا يوجد به أي ملف في الدليل حتى الآن ، مثل levelMap.xml.
  • اكتب العلامات الافتتاحية في الملف.
  • قم بإنشاء خريطة تجانب وفقًا للخوارزمية. يمكنك استخدام واحد في الكود أدناه ، أو يمكنك ابتكار واحد بنفسك. تأكد من استيراد وظيفة randint من الوحدة بشكل عشوائي: فهي مطلوبة لكي يعمل الكود أدناه ، وأيًا كان ما توصلت إليه قد يحتاج أيضًا إلى أعداد صحيحة عشوائية. تأكد أيضًا من وضع بلاط السماء وبلاط الجليد في طبقات مختلفة: الجليد صلب ، والسماء ليست كذلك.
  • اكتب علامات الإغلاق في الملف وأغلق الملف.
  • def إنشاءTilemap (): colAmount = ceil (800/16) * 3 # (عرض الشاشة / حجم البلاط) * 3 rowAmount = ceil (600/16) # ارتفاع الشاشة / حجم البلاط ، file = open ("levelMap.xml"، " w ") tileFile.write ('\ n / n / n') iceHeight = randint (1 ، 10) لـ i في النطاق (0 ، colAmount): TileFile.write ('') makeHole = False if randint (0 ، 50) == 10 و i! = 0: # لا تسمح بالثغرات في نقطة البداية makeHole = True لـ j في النطاق (0 ، rowAmount): إذا makeHole: tileFile.write ('\ n') وإلا: إذا كانت j <= iceHeight: tileFile.write ('\ n') else: tileFile.write ('\ n') iceHeight = randint (iceHeight-5 ، iceHeight + 5) إذا كان iceHeight <0: # حد البلاط من الانزلاق إلى جليد منخفض جدًا الارتفاع = randint (1، 5) إذا كان iceHeight> rowAmount: # حد البلاط من الانتقال للجليد المرتفع جدًا الارتفاع = randint (int (rowAmount / 2) -5، int (rowAmount / 2) +5) tileFile.write ('\ n') ('\ n / n') بالنسبة إلى i في النطاق (0 ، colAmount): tileFile.write ('') لـ j في النطاق (0 ، rowAmount): tileFile.write ('\ n') tileFile.write ('\ n ') tileFile.write (' / n / n ') tileFile.close ()

5692759 25
5692759 25

الخطوة 11. اعرض خريطة المربعات

قم باستيراد كل شيء من cocos.tiles ثم انتقل إلى وظيفة startGame لذلك.

  • في بداية وظيفة startGame الخاصة بك ، قم بإنشاء خريطة تجانب باستخدام الوظيفة التي حددتها لذلك.
  • قم بإنشاء مدير تمرير جديد. افعل هذا مباشرة أسفل السطر حيث تضيف الكائن إلى طبقته.
  • قم بإنشاء طبقة جديدة تحتوي على المربعات ، والتي سيتم تحميلها من خريطة التجانب levelMap.xml التي أنشأتها وظيفة إنشاء الخريطة.
  • أضف الطبقة غير الصلبة والطبقة الصلبة وطبقة الرموز المتحركة إلى مدير التمرير ، بهذا الترتيب بالضبط. يمكنك إضافة موضع- z إذا كنت تريد.
  • بدلاً من إنشاء المشهد من طبقة الرموز المتحركة ، قم بإنشائه من مدير التمرير.
  • يجب أن تبدو وظيفة startGame الآن كما يلي:

    def startGame (): createTilemap () # fig = Sprite ('pingu.png') fig.position = (8، 500) figLayer = ScrollableLayer () figLayer.add (fig) # tileLayer = تحميل ('levelMap.xml') SolidTiles = بلاير بلاير ['صلب'] nsoliTiles = بلاير بلاير ['not_solid'] # scrMang = ScrollingManager () scrMang.add (nsoliTiles، z = -1) scrMang.add (SolidTiles، z = 0) scrMang.add (figLayer، z = 1) # gameSc = Scene (scrMang) Director.run (gameSc)

5692759 26
5692759 26

الخطوة 12. اختبر الكود الخاص بك

يجب عليك اختبار الكود الخاص بك كثيرًا للتأكد من أن الميزات الجديدة التي نفذتها تعمل حقًا.

يجب أن يُظهر الرمز الموجود في المثال الآن بعض المناظر الطبيعية الجليدية خلف البطريق. إذا كان البطريق يبدو وكأنه يحوم بعيدًا فوق الجليد ، فلن ترتكب أي خطأ ، وسيتم إصلاحه في الخطوة التالية

5692759 27
5692759 27

الخطوة 13. أضف عناصر التحكم

لدى اللاعب العديد من الطرق للتفاعل مع البرنامج في لعبة ثنائية الأبعاد أكثر من لعبة نصية. يتضمن أحد العناصر الشائعة تحريك الشكل عند الضغط على المفتاح الصحيح.

  • استيراد كل شيء من cocos.mapcolliders ومن cocos.actions. أيضا استيراد المفتاح من pyglet.window.
  • "أعلن" بعض المتغيرات العالمية. يتم تقاسم المتغيرات العالمية بين الوظائف. لا يمكنك بالفعل إعلان المتغيرات في Python ، لكن عليك أن تقول أن متغيرًا عالميًا موجود في الكود الرئيسي قبل استخدامه. يمكنك تعيين 0 كقيمة لأن الدالة ستهتم بتعيين القيمة الصحيحة لاحقًا. لذا أضف تحت عبارات الاستيراد:

    # "إعلان" لوحة المفاتيح المتغيرات العامة = 0 scrMang = 0

  • اضبط وظيفة بدء اللعبة:

    • لنفترض أنك تستخدم لوحة مفاتيح المتغيرات العامة و scrMang. قم بذلك عن طريق كتابة لوحة المفاتيح العامة ، scrMang في الجزء العلوي من الوظيفة.
    • اجعل النافذة تستمع إلى أحداث لوحة المفاتيح.
    • اطلب من الشكل أن يتصرف بناءً على PlatformerController. ستقوم بتنفيذ برنامج PlatformerController قريبًا.
    • قم بإنشاء مصادم خريطة للتعامل مع التصادمات بين المربعات الصلبة والشكل.

    def startGame (): لوحة المفاتيح العامة ، إنشاء scrMangTilemap () # fig = Sprite ('pingu.png') fig.position = (8، 250) figLayer = ScrollableLayer () figLayer.add (fig) # tileLayer = load ('levelMap.xml ') solidTiles = tileLayer [' solid '] nsoliTiles = tileLayer [' not_solid '] # keyboard = key. KeyStateHandler () manager.window.push_handlers (keyboard) # fig.do (PlatformerController ()) mapcollider = RectMapCollider (velocity_on_bump + 1) # gameSc = Scene (scrMang) Director.run (gameSc)

  • إنشاء وحدة تحكم منهاج. هذا هو ما سيحرك الرقم وفقًا لضغطات المفاتيح.

    • حدد وحدة التحكم في المنصة كفئة فرعية من الإجراء.
    • حدد سرعة الحركة وسرعة القفز والجاذبية.
    • حدد وظيفة البداية. تسمى هذه الوظيفة مرة واحدة ، عندما تكون وحدة التحكم في المنصة متصلة بالشكل. يجب أن يضبط سرعته على 0 في الاتجاهين x و y.
    • تحديد وظيفة الخطوة. سوف يتكرر أثناء تشغيل المشهد.
    • أخبر وظيفة الخطوة باستخدام لوحة مفاتيح المتغيرات العامة و scrMang.
    • احصل على السرعة وقم بتغييرها. احفظ السرعة x و y في متغيرات منفصلة. اضبط السرعة x على 1 أو -1 (اعتمادًا على ما إذا تم الضغط على المفتاح الأيسر أو الأيمن) مضروبًا في سرعة الحركة. أضف الجاذبية إلى السرعة y. ضاعفها في وقت التوقف حتى تعمل بنفس الطريقة على الأجهزة الأبطأ. إذا تم الضغط على مفتاح المسافة وكان الشكل واقفًا على الأرض ، فقفز عن طريق تغيير السرعة y إلى سرعة القفز.
    • احسب إلى حيث يجب أن يتحرك الشكل. ثم دع معالج التصادم يعدل هذا الموضع إذا كان داخل بلاطة صلبة. أخيرًا ، انقل الشكل إلى الوضع المعدل الجديد.
    • اضبط تركيز مدير التمرير على الشكل. يؤدي هذا إلى تحرك الكاميرا بطريقة معقولة عندما يتحرك الشكل.

    class PlatformerController (Action): global keyboard، scrMang on_ground = True MOVE_SPEED = 300 JUMP_SPEED = 500 GRAVITY = -1200 def start (self): self.target.velocity = (0، 0) def step (self، dt): global keyboard ، scroller إذا كانت dt> 0.1: # لا تفعل أي شيء أثناء التوقف للعودة الكبيرة vx ، vy = self.target.velocity vx = (keyboard [key. RIGHT] - keyboard [key. LEFT]) * self. MOVE_SPEED vy + = self. GRAVITY * dt if self.on_ground ولوحة المفاتيح [key. SPACE]: vy = self. JUMP_SPEED dx = vx * dt dy = vy * dt last = self.target.get_rect () new = last.copy () new.x + = dx new.y + = dy self.target.velocity = self.target.collision_handler (last، new، vx، vy) self.on_ground = (new.y == last.y) self.target.position = new.center scrMang.set_focus (* new.center)

5692759 28
5692759 28

الخطوة 14. اختبر الكود الخاص بك

إذا اتبعت هذا المثال ، فيجب أن تكون قادرًا الآن على تحريك البطريق باستخدام مفاتيح الأسهم والقفز عن طريق الضغط على مفتاح المسافة. أيضًا ، يجب أن يسقط البطريق الآن بدلاً من أن يحوم فوق الأرض.

5692759 29
5692759 29

الخطوة 15. قم بإنشاء نهاية للعبة

حتى الألعاب التي يمكن أن تستمر إلى ما لا نهاية يجب أن يكون لديها إمكانية الخسارة. نظرًا لأن المستوى الذي قمت بإنشائه في المثال بوظيفة ما قد انتهى ، فستحتاج أيضًا إلى تمكين الفوز من خلال الوصول إلى هذه النهاية. خلاف ذلك ، سوف يقفز اللاعب فقط على كتل الجليد هناك ، الأمر الذي قد يصبح مملًا.

  • داخل وحدة التحكم في المنصة ، بعد ضبط التركيز ، احصل على موضع الرقمين x و y. إذا كان الموضع y أقل من 0 ، فقم باستدعاء الوظيفة finishGame () (ستكتبها لاحقًا) باستخدام "Game Over" كوسيطة. إذا كان موضع x أكبر من حجم الشاشة مضروبًا في 3 (لقد قمت بتعيين ذلك على أنه حجم المستوى من قبل).

    posX، posY = self.target.position إذا كان posY <0: finishGame ("Game Over") يعود إذا posX> 800 * 3: # level size finishGame ("Level Completed") يعود

  • تحديد إنهاء الفصل الدراسي يجب أن يكون مثل فئة القائمة الرئيسية التي حددتها من قبل ، ولكن بدلاً من وجود سلسلة فارغة كعنوان ، يجب أن تستخدم نصًا متغيرًا تأخذ الوظيفة _init_ كوسيطة. يجب تسمية عناصر القائمة باسم "حاول مرة أخرى" و "إنهاء" الآن ، لكن الوظائف التي يسمونها تظل كما هي.

    class FinishMenu (Menu): def _init _ (self، text): super (FinishMenu، self)._ init _ (text) self.menu_valign = CENTER self.menu_halign = CENTER menuItems = [(MenuItem ("Try again"، startGame))، (MenuItem ("Quit"، pyglet.app.exit))] self.create_menu (menuItems)

  • تحديد وظيفة finishGame (). يجب أن يأخذ النص كحجة. يجب أن يجعل مشهدًا من خلفية القائمة الرئيسية ، قائمة FinishMenu مع تمرير وسيطة النص إلى هذه القائمة. ثم يجب أن يدير هذا المشهد.

    def finishGame (نص): menuSc = مشهد (MainMenuBgr ()) menuSc.add (FinishMenu (نص)) Director.run (menuSc)

5692759 30
5692759 30

الخطوة 16. أضف الاعتمادات

هذا هو المكان الذي تحصل فيه على الفضل في شفرتك الرائعة ، بالإضافة إلى منح الائتمان لأي شخص آخر ساعدك على طول الطريق. إذا استخدمت صورة من موقع ويب آخر (بإذن) ، فتأكد من نسب هذه الصورة إلى منشئها.

  • قم بإنشاء ملف CREDITS وأدخل جميع الاعتمادات الخاصة بك هناك ، مثل هذا:

    Penguin: Kelvin Shadewing ، تحت CC0 Ice block: Michał Banas digit1024 على opengameart.org بموجب CC-BY-SA 3.0

  • ارجع إلى كود Python واستورد التسمية من cocos.text.
  • تحديد فئة فرعية اعتمادات الطبقة. في وظيفة _init_ الخاصة به ، اقرأ ملف CREDITS وقم بعمل تسمية نصية في الموضع الصحيح من كل سطر فيه.

    اعتمادات الفئة (Layer): def _init _ (self): super (Credits، self)._ init _ () creditFile = open ("CREDITS"، "r") creds = creditFile.read () credits = credits.split ("\ n ") بالنسبة لـ i في النطاق (0 ، len (الاعتمادات)): CreditLabel = Label (الاعتمادات ، font_size = 32 ، anchor_x =" left "، anchor_y =" top ") credLabel.position = 25، 500- (i +1) * 40 self.add (CreditLabel)

  • انتقل إلى فئة القائمة الرئيسية الخاصة بك وأضف عنصر قائمة يسمى "Credits" الذي يستدعي وظيفة showCredits عند النقر فوقها.
  • تحديد فئة فرعية BackToMainMenuButton من القائمة. اجعل هذه قائمة تحتوي على عنصر واحد ، يسمى "رجوع" ، يستدعي وظيفة showMainMenu. يجب محاذاة هذه "القائمة" ، التي تشبه الزر إلى حد كبير ، رأسياً للأسفل وأفقياً إلى الأعلى.

    class BackToMainMenuButton (القائمة): def _init _ (self): super (BackToMainMenuButton ، self)._ init _ ("") self.menu_valign = BOTTOM self.menu_halign = LEFT menuItems = [(MenuItem ("Backu")] selfMen. create_menu (menuItems)

  • تحديد وظيفة showCredits. يجب أن يصنع مشهدًا من طبقة MainMenuBgr وطبقة Credits وتشغيل هذا المشهد.

    def showCredits (): credSc = Scene (MainMenuBgr ()) credSc.add (Credits ()) credSc.add (BackToMainMenuButton ()) Director.run (credSc)

5692759 31
5692759 31

الخطوة 17. تحقق من الرمز الخاص بك

عندما تعتقد أنك أنهيت التعليمات البرمجية الخاصة بك ، يجب عليك إعادة النظر فيها مرة أخرى. يمكن أن يساعدك هذا في ملاحظة ما إذا كان يمكن تحسين شيء ما ، أو ما إذا كان هناك بعض الأسطر غير الضرورية التي نسيت حذفها. إذا اتبعت المثال ، فيجب أن تبدو التعليمات البرمجية بالكامل الآن على النحو التالي:

    من cocos.director الاستيراد * من cocos.menu الاستيراد * من cocos.scene الاستيراد * من cocos.layer الاستيراد * من cocos.sprite * من cocos.tiles * من cocos.mapcolliders * من cocos.actions import * من cocos.text import Label استيراد pyglet.app من pyglet.window import key من math import ceil من عشوائي استيراد randint # "إعلان" المتغيرات العالمية keyboard = 0 scrMang = 0 class MainMenuBgr (ColorLayer): def _init _ (self): super (MainMenuBgr، self)._ init _ (0، 200، 255، 255) class MainMenu (Menu): def _init _ (self): super (MainMenu، self)._ init _ ("") self.menu_valign = CENTER self.menu_halign = CENTER menuItems = [(MenuItem ("Start Game"، startGame))، (MenuItem ("Credits"، showCredits))، (MenuItem ("Quit"، pyglet.app.exit))] self.create_menu (menuItems) class Credits (Layer): def _init _ (self): super (Credits، self)._ init _ () creditFile = open ("CREDITS"، "r") creds = creditFile.read () creds = credits.split ("\ n") لـ i في النطاق (0، len (Creds)): credLabel = Label (Creds ، font_size = 32، anchor_x = "left"، anchor_y = "top") credLabel.position = 25، 500- (i + 1) * 40 self.add (creditLabel) class BackToMainMenuButton (Menu): def _init _ (self): super (BackToMainMenuButton ، self)._ init _ ("") self.menu_valign = BOTTOM self.menu_halign = LEFT menuItems = [(MenuItem ("Back"، showMainMenu))] self.create_menu (menuItems) class _ defish_in (Menu) self، text): super (FinishMenu، self)._ init _ (text) self.menu_valign = CENTER self.menu_halign = CENTER menuItems = [(MenuItem ("Try again"، startGame))، (MenuItem ("Quit"، pyglet. app.exit))] self.create_menu (menuItems) class PlatformerController (Action): لوحة المفاتيح العامة ، scrMang on_ground = True MOVE_SPEED = 300 JUMP_SPEED = 500 GRAVITY = -1200 def start (self): self.target.velocity = (0، 0) def step (self، dt): لوحة المفاتيح العامة ، scroller إذا كانت dt> 0.1: # لا تفعل أي شيء بينما التوقف كبير جدًا ، vy = self.target.velocity vx = (لوحة المفاتيح [key. RIGHT] - لوحة المفاتيح [key. LEFT]) * self. MOVE_SPEED vy + = self. GRAVITY * dt if self.on _ground ولوحة المفاتيح [key. SPACE]: vy = self. JUMP_SPEED dx = vx * dt dy = vy * dt last = self.target.get_rect () new = last.copy () new.x + = dx new.y + = dy self.target.velocity = self.target.collision_handler (last، new، vx، vy) self.on_ground = (new.y == last.y) self.target.position = new.center scrMang.set_focus (* new.center) posX، posY = self.target.position إذا كان posY <0: finishGame ("Game Over") يُرجع إذا كان posX> 800 * 3: # level size finishGame ("Level Completed") عودة def finishGame (نص): menuSc = مشهد (MainMenuBgr ()) menuSc.add (FinishMenu (نص)) Director.run (menuSc) def showCredits (): credSc = Scene (MainMenuBgr ()) credSc.add (Credits ()) credSc.add (BackToMainMenuButton ()) Director.run (credSc) def إنشاء خريطةilemap (): colAmount = ceil (800/16) * 3 # (عرض الشاشة / حجم البلاط) * 3 rowAmount = ceil (600/16) # ارتفاع الشاشة / حجم البلاط البلاط الملف = مفتوح ("levelMap.xml"، "w") tileFile.write ('\ n / n / n') iceHeight = randint (1 ، 10) لـ i في النطاق (0 ، colAmount): tileFile.write ('') makeHole = خطأ إذا راند int (0، 50) == 10 and i! = 0: # لا تسمح بوجود ثقوب في نقطة ظهور نقطة الانطلاق: if j <= iceHeight: tileFile.write ('\ n') else: tileFile.write ('\ n') iceHeight = randint (iceHeight-5 ، iceHeight + 5) إذا كان iceHeight <0: # حد البلاط من الانتقال أيضًا انخفاض الجليد ') TilesFile.write (' / n / n ') لـ i في النطاق (0 ، colAmount): TileFile.write (' ') لـ j في النطاق (0 ، rowAmount): tileFile.write (' / n ') TileFile.write ('\ n') tileFile.write ('\ n / n') TileFile.close () def startGame (): لوحة المفاتيح العامة ، scrMang createTilemap () # fig = Sprite ('pingu.png') fig.position = (8، 250) figLayer = ScrollableLayer () figLayer.add (fig) # tileLayer = تحميل ('levelMap.xml') solidTiles = layerLayer ['solid'] nsoliTiles = tileLayer ['not_solid'] # keyboard = key. KeyStateHandler () manager.window.push_handlers (keybo ard) # fig.do (PlatformerController ()) mapcollider = RectMapCollider (velocity_on_bump = 'slide') إضافة (SolidTiles، z = 0) scrMang.add (figLayer، z = 1) # gameSc = Scene (scrMang) manager.run (gameSc) def showMainMenu (): menuSc = Scene (MainMenuBgr ()) menuSc.add (MainMenu ()) manager.run (menuSc) window = Director.init (caption = "IcyPlat - منصة بسيطة" ، يمكن تغيير حجمها = صحيح) showMainMenu ()

  • هذا إجمالي 168 سطرًا ، و 152 سطرًا إذا عدت الرمز فقط. هذا يجعل الأمر يبدو كثيرًا ، ولكن بالنسبة لمثل هذه اللعبة المعقدة ، هذا في الواقع مبلغ صغير.
5692759 32
5692759 32

الخطوة 18. انتهى

الآن اختبر اللعبة. عندما تقوم ببرمجة شيء ما ، عليك التحقق مما إذا كان يعمل كلما قمت بتنفيذ شيء جديد. أيضًا ، قد ترغب في لعب اللعبة التي كتبتها لبعض الوقت.

جزء 3 من 3: نشر لعبة

5692759 52
5692759 52

الخطوة 1. اكتب التبعيات

أي شخص يستخدم جهاز كمبيوتر آخر لن يكون لديه نفس البرامج والمكتبات المثبتة مثلك. لذلك ، ستحتاج إلى التأكد من أن كل شخص يقوم بتثبيت لعبتك يعرف بالضبط ما سيحتاجه لتشغيلها. لست مضطرًا إلى تدوين جميع التبعيات لجميع التبعيات وما إلى ذلك ، ولكن يجب عليك على الأقل كتابة تبعيات الحزم الخاصة بك وتبعياتها.

5692759 53
5692759 53

الخطوة الثانية: تأكد من حصولك على إذن لاستخدام جميع الوسائط

ينطبق هذا على جميع الرسومات ، بما في ذلك النماذج ثلاثية الأبعاد والموسيقى والحوار والموسيقى والمكتبات والأطر التي استخدمتها في لعبتك. أي شيء لم تكتبه بنفسك.

  • غالبًا ما تكون هناك بعض الشروط ، مثل الاضطرار إلى اعتماد المؤلف أو مشاركة تعديلات الوسائط بموجب نفس الترخيص. ستتمكن في بعض الأحيان من استخدام الرسومات دون إسناد منشئي المحتوى طالما أنك لا تتقاضى رسومًا مقابل اللعبة. إذا كان عليك أن تنسب الفضل إلى المؤلف ، فافعل ذلك في مكان مرئي جيدًا ، مثل علامة التبويب "الائتمانات" في لعبتك.
  • هناك أيضًا وسائط مطالبة بحقوق الطبع والنشر ولم يتم تحديد ترخيص ، مع بعض النصوص أحيانًا مثل "جميع الحقوق محفوظة".إذا كان الأمر كذلك ، فيجب أن تحصل على إذن صريح من المؤلف قبل تضمينه في لعبتك.
  • عادة ما يتم إصدار المكتبات بموجب تراخيص تسمح باستخدامها كمكتبة. استثناء ملحوظ هو GPL دون استثناء ربط: مثل هذا الترخيص يسمح فقط باستخدامه في برنامج مع تراخيص معينة. ويجب عليك دائمًا قراءة النقاط الأساسية للترخيص على الأقل للتأكد من أن كل ما تفعله بالوسائط أو المكتبة مسموح به.

تحذير: استخدام الوسائط أو المكتبات بطريقة لا يسمح بها الترخيص في لعبة تنشرها يمكن أن يوقعك في مشاكل قانونية خطيرة. لذلك إما أن تسأل المؤلف أو تتجنب قطعة الوسائط تمامًا إذا لم تكن متأكدًا مما إذا كان استخدامك مسموحًا به أم لا.

5692759 54
5692759 54

الخطوة 3. حدد الشروط التي تريد نشر اللعبة عليها

هل ستبيع لعبتك؟ هل تريد السماح للآخرين باستخدام صورك وأفكارك؟ بينما يتعين عليك توخي الحذر بشأن الوسائط التي تستخدمها في مشروعك ، يمكنك عادةً أن تقرر كيف تريد السماح للآخرين باستخدام لعبتك. يمكنك استخدام ترخيص Creative Commons CC0 لإصدار لعبتك في المجال العام.. للسماح بالتوزيع والتعديل في ظل بعض الشروط مع الاحتفاظ ببعض الحقوق ، جرب ترخيص Gnu General Public License (GPL) أو ترخيص Berkeley Software Distribution (BSD). أو يمكنك جعل برنامجك مملوكًا ، مما يعني أنه لا يُسمح لأي شخص بتوزيعه أو تعديله دون إذنك.

على الرغم من أنه من الممكن جني الأموال عن طريق بيع الألعاب ، فمن غير المرجح أن يشتري الناس لعبتك الأولى التي عادةً ما تحتوي على القليل من الميزات ولا شيء مميز. أيضًا ، إذا لم يعمل أحد البرامج المجانية ، فسيصاب الأشخاص الذين قاموا بتنزيله بخيبة أمل. ومع ذلك ، إذا دفعوا مقابل ذلك ، فسوف يطالبون باستعادة أموالهم ، مما يتسبب في المزيد من المشاكل لك وللمستخدمين. لذا ضع في اعتبارك إتاحة برامجك القليلة الأولى مجانًا

5692759 55
5692759 55

الخطوة 4. قرر كيف تريد نشر لعبتك

كل طريقة لها بعض المزايا والعيوب ، لذلك عليك أن تقرر بنفسك.

  • نشره على موقع على شبكة الإنترنت:

    إذا كان لديك موقع ويب ، فيمكنك تحميل لعبتك لجعلها متاحة للتنزيل. تأكد من تقديم إرشادات واضحة حول كيفية تثبيت البرنامج ، بالإضافة إلى جميع التبعيات المطلوبة. عيب ذلك هو أنه سيتعين على اللاعبين تثبيت التبعيات يدويًا ، الأمر الذي قد يكون صعبًا بالنسبة لبعض الأشخاص.

  • عمل حزمة لمدير الحزم:

    هناك مديرو حزم مختلفون ، مثل apt و Yum و Homebrew ، مما يسهل على الأشخاص تثبيت التطبيقات في البيئات المستندة إلى Linux و Linux. لديهم جميعًا تنسيقات حزم مختلفة. الشيء الجيد في الحزم هو أنها تقوم تلقائيًا بتثبيت جميع التبعيات (إذا قمت بتكوينها بشكل صحيح). لذلك يتعين على اللاعب فقط تثبيت الحزمة الخاصة بك ويمكنه بعد ذلك تشغيل اللعبة. تكمن المشكلة في وجود العديد من مديري الحزم المختلفين على منصات مختلفة ، لذلك سيتعين عليك بذل بعض العمل في توفير الحزم لجميع الحزم الأكثر شيوعًا.

5692759 56
5692759 56

الخطوة 5. وجّه الانتباه إلى برنامجك

ضع في اعتبارك تحميل برنامجك إلى مستودع حزم رئيسي ، مثل مستودعات Ubuntu و Debian ، للسماح بالتثبيت السهل. أيضًا ، انشر في المنتديات المناسبة ، مثل قسم المشاريع في GameDev أو جزء من tigSource. لكن لا تخيب أملك إذا لم تصبح ألعابك الأولى مشهورة. إذا كانت لديك فكرة يحبها الكثير من الأشخاص ، فيمكن أن تصبح لعبتك معروفة جيدًا.

نصائح

  • كن صبورًا ومستعدًا للتعلم. يمكن أن تكون البرمجة محبطة في بعض الأحيان!
  • إذا كنت تتساءل كيف يتم إجراء شيء ما في لعبة أخرى ، وكانت اللعبة مفتوحة المصدر ، يمكنك إلقاء نظرة على شفرة المصدر الخاصة بها.
  • عند البحث عن الوسائط ، حاول العثور على محتوى في المجال العام. ابحث عن صور وموسيقى "المشاع الإبداعي" أو "المجال العام" ، واستخدم مواقع الويب مثل https://opengameart.org أو
  • لا تنسخ أجزاء كبيرة من التعليمات البرمجية دون التحقق من الترخيص. غالبًا ما يكون محظورًا ، وإذا لم يكن كذلك ، فعادة ما يتطلب الإسناد.
  • لا ترسل رسائل غير مرغوب فيها أو تنشر في أماكن غير مناسبة عند الترويج للعبتك. من المحتمل أن يؤدي ذلك إلى منعك من الصفحة ، وهو أمر مزعج ببساطة وسيضر بسمعتك.

موصى به: