كيفية إنشاء ألعاب للأندرويد. فشل لمدة عام ، أو خبرة في تطوير لعبة للأندرويد

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

فكرة

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

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

قائمة الميزات

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

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

ديزدوك

نظرًا لأنه يكاد يكون من المستحيل إنشاء لعبة جديدة بدون هذا المستند ، فسيتعين عليك العمل عليها أيضًا. Dizdok هو اختصار لـ "مستند التصميم" ، وهو يتضمن الأوصاف الأكثر تفصيلاً:

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

نموذج الكائن

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

يجب فهم الوظيفة على أنها:

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

النقاط الموضحة أعلاه اختيارية ، ويمكن تقليل عددها أو زيادتها لكل مجموعة فردية من الكيانات.

المواصفات الفنية

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

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

المحتوى

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

واجهه المستخدم

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

اختيار المحرك أو المُنشئ

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

يجب أن يتم اختيار المحرك بناءً على بعض ميزاته:

  • تعليمات الاستخدام.
  • الاحتمالات.
  • سعر.
  • دعم المطور.
  • توثيق.
  • حجم المجتمع.
  • بساطة.
  • التمدد.

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

الاحتمالات: يجب أن تغطي احتياجات المطور بالكامل. إذا كان المنتج يقدم أكثر مما يحتاج إليه ، فيمكن توسيع اللعبة بسهولة ويمكن استخدام ميزات جديدة لرسو التصميم. لكن فكر في التوازن أيضًا! يعد استخدام Unreal Engine لـ Tetris أمرًا غبيًا.

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

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

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

UDK

إن Unreal Development Kit ليس محرك اللعبة الأسهل للتعلم ، ولكنه أحد أقوى محركات الألعاب. لا يتم استخدامه فقط من قبل المطورين المبتدئين ، ولكن أيضًا من قبل الشركات الكبيرة. إذا كنت تبحث عن إجابة للسؤال: "كيف تصنع لعبة ثلاثية الأبعاد وأي محرك تختاره؟" - يجب عليك استكشاف إمكانيات UDK.


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

عزم الدوران 2D / 3D

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

يأتي المنشئ مع الوثائق التي تصف معظم الميزات. يمكنك العثور على الموقع الرسمي على برامج تعليمية ورموز مصدر للعديد من الألعاب الجاهزة.

لكتابة النصوص ، يحتوي Torque على لغة Torque Script مضمنة. يمكن تحديد خصائص كل كائن مسبقًا. أيضًا ، يحتوي المُنشئ على مجموعة Box2D المضمنة ، والتي تتعامل مع الحسابات المادية.


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

الدراسة

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

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

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

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

كيف تصنع لعبة للأندرويد؟











صنع لعبة لأي شخص نظام التشغيليفترض معرفة البرمجة. حتى أبسط الألعاب مثل Flappy Bird تحتاج إلى معرفة الأساسيات. لنلقِ نظرة على كيفية إنشاء لعبة باستخدام نظام التشغيل Android كمثال.

محرك

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

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

بيئة البرمجة

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

إنشاء المشروع

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

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

عدد المشاهدات: 13378

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

1) إنشاء طريقة اللعب وتطوير نموذج أولي

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

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

هذا ما سنقوم بصقله وتعديله وتحسينه.

2) شحذ اختبارات اللعب والبيتا

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

3) الواجهة والصوت والرسومات

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

جزء آخر مهم للغاية من اللعبة هو برنامج تعليمي بسيط ومباشر. إليك كيف طبقناها:

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

4) التسوق والسلع داخل اللعبة

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

سأقول أيضًا شيئًا عن سعر المتجر.
بعد عدة جولات ، يجب أن يكون اللاعب قادرًا بالفعل على شراء شيء ما ، ويجب أن يوضح بوضوح أنه يمكن بالفعل شراء شيء ما. ولكن يجب تسعير أغلى البضائع بحيث يتعين على اللاعب اللعب 20-30 مرة بنجاح كبير من أجل شرائها. هنا ، على سبيل المثال ، هي أسعار الديدان لدينا ، مع الأخذ في الاعتبار حقيقة أن اللاعب المتمرس يربح من 2000 إلى 6000 نقطة في كل جولة ، والمبتدئ من 300 إلى 1000 نقطة.

5) التسييل

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

6) تصميم الصفحة على Google Play

صفحة GP هي وجه لعبتك. يقرر الأشخاص تنزيل التطبيق أم لا.

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


  • ب) العنوان. قصير وجذاب. من المرغوب فيه من كلمتين تعبران عن جوهر اللعبة بالكامل. أطلقنا على برنامجنا Speedy Flyer. أصوات قصيرة وواضحة.

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


  • د) لافتة في أعلى الصفحة. جزء اختياري ولكن مرغوب فيه من وجه اللعبة. يمنح الشعار الجيد جوًا لصفحة على Google Play

  • هـ) فيديو. مقاطع الفيديو مثل لقطات الشاشة. يشاهدها الرجل ليرى طريقة اللعب. من الأفضل أن تصنع حسب الطلب ، لأن مقاطع الفيديو المصنوعة يدويًا تبدو مثيرة للشفقة.

  • و) التقديرات. سينظر المستخدم بالتأكيد إلى التصنيفات قبل تنزيل اللعبة. أنها تعتمد فقط على جودة التطبيق.

  • ز) الوصف. أجد أن الوصف هو الجزء غير المهم في الصفحة. تقريبا لا أحد يقرأها. ولكن إذا كنت لا تزال تريد الكتابة وصف جيد، اقرأ دان كينيدي ، على سبيل المثال كتابه "بيع الرسالة"

7) الملاحظات الأولى والتحديث الأول

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

  • أ) عوائق الدفع والدوران الجديدة التي ستزيد من ديناميكيات اللعبة

  • ب) قلل السرعة قليلاً ، لأن اللعبة تبدو سريعة جدًا للناس

  • ج) عادم قوس قزح على كامل الشاشة عند دخول الاعوجاج. سيضيف الجمال

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

  • ه) العديد من صفارات وهمية

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

8) الطبعة

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

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

لذلك لا تدفن أحلامك وتصنع ألعابًا رائعة.

ملاحظة .:
P.P.S.: من أجل أمنك ، أذكرك: إرسال رسائل حول الأخطاء النحوية بشكل شخصي ، وليس في التعليقات.

مرحبا ، Habrasosoobshchestvo!

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

خلفية
منذ بعض الوقت ، لمدة عامين ، كنت أطور ألعابًا لـ هاتف ويندوز... خلال هذا الوقت ، تم إطلاق 6 ألعاب ، تم دفع 2 منهم فقط + نسخة تجريبية وجلبوا بضعة دولارات فقط ، والباقي مجاني بدون إعلانات. لقد طورت ألعابًا لهذه المنصة ، نظرًا لوجود XNA + C # ، لقد أحببت حقًا هذه الحزمة ، ولكن بعد ذلك كانت هناك شائعات ، ثم حقيقة أن دعم XNA كان قد انتهى. بدأت في البحث عن محركات أخرى ، من بينها أحببت Unity أكثر. أقول على الفور أنني لا أريد الجدال حول استصواب استخدامه للألعاب الصغيرة ، فكل شيء يناسبني هنا ، حتى لو كان لدى المحركات الأخرى محرر ، C # ، متعدد المنصات ، إلخ. في تلك اللحظة دعم Windowsلم يكن الهاتف في الوحدة متاحًا بعد ، لكنه لم يزعجني لأنه لم أعد أرغب في التطوير لهذه المنصة ، على الأقل ليس بعد (كما قال أحد الأصدقاء ، لماذا تركب حصانًا ميتًا). بصراحة ، كانت ألعابي ضعيفة ، لكن الاختيار كان. تم إغلاق اشتراك مطور Windows Phone ، وبدأت مرحلة جديدة من الدراسات والبرامج التعليمية ، وفي الواقع ، بدأت تطوير اللعبة.
اختيار اللعبة ، ابدأ
كما تعلم ، لا يمكنك البدء بواحد معقد. لهذا السبب ، تم اختيار فكرة للعبة التجريبية ، والتي كنت قد بدأت بالفعل في تنفيذها لـ Windows Phone ، وهي لغز بأسلوب Pilot Brothers (لقطة شاشة) ، ولكن بميكانيكا مختلفة قليلاً. في لعبتي ، عندما أقوم بالنقر فوق كائن ، لا يتم تبديل الحالة للصف بأكمله والعمود بأكمله ، ولكن فقط للكائن المحدد وللكائنات المجاورة (أعلى ، أسفل ، يسار ، يمين). لعرض تأثير التبديل بصريًا ، تقرر استخدام التبديل أو الإشعال مباشرة ، وماذا يمكن أن يحترق؟ النجوم! لذلك ، تم اختيار اسم النجوم الساطعة بسرعة كافية. بدأ التطوير.

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

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

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

تم تنفيذ الانزلاق في شاشة اختيار المستوى. تم عرض جزء فقط من الرموز ذات المستويات على الشاشة (يعتمد حجم الجزء على حجم الشاشة) ، ويتم عرض الباقي عند التبديل باستخدام الزرين "الأيسر" و "الأيمن".

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

المستويات
في الإصدار الأول من اللعبة ، كنت أرغب في إنشاء 20 مستوى. حسنًا ، ستكون لعبة ممتعة. بناءً على نصيحة حكيمة ، تم توسيع هذا الرقم إلى 100 ~ (في الخطط). بالطبع ، لم أرغب في التوصل إلى المستويات بنفسي والتحقق مما إذا كانت قابلة للحل. أنا مبرمج فلماذا أسخر من نفسي! بعد فترة ، كان المولد جاهزًا ، والذي أنتج جميع التركيبات الممكنة من المستويات ذات الحجم المحدد ، ثم تحقق مما إذا كان المستوى قابلاً للحل ، وأخرجه إلى ملف نصي... كانت هذه أكبر مشكلتي في هذه اللعبة. إذا ، بحجم ملعب 4 * 4 ، تم قياس عدد المستويات بعشرات الآلاف ، ثم بالنسبة للحقل 5 * 5 كان هناك بالفعل الملايين ، للحقل 6 * 6 ... حسنًا ، ستحصل على فكرة. نعم ، أنا مبرمج ، يمكنني كتابة مولد ، يمكنني تعليمه حل المستويات ، لكن لا يمكنني تعليمه اختيار المستوى الجميل وسيدخل في اللعبة ، وأي واحد سيتم التخلص منه. لذلك ، يجب عرض كل هذه الملايين من المستويات واختيارها يدويًا. حتى أنني حاولت في البداية ، ولكن بعد ذلك اكتشفت حجم الحركة (وأردت أن أجعل الملعب يصل إلى حجم 10 * 10) وشعرت بالمرض.

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

مثال على إنشاء المستوى

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

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

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

نسخة قديمة من الرسومات

القائمة الرئيسية مع خيارين للزر. بالطبع ، بعد الأول ، بدا الثاني رائعًا! حتى تم عمل النسخة النهائية.



نافذة معلومات اللعبة


نافذة اختيار المستوى



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

رسومات نهائية

القائمة الرئيسية مع أزرار الإعدادات المفتوحة (حتى لا تشوش الشاشة ، يتم تصغيرها في البداية وفتحها من خلال النقر على زر الإعدادات)


نافذة معلومات اللعبة


نافذة اختيار المستوى


نافذة بمستوى أثناء اللعبة (أحد خيارات الخلفية ؛ هناك 3 منها ، تم اختيارها عشوائيًا)



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

الأيقونات

الاختيارات الأولية

الخيار النهائي

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

الأصوات والموسيقى
لا توجد مشاكل هنا. هناك العديد من الموارد التي يمكنك من خلالها شراء أصوات أو الحصول على أصوات مجانية. لأن لم تكن هناك ميزانية ، لقد اخترت العديد من الأصوات والألحان المناسبة التي تتيح لك هذه الموارد تنزيلها مجانًا ، أي كل شيء قانوني تمامًا وبدون سرقة (نعم ، هذا مهم بالنسبة لي).
كانت الفكرة الرئيسية هي خلق بيئة هادئة يمكن للاعب أن يفكر فيها مع موسيقى هادئة في الخلفية. لكن التحديث الأول للعبة غير الموقف - تمت إضافة المزيد من الموسيقى الإيقاعية مع القدرة على تحديد اللحن المطلوب (هادئ أو سريع) في الإعدادات.
الإصدار ، الترويج ، النتائج
لاحظ أنني كنت سأطلق اللعبة لنظام Android فقط. لدي هاتف مناسب ، ولكن لا توجد أجهزة iOS يمكنني اختبار اللعبة عليها ، ولا أرغب في إصدارها بدون اختبار حقيقي. والسبب هو أن التسجيل على Google Play عبارة عن دفعة لمرة واحدة قدرها 25 دولارًا ، بينما يتعين على Apple دفع 99 دولارًا كل عام. ربما سأطلق اللعبة لنظام iOS أيضًا ، لكن بعد ذلك بقليل.

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

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

اللعبة مجانية. تم اختيار عرض الإعلانات لتحقيق الدخل. أثناء عملية التطوير ، أردت توصيل عدة وحدات - إذا لم يكن من الممكن عرض واحدة ، اعرض الثانية ، إلخ. تم توصيل Chartboost المشهور أولاً ، ثم حاولت توصيل RevMob و PlayHaven ، لكن ظهرت بعض السقطات معهم (بصراحة ، لم يعملوا في اللعبة ، لم أعرف السبب) ، لذلك كان هناك واحد فقط الوحدة النمطية المتبقية ، والتي كان من المفترض أن يذهب كل الدخل منها ... لكن إذا أخذنا في الاعتبار ما سبق (عدد التنزيلات ورغبة المستخدمين في النقر فوق الإعلانات أو تثبيت الألعاب المُعلن عنها) ، فأنت تدرك أنه لا يوجد دخل.

الاستنتاجات
كما يقولون ، النتيجة السيئة هي أيضًا نتيجة. استغرق الأمر حوالي 14-15 شهرًا من بداية التطوير على Unity (لا أحسب الوقت على Windows Phone) حتى الإصدار. بطريقة ودية ، تتم كتابة هذه اللعبة في شهر من العمل بدوام جزئي ، وبعد ذلك يكون هذا بهامش. كان السبب هو ضيق الوقت. لا ، كان هناك وقت كافٍ - كانت بضع ساعات في المساء ، وبضع ساعات في عطلات نهاية الأسبوع كافية لمواصلة اللعبة دون توقف طويل. وافتقرت إلى الرفاه الأخلاقي. خلال هذه الفترة ، كان هناك الكثير من المشاكل الشخصية ، بينما كانت هناك رغبة في صنع لعبة ، كانت هناك أفكار ، لكن جلست على الكمبيوتر ، وحدقت في الشاشة بهدوء ، ثم أدركت أنه ليس لدي أي إلهام ، وأنني لم يستطع تنفيذ أي شيء على الإطلاق ، وأوقفه ... وهكذا حل هذا العام.

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

لكن ربما تكون هناك لحظات أكثر إيجابية. بادئ ذي بدء ، إنها تجربة! في هذه اللعبة ، درست الميزات الرئيسية للوحدة مع تحذير واحد - تم تطوير اللعبة على إصدار قديم ، حيث لم يكن 2d متاحًا بعد. الآن يمكن تطوير الألعاب ثنائية الأبعاد بهذا تكنولوجيا جديدة، لأن معظم التطورات التي أجريتها من اللعبة قد لا تكون مطلوبة بعد الآن.

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

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

العلامات: إضافة العلامات

تحياتي للجميع.
تمت كتابة هذا البرنامج التعليمي في مارس 2012. الآن قررت نشره في هذا المورد... قررت عدم تغيير الكود ، أطلب منك عدم العثور على خطأ فيه (كنت سأجد خطأ بنفسي). تم تحسين نص الدرس نفسه والتعليقات في الكود بشكل طفيف. الهدف من الدرس ليس تعليمك كيفية صنع الألعاب ، وهو أمر مستحيل في حد ذاته في درس واحد ، ولكن لإثبات أساسيات العمل باستخدام AIR المحمول. لماذا Android وليس iOS؟ لأنه في وقت كتابة الدرس ، كان فقط في متناول اليد. بالنسبة لنظام ios ، يتم كل شيء بالطريقة نفسها تقريبًا ، ولكن توجد بعض الاختلافات التي تمت كتابتها في نهاية الجزء الثاني من الدرس.
سأكون سعيدًا بأي تعليقات أو ملاحظات أو إشارة إلى الأخطاء.

قليلا من النظرية.

يسمح لك Adobe AIR بالإنشاء في ActionScript 3 و MXML لنظامي التشغيل iOS و تطبيقات الأندرويد، والتي لن يمكن تمييزها للمستخدم عن تلك الأصلية. يمكن توزيعها ، مثل أي تطبيقات أصلية ، عبر متاجر العلامات التجارية تطبيقات آبل AppStore و Google متجر Play (Android السابقسوق). تمت إضافة دعم Stage3D منذ AIR 3.2. لكي تعمل تطبيقات AIR على Android ، تحتاج إلى تثبيت AIR Runtime على الجهاز ، أو عند تجميعها في وقت التشغيل الأسير ، يتم تضمين وقت التشغيل في apk. في هذه الحالة ، لا يلزم تثبيت AIR Runtime على الجهاز.

عند العمل مع الأجهزة المحمولة ، يجب أن يؤخذ في الاعتبار أن دقة شاشاتها أقل (توجد بالفعل تلك التي تحتوي على شاشات أعلى) من تلك الخاصة بشاشات الكمبيوتر وأبعادها المادية أيضًا أصغر بكثير. هناك أيضًا مفاهيم مثل "حجم البكسل المادي" و "كثافة البكسل" ، لذلك عليك الانتباه إلى حجم العناصر الرسومية المختلفة (الأزرار وشخصيات اللعبة وما إلى ذلك). بشكل عام ، هذا علم كامل ولن نتناوله بالتفصيل.
طريقة الادخال - شاشة لمس... هناك TouchEvent خاص للتعامل مع الإدخال باللمس ، على الرغم من التعامل مع أحداث الماوس بشكل صحيح. هناك أيضًا ميزات أخرى سأتحدث عنها أثناء الدرس.
سنفعل جدا لعبة بسيطةلأجهزة الأندرويد. سيكون من الممكن تشغيله على الهواتف الذكية والأجهزة اللوحية وأي أجهزة أخرى.
يحتوي وقت تشغيل AIR على بعض متطلبات الأجهزة والبرامج.
بالنسبة لنظام التشغيل Android ، تبدو كالتالي:
- نسخة أندرويد 2.2 أو أعلى ؛
- معالج بهندسة ARM7 بتردد لا يقل عن 550 ميجا هرتز ؛
- 256 ميغا بايت على الأقل من ذاكرة الوصول العشوائي.

يمكن العثور على متطلبات الأنظمة الأساسية الأخرى هنا.

لإكمال الدرس نحتاج إلى ما يلي:
- برنامج FlashDevelop 4.2 ؛
- فليكس SDK 4.6 ؛
- AIR SDK 3.5 ؛
- مكتبة من غرينسك.
- جهاز أندرويد. يمكنك الحصول على المحاكي ، لكنه ليس ممتعًا ؛
- مثبتة على جهاز AIR Mobile.

يشار إلى الإصدارات على أنها محدثة وقت نشر الدرس. يوجد بالفعل Flex SDK 4.8 ، ولكنه في جوهره هو نفسه 4.6. وبدءًا من 4.8 ، بدأ FlashDevelop في استهلاك ذاكرة وصول عشوائي زائدة ، وليس من الواضح سبب ذلك. من الأفضل دائمًا استخدام احدث اصدار AIR SDK ، حيث تتم إضافة ميزات جديدة وإصلاحات للأخطاء مع كل إصدار. تحتاج فقط إلى فك ضغط AIR SDK في مجلد Flex SDK مع استبدال الملف وتوصيل Flex SDK بـ FlashDevelop.

ما الذي سنفعله بالضبط.

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

زوجان من لقطات الشاشة:

هيا بنا نبدأ.

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

قم بتشغيل FlashDevelop وإنشاء مشروع تطبيق AIR AS3 Mobile جديد. هكذا يبدو المشروع الذي تم إنشاؤه مثل:

ما نراه امامنا:

يحتوي مجلد الخفافيش على عدة ملفات ملفات دفعية:
- CreateCertificate.bat. إنشاء شهادةمطلوب لإنشاء شهادة موقعة ذاتيًا لنظام Android. بدون هذه الشهادة ، لن يكون من الممكن إنشاء apk ؛
- InstallAirRuntime.batيضبط وقت تشغيل AIR على جهاز Androidمن٪ FLEX_SDK٪ \ runtimes \ air \ android \ device \ runtime.apk. من الأفضل تثبيت أحدث إصدار بنفسك من أندرويد بلايمتجر؛
- Packager.batيحزم محرك أقراص فلاش USB في apk (android) أو ipa (ios) ؛
- SetupApplication.batيحتوي على معلمات تطبيق مختلفة (مسارات إلى الشهادات ، وكلمات مرور منها ، واسم التطبيق ، وما إلى ذلك) ؛
- SetupSDK.batيحتوي على المسار إلى FlexSDK. يتم تحديده تلقائيًا ، إذا لم يتم تحديده ، فأنت بحاجة إلى تسجيله يدويًا. ويحتوي أيضًا على مسار AndroidSDK. في الواقع ، هناك حاجة إلى ثلاثة ملفات فقط منه: adb.exe, AdbWinApi.dllو AdbWinUsbApi.dll... علاوة على ذلك ، فهي موجودة بالفعل في مجموعة توزيع FlashDevelop ويتم أيضًا تعيين المسار إليها تلقائيًا.

في المجلد سلة مهملاتيتم وضع ملف swf المترجم.
في المجلد سيرتيجب أن يكون هناك شهادات.
مجلد الرموزيحتوي على مجموعات الرموز.
مجلدين قياسيين ليبو srcللمكتبات والفصول ، على التوالي.

المجلد الجذر:
- معيار لتطبيقات AIR application.xmlمع معايير تطبيق مختلفة ؛
- PackageApp.batيسمح لك بتحديد النظام الأساسي ونوع تغليف التطبيق. بعد اختيار الحزم. يظهر مجلد حيمع apk أو ipa ؛
- Run.batيقوم بتحميل التطبيق إلى جهاز محمولويديرها هناك
- ملفين AIR_Android_readme.txtو AIR_iOS_readme.txtمع التعليمات.

اقامة المشروع.

فتح إعدادات المشروع مشروع / Propeties، قم بتغيير لون الخلفية إلى اللون الأسود. القرار لا يهم. سوف نتكيف مع الوضع الحالي.
قمنا بتعيين إصدار AIR على 3.5. نتيجة لذلك ، يجب أن تبدو المعلمات كما يلي:

فتح الملف application.xml، في السطر الثاني ، قم بتغيير إصدار AIR إلى 3.5:

فتح إعدادات AIR - خصائص تطبيق المشروع / AIR... في النافذة التي تفتح ، انتقل إلى علامة التبويب النافذة الأولية... في هذه النافذة ، حدد المنصات غير المجهزة بإطارات.
نحول وضع العرض إلى الوضع الرأسي. وقم بإيقاف تشغيل Auto Orient ، لأن اللعبة ستكون في الوضع الرأسي فقط. وضع العرض وحدة المعالجة المركزيةأو مباشر... يجب أن تبدو الإعدادات كما يلي:


بعد ذلك ، مباشرة في FlashDevelop ، انقر نقرًا مزدوجًا لفتح الملف Run.batوتغيير الخط اذهب إلى سطح المكتبتشغيل الانتقال إلى android-debug... هذا ضروري لاختبار المشروع على الجهاز. إذا غادرت اذهب إلى سطح المكتب، سيعمل المشروع على المحاكي.

الآن نحن بحاجة إلى إنشاء شهادة. بدونها ، لن تكون قادرًا على حزم التطبيق بتنسيق apk. إذا كان المجلد سيرتمفقود في المشروع ، قم بإنشائه يدويًا. هذا مهم ، لأن ملف bat لن يتمكن من الوصول إلى مجلد غير موجود. قم بتشغيل الملف بات / CreateCertificate.bat(انقر بزر الماوس الأيمن / تنفيذ) في المجلد سيرتتظهر شهادتنا بكلمة المرور القياسية "fd". تجدر الإشارة إلى أنه يجب توقيع أي تطبيق Android بشهادة. ما أنشأناه هو ما يسمى "شهادة التطوير". يكفي لنا في هذه المرحلة.

نقوم باستخراج الملف من الأرشيف من موقع greensock.com greensock.swc، ضعه في مجلد ليبوالاتصال بالمشروع (انقر بزر الماوس الأيمن / إضافة إلى المكتبة).

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

دعنا ننتقل إلى الكود.

والآن الشيء الأكثر أهمية وإثارة للاهتمام هو كتابة الكود. تبدو فصول اللعبة كما يلي:

نوع العنصر- أنواع العناصر. تلك التي تقع من أعلى الشاشة
ثوابت الحزمة (/ ** * ثابت ثابت لتحديد نوع كائن اللعبة. * *author illuzor * / public class ItemType (/ ** كائن عادي. يضيف واحدًا إلى النقاط * / public static const GOOD: String = "goodItem" ؛ / ** كائن "جيد جدًا". يضيف 5 نقاط * / public static const VERY_GOOD: String = "veryGoodItem"؛ / ** كائن "evil". يطرح واحدًا من النقاط * / public static const EVIL: String = "evilitem "؛))
نوع الشاشة- أنواع الشاشات. في المجموع ، لدينا ثلاثة منهم ، وقد تم وصفهم أعلاه.
ثوابت الحزمة (/ ** * الثوابت الثابتة لتحديد نوع الشاشة * *author illuzor * / public class ScreenType (/ ** main menu * / public static const MAIN_MENU: String = "mainMenu"؛ / ** شاشة اللعبة * / ثابت ثابت عام GAME_SCREEN: String = "gameScreen" ؛ / ** شاشة تعرض نتيجة اللعبة * / ثابت ثابت عام SCORE_SCREEN: String = "ScoreScreen" ؛))
حدث اللعبة- أحداث اللعبة
أحداث الحزمة (استيراد flash.events.Event ؛ / ** * أحداث اللعبة. * *author illuzor * / public class GameEvent توسع الحدث (/ ** الخروج من اللعبة إلى القائمة الرئيسية عبر زر القائمة * / public static const EXIT_GAME: String = "exitGame" ؛ / ** تم لعب اللعبة * / ثابت ثابت عام GAME_OVER: String = "gameOver" ؛ وظيفة عامة GameEvent (النوع: سلسلة ، فقاعات: منطقية = خطأ ، قابلة للإلغاء: منطقية = خطأ) (نوع ممتاز ، فقاعات ، قابلة للإلغاء) ؛) استنساخ وظيفة تجاوز عامة (): حدث (إرجاع GameEvent جديد (نوع ، فقاعات ، قابل للإلغاء) ؛) وظيفة تجاوز عامة إلىString (): سلسلة (إرجاع formatToString ("GameEvent" ، "type" ، "فقاعات "،" قابل للإلغاء "،" مرحلة الحدث ") ؛)))
الآن دعونا نلقي نظرة على الحزمة عناصر... هذه هي العناصر الرسومية المختلفة المستخدمة في اللعبة.

زرهي فئة الزر. يشمل صورة بيانيةوالنص. له حالتان: مضغوط / غير مضغوط
عناصر الحزمة (استيراد com.greensock.TweenLite ؛ استيراد flash.display.Bitmap ؛ استيراد flash.display.Sprite ؛ استيراد flash.events.Event ؛ استيراد flash.events.TouchEvent ؛ استيراد flash.text.TextField ؛ أدوات استيراد خرائط ؛ import tools.Tools؛ / ** * فئة الزر المستخدم في القائمة وفي أي مكان آخر. * *author illuzor * / public class Button يوسع Sprite (/ **private text ليتم عرضه على الزر * / private var text: String؛ / ** @ الصورة النقطية الخاصة لخلفية الزر * / private var buttonImage: Bitmap؛ / ** * يستمع المُنشئ للإضافة إلى الجزء الرئيسي. * هنا نحتاج إلى المرحلة في حالة وجود نقرة على الزر الزر وتحريك الإصبع بعيدًا عن الزر * * @ نص نص المعلمة لعرضه على الزر * / زر الوظيفة العامة (النص: سلسلة) (this.text = text ؛ addEventListener (Event.ADDED_TO_STAGE، addedToStage)؛) / ** *private أضف إلى المسرح. * أضف الرسومات وحقل نص الزر. * *param e أضف إلى حدث المشهد * / الوظيفة الخاصة addedToStage (e: Event): باطل (removeEventListener (Event.ADDED_TO_STAGE، addedToStage) ؛ buttonImage = Bitmaps.buttonBitmap ؛ // إضافة صورة نقطية buttonImage.smoothing = صحيح ؛ addChild (buttonImage) ؛ var textField: TextField = Tools.generateTextField (50 ، نص) ؛ // إنشاء حقل نصي ... textField.x = (buttonImage.width - textField.width) / 2 ؛ // ... ضعها وأضفها إلى displayList textField.y = (buttonImage.height - textField.height) / 2 ؛ addChild (حقل نصي) ؛ this.addEventListener (TouchEvent.TOUCH_BEGIN، touchBegin) ؛ // لمس الزر addEventListener (Event.REMOVED_FROM_STAGE، removeFromStage) ؛ // إزالة المستمع مع المرحلة) / ** * حرك ألفا بمقدار النصف * *param e حدث لمس الزر بإصبع * / وظيفة خاصة touchBegin (e: TouchEvent): باطل (TweenLite.to (buttonImage، .3، (alpha (e: TouchEvent): void (TweenLite.to (buttonImage، .3، (alpha: 1))؛ stage.removeEventListener (TouchEvent.TOUCH_END، touchEnd)) / ** * عند الإزالة من المسرح ، لم يعد القتل المستمعون المطلوبون * * @ param e إزالة الحدث من المشهد * / تمت إزالة الوظيفة الخاصةFromStage (e: Event): void (removeEventListener (Event.REMOVED_FROM_STAGE، removeFromStage)؛ this.removeEventListener (TouchEvent. TOUCH_BEGIN ، المس ابدأ) ؛ stage.removeEventListener (TouchEvent.TOUCH_END ، touchEnd))))
غرض- كائن يسقط من أعلى أثناء اللعبة. يمكن أن يكون هناك ثلاثة أنواع ، تم وصفها في الكود
عناصر الحزمة (استيراد الثوابت. يمتد العنصر الشكل (/ ** نوع العنصر من الثوابت .emType * / public var type: String؛ / ** سرعة حركة العنصر * / public var speed: uint؛ / ** * رسم العنصر مرسوم في المُنشئ. * *param type type of item * / public function Item (type: String) (this.type = type؛ switch (type) (// تحقق من النوع الذي يتم تمريره إلى المُنشئ // و ، بناءً على هذا ، ارسم الرسومات المقابلة. حالة ItemType.GOOD: // ارسم مربعًا أخضر this.graphics.beginFill (0x00A400) ؛ this.graphics.drawRect (0 ، 0 ، 14 ، 14) ؛ this.graphics.endFill () ؛ استراحة ؛ case ItemType.VERY_GOOD: // ارسم مربعًا أزرق مع توهج this.graphics. beginFill (0x01A6FE)؛ this.graphics.drawRect (0، 0، 14، 14)؛ this.graphics.endFill ()؛ this.filters = ؛ استراحة ؛ حالة ItemType.EVIL: // ارسم باللون الأحمر رسومات الدائرة رقم beginFill (0xFF0000) ؛ الرسومات.drawCircle (0 ، 0 ، 7) ؛ Graphics.endFill () ، استراحة؛ ))))
برنامج- "بطل الرواية" في اللعبة. منصة صغيرة يتحكم فيها اللاعب.
عناصر الحزمة (استيراد فلاش. مرشح. * فئة منفصلة بحيث يُنظر إلى النظام الأساسي على أنه وحدة ألعاب منفصلة. * *author illuzor * / public class Platform تمدد الشكل (public function Platform () (this.graphics.clear () ؛ this.graphics.beginFill ( 0xFFFFFF)؛ this. graphics.drawRect (0، 0، 110، 24)؛ this.graphics.endFill ()؛ this.filters =؛)))
حقيبة بلاستيكية أدواتبالأدوات.

فصل الصور النقطيةيحتوي على رسومات مرفقة وطرق الحصول عليه من الخارج
أدوات الحزمة (استيراد فلاش. ** @ ملف رسومات مرفق خاص للزر * / var ButtonBitmap الخاص: Class؛ / ** @ ملف رسومات خاص مرفق للشعار * / var LogoBitmap الخاص: Class ؛ / ** صورة نقطية للخلفية * / الحصول على وظيفة ثابتة عامة backgroundBitmap (): صورة نقطية (إرجاع صورة نقطية للخلفية الجديدة () كصورة نقطية ؛) / ** صورة نقطية للأزرار * / وظيفة ثابتة عامة الحصول على buttonBitmap (): صورة نقطية (إرجاع ButtonBitmap () الجديدة كصورة نقطية ؛) / ** الشعار النقطي * / ثابت عام وظيفة الحصول على logoBitmap (): صورة نقطية (إرجاع LogoBitmap () جديد كصورة نقطية ؛)))
فصل أدواتيحتوي على أدوات أخرى. حتى الآن ، فقط مولد textfield
أدوات الحزمة (استيراد flash.text.TextField؛ استيراد flash.text.TextFormat؛ / ** * فئة بأدوات صغيرة. * تحتوي حتى الآن فقط على منشئ حقل النص. * *author illuzor * / public class Tools (/ ** * مُنشئ Textfield بناءً على معلمات محددة * * حجم خط حجم الصفحة @ * نص نص Param لعرضه * @ لون نص لون Param * @ إرجاع حقل نص مخصص * / الوظيفة الثابتة العامة createTextField (الحجم: uint ، النص: String = "" ، اللون: uint = 0xFFFFFF): TextField (var textFormat: TextFormat = new TextFormat () ؛ textFormat.color = color ؛ textFormat.size = size ؛ var textField: TextField = new TextField () ؛ textField.selectable = false ؛ textField. defaultTextFormat = textFormat ؛ textField.text = text ؛ textField.width = textField.textWidth +4 ؛ textField.height = textField.textHeight +4 ؛ إرجاع textField ؛)))
شاشات التطبيق من العبوة شاشات

القائمة الرئيسية- القائمة الرئيسية للعبة. يُعرض مباشرة بعد بدء التشغيل. يحتوي على أزرار وخلفية وشعار.
شاشات الحزمة (استيراد flash.display.Bitmap ؛ استيراد flash.display.Sprite ؛ استيراد flash.events.Event ؛ استيراد فلاش. من اللعبة. * يتم عرض الخلفية والشعار وزرين هنا. * *Author illuzor * / public class MainMenu توسع Sprite (/ ** زر "PLAY" * / public var playButton: Button ؛ / ** "EXIT" button * / public var exitButton: Button ؛ / ** * في المُنشئ ، ما عليك سوى الاستماع إلى الإضافة إلى المرحلة * / الوظيفة العامة MainMenu () (addEventListener (Event.ADDED_TO_STAGE، adddedToStage)؛) / ** * إنشاء وإضافة خلفية وشعار وأزرار * *param e حدث إضافة إلى المشهد * / الوظيفة الخاصة adddedToStage (e: Event): void (removeEventListener (Event.ADDED_TO_STAGE، adddedToStage)؛ // أنشئ صورة نقطية للخلفية وأضفها إلى المشهد var background: Bitmap = Bitmaps.backgroundBitmap ؛ background.smoothing = true ؛ addChild (الخلفية) ؛ placeBackground (الخلفية) ؛ // وضع الخلفية // قم بإنشاء صورة نقطية للشعار ، واضبط الحجم بالنسبة لعرض المشهد // اضبط الموضع وأضف إلى مشهد var logo: Bitmap = Bitmaps.logoBitmap؛ logo.smoothing = صحيح ؛ logo.width = stage.stageWidth * .7 ؛ logo.scaleY = logo.scaleX ؛ logo.x = (stage.stageWidth - logo.width) / 2 ؛ logo.y = stage.stageHeight / 5 ؛ addChild (شعار) ؛ // حاوية للأزرار لتحديد موضع هذه الأزرار بشكل ملائم var أزرارContainer: Sprite = new Sprite ()؛ addChild (أزرار حاوية) ؛ // إنشاء زري "PLAY" و "EXIT" وتغيير حجمهما وإضافتهما إلى الحاوية playButton = new Button ("PLAY") ؛ أزرارContainer.addChild (زر التشغيل) ؛ playButton.width = stage.stageWidth / 2 ؛ playButton.scaleY = playButton.scaleX ، exitButton = زر جديد ("EXIT") ؛ أزرارContainer.addChild (exitButton) ؛ exitButton.y = أزرارContainer.height + 25 ؛ exitButton.width = stage.stageWidth / 2 ؛ exitButton.scaleY = exitButton.scaleX ؛ // وضع الحاوية مع الأزرار أزرارContainer.y = (stage.stageHeight - أزرارContainer.height) / 2 + stage.stageWidth / 6 ؛ ) / ** * تعمل هذه الوظيفة على جعل كائن DisplayObject الذي تم تمريره إليه يملأ المشهد بأكمله * دون تغيير نسبة العرض إلى الارتفاع. في حالتنا ، هذه هي صورة الخلفية * *param scaledObject DisplayObject لتلائم * / الوظيفة الخاصة placeBackground (scaledObject: DisplayObject): void (scaledObject.scaleX = scaledObject.scaleY = 1 ؛ مقياس var: Number ؛ if (scaledObject.width / scaledObject. height> stage.stageWidth / stage.stageHeight) (المقياس = stage.stageHeight / scaledObject.height ؛) else (scale = stage.stageWidth / scaledObject.width ؛) scaledObject.scaleX = scaledObject.scaleY = scale ؛ scaledObject. س = (stage.stageWidth - scaledObject.width) / 2 ؛ scaledObject.y = (stage.stageHeight - scaledObject.height) / 2 ؛)))
في الفصل شاشة الألعابهناك عملية لعبة. العناصر تتساقط من فوق. اعتمادًا على نوعه ، تحتاج إلى الإمساك به أو تجنبه. يتحكم في حلقة اللعبة
شاشات الحزمة (استيراد com.greensock.TweenLite ؛ استيراد الثوابت .emType ؛ استيراد العناصر ؛ الزر ؛ استيراد العناصر. النظام الأساسي ؛ استيراد العناصر ؛ العنصر ؛ استيراد الأحداث. GameEvent ؛ استيراد فلاش. flash.events.MouseEvent ؛ استيراد flash.events.TimerEvent ؛ استيراد flash.events.TouchEvent ؛ استيراد flash.text.TextField ؛ استيراد flash.utils.Timer ؛ استيراد أدوات ؛ أدوات ؛ / ** * الفئة الرئيسية للعبة. طريقة اللعب: * يوجد في الجزء السفلي من الشاشة منصة يمكن تحريكها يسارًا / يمينًا عن طريق تحريك إصبعك عبر الشاشة في أي جزء من الشاشة. * تقع العناصر المسماة من أعلى ، والتي يمكن أن تكون من ثلاثة أنواع: * - ItemType.GOOD - عنصر عادي. عند جمعه ، يضيف نقطة واحدة إلى النقاط ، عند تمريره (ترك الحد السفلي للشاشة) * يطرح واحدًا من النقاط * - ItemType.VERY_GOOD - عنصر "معزز". عند جمعه ، فإنه يضيف من 5 إلى نقاط. عند تمريرها ، لا يحدث شيء. * - ItemType.EVIL - عنصر "شرير". عند جمع حوالي يطرح واحد من النقاط. عندما يمر ، لا يحدث شيء. * * إذا كانت قيمة النقاط أقل من خمسة ، تحسب الخسارة ، وتكون نتيجة اللعبة هي أقصى عدد متراكم من النقاط. * مع كل مستوى جديد ، تتحرك العناصر بشكل أسرع من المستوى السابق. * * في أعلى اليسار يوجد مؤشر النقاط المسجلة ، وفي أعلى اليمين يوجد زر الخروج من القائمة الرئيسية. * يوجد أدناه في المركز أسفل المنصة مؤشر المستوى الحالي. * * *author illuzor * / public class GameScreen توسع Sprite (/ **private container for platform and items * / private var gameContainer: Sprite ؛ / ** @ زر خاص للخروج إلى القائمة الرئيسية * / private var menuButton: Button ؛ / ** @ منصة خاصة * / منصة var الخاصة: النظام الأساسي ؛ / ** @ مؤقت اللعبة الخاص. مطلوب لإضافة عنصر جديد * / private var gameTimer: Timer ؛ / ** @ رقم المستوى الحالي الخاص * / خاص var currentLevel: uint؛ / ** @ النتيجة الحالية الخاصة * / private var currentScore: int؛ / ** @ حقل نص خاص لعرض رقم المستوى * / private var levelText: TextField؛ / ** @ حقل نص خاص لعرض النتيجة * / private var ScoreText: TextField؛ / ** الحد الأقصى للدرجة * / public maxScore: uint؛ / ** * استمع إلى الإضافة إلى المرحلة في المنشئ. * / الوظيفة العامة GameScreen () (addEventListener (Event.ADDED_TO_STAGE، addedtToStage) ؛) / * * * إنشاء عناصر الشاشة * *param e تمت إضافة الحدث onstage * / تمت إضافة الوظيفة الخاصة إلى المرحلة (e: Event): void (removeEventListener (Event. ADDED_TO_STAGE، addedtToStage)؛ gameContainer = new Sprite () ؛ // حاوية addChild (gameContainer) ؛ المنصة = منصة جديدة () ؛ // أنشئ منصة ، واضبط حجمها وموضعها وأضفها إلى منصة المسرح. platform.scaleY = platform.scaleX ؛ platform.x = (stage.stageWidth - platform.width) / 2 ؛ platform.y = stage.stageHeight * .88 ؛ addChild (منصة) ؛ ScoreText = Tools.generateTextField (30 ، "النتيجة: 0") ؛ // تسجيل درجة حقل النص Text.width = stage.stageWidth / 2 ؛ ScoreText.x = ScoreText.y = 10 ، addChild (ScoreText) ؛ levelText = Tools.generateTextField (30، "LEVEL: 1") ؛ // مستوى حقل نص المستوىText.width = levelText.textWidth + 4 ؛ levelText.x = (stage.stageWidth - levelText.width) / 2 ؛ levelText.y = stage.stageHeight - levelText.height - 20 ؛ addChild (مستوى النص) ؛ menuButton = زر جديد ("MENU") ؛ // زر للخروج إلى القائمة الرئيسية. addChild (زر القائمة) ؛ menuButton.width = stage.stageWidth / 3.2 ؛ menuButton.scaleY = menuButton.scaleX ؛ menuButton.x = stage.stageWidth - menuButton.width - 10 ؛ menuButton.y = 10 ؛ startNewLevel () ، // بدء قائمة مستوى جديدةButton.addEventListener (TouchEvent.TOUCH_TAP ، exitGame) ؛ // حدث الضغط على زر الخروج في قائمة stage.addEventListener (MouseEvent.MOUSE_MOVE ، moveplatform) ؛ // حدث حركة الإصبع على شاشة العرض .addEventListener (MouseEvent.MOUSE_UP، moveplatform)؛ // حدث سحب الإصبع من الشاشة addEventListener (Event.ENTER_FRAME ، updateGame) ؛ // تحديث حالة اللعبة addEventListener (Event.REMOVED_FROM_STAGE، removeFromStage) ؛ ) / ** *private قم بتحريك المنصة حسب موضع الإصبع على الشاشة. * *param e حدث تحريك إصبعك عبر الشاشة أو خارجها * / الوظيفة الخاصة moveplatform (e: MouseEvent): باطل (if (mouseY> menuButton.y + menuButton.height) TweenLite.to (النظام الأساسي ، 36 ، ( x: mouseX + -platform.width / 2))؛) / ** * @ خاص ابدأ مستوى جديد. يتكون كل مستوى من 20 عنصرًا * / وظيفة خاصة startNewLevel (): باطل (فاصل فار: uint = 2300 ؛ // فاصل مكالمة مؤقت إذا (2300 - currentLevel * 350< 250) { // чем выше уровень, тем меньше интервал interval = 350; } else { interval = 2300 - currentLevel * 350; } gameTimer = new Timer(interval, 20); // создаём и запускаем таймер. gameTimer.start(); gameTimer.addEventListener(TimerEvent.TIMER, addItem); gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, cicleEnd); } /** * @private Создаём новый айтем по таймеру * * @param e событие тика таймера */ private function addItem(e:TimerEvent):void { var randomRange:Number = Math.random(); // случайное значене var itemType:String = ItemType.GOOD; // тип нового айтема. по умолчнанию все айтемы обычные if (randomRange >0.65 && نطاق عشوائي< .95) { // если случайное значение в заданном диапазоне (30%)... itemType = ItemType.EVIL; // айтем злой } else if (randomRange >= .95) (// 5٪ من العناصر ستكون "محسنة" itemType = ItemType.VERY_GOOD؛) var item: Item = new Item (itemType) ؛ // إنشاء عنصر جديد بالنوع الذي تم إنشاؤه item.x = stage.stageWidth * Math.random () ؛ // ضع عنصر x عشوائيًا. y = -item.height ؛ // و by.y نزيل من المشهد item.speed = currentLevel + 1 ؛ // سرعة العنصر gameContainer.addChild (عنصر) ؛ // وأضفه إلى المشهد) / ** *private عند انتهاء عداد الوقت من العمل ، امسح ما هو غير مطلوب وابدأ مستوى جديد * *param e عند انتهاء المؤقت * / الوظيفة الخاصة cicleEnd (e: TimerEvent): void (gameTimer.removeEventListener (TimerEvent.TIMER ، addItem) ؛ gameTimer.removeEventListener (TimerEvent.TIMER_COMPLETE ، cicleEnd) ؛ gameTimer = null ؛ // إزالة المستمعين من المؤقت وإشارة إلى المستوى الحالي "زيادة level.text بمقدار مستوى واحد:" + String (currentLevel + 1) ؛ // تحديث نص المستوى levelText.width = levelText.textWidth +4 ؛ startNewLevel () ؛ // بدء مستوى جديد) / * * * @ حلقة اللعبة الخاصة * تحديث مواضع العناصر. إذا خرجوا من المشهد ، احذف. * تعامل مع تصادماتها مع النظام الأساسي * *param e حدث enterFrame * / تحديث الوظيفة الخاصة (e: Event): void (// حلقة خلال محتويات حاوية اللعبة بالكامل ، باستثناء النظام الأساسي (i = 1) لـ ( var i: int = 1 ؛ أنا< gameContainer.numChildren; i++) { var tempItem:Item = gameContainer.getChildAt(i) as Item; // берём айтем tempItem.y += (tempItem.speed * 3) * .8; // увеличиваем его.y координаты в зависимости от его скорости. if (tempItem.y >stage.stageHeight) (// إذا ذهب إلى أسفل ... gameContainer.removeChild (tempItem) ؛ // ... قم بإزالته ... وإذا تبين أن نوعه عادي ، اطرح واحدًا من النقاط.) إذا (tempItem.hitTestObject (النظام الأساسي)) (// إذا تم التقاط العنصر بواسطة النظام الأساسي // اعتمادًا على نوعه ، فإننا نقوم بإجراء. / / أعتقد أنه ليس هناك حاجة لشرح التبديل (tempItem.type) (حالة ItemType.GOOD: currentScore ++ ؛ break ؛ case ItemType.VERY_GOOD: currentScore + = 5 ؛ break ؛ case ItemType.EVIL: currentScore-- ؛ فاصل ؛) // أيضًا عند الضغط على النظام الأساسي لم تعد هناك حاجة إلى العنصر ، قم بإزالته من المشهد gameContainer.removeChild (tempItem) ؛)) ScoreText.text = "SCORE:" + currentScore؛ // تحديث حقل النص بالدرجات إذا (maxScore< currentScore) maxScore = currentScore; // записываем максимальное количество очков if (currentScore < -5) { // если количество очков меньше, чем -5.. dispatchEvent(new GameEvent(GameEvent.GAME_OVER)); //... генерируем событие проигрыша } } /** * @private генерируем событие выхода из игры * * @param e событие прикосновения к кнопке выхода в меню */ private function exitGame(e:TouchEvent):void { dispatchEvent(new GameEvent(GameEvent.EXIT_GAME)); } /** * @private удаляем все ненужные больше слушатели * * @param e событие удаления со сцены */ private function removedFromStage(e:Event):void { removeEventListener(Event.REMOVED_FROM_STAGE, removedFromStage); removeEventListener(Event.ENTER_FRAME, updateGame); stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveplatform); stage.removeEventListener(MouseEvent.MOUSE_UP, moveplatform); menuButton.removeEventListener(TouchEvent.TOUCH_TAP, exitGame); gameTimer.stop(); gameTimer.removeEventListener(TimerEvent.TIMER, addItem); gameTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, cicleEnd); } } }
ScoreScreenعرض بعد الخسارة. يعرض مربع نص مع النتيجة النهائية والأزرار للعودة إلى القائمة وتكرار اللعبة
شاشات الحزمة (استيراد العناصر ، الزر ؛ استيراد فلاش. . * يتكون من النص "YOUR SCORE:" والأزرار "MENU" و "AGAIN" * *author illuzor * / public class تعمل ScoreScreen على توسيع Sprite (/ ** @ عدد النقاط المراد عرضها * / نقاط var الخاصة: uint؛ / ** زر "MENU" * / قائمة var العامة الزر: زر ؛ / ** زر "AGAIN" * / public var مرة أخرى الزر: Button ؛ / ** * في المُنشئ ننتظر الإضافة إلى المسرح. هنا المرحلة مطلوبة لوضع العناصر *param يسجل عدد النقاط المراد عرضها * / الوظيفة العامة ScoreScreen (النتيجة: uint) (this.score = Score ؛ addEventListener (Event.ADDED_TO_STAGE، addedToStage)؛) / ** * إنشاء حقل نصي لعرض النتائج والأزرار لإعادة اللعبة والعودة إلى القائمة الرئيسية. * *param e حدث إضافة إلى المرحلة * / تمت إضافة الوظيفة الخاصة إلى Stag هـ (هـ: الحدث): باطل (removeEventListener (Event.ADDED_TO_STAGE، addedToStage) ؛ // يعرض حقل النص عدد النقاط التي تم تسجيلها على var ScoreText: TextField = Tools.generateTextField (40، "YOUR SCORE:" + Score) ؛ ScoreText.x = (stage.stageWidth - ScoreText.width) / 2 ؛ ScoreText.y = (stage.stageHeight - ScoreText.height) / 2 - stage.stageHeight / 6 ؛ addChild (ScoreText) ؛ // زر للخروج إلى قائمة القائمة الرئيسيةButton = زر جديد ("MENU") ؛ addChild (زر القائمة) ؛ menuButton.width = stage.stageWidth / 2 ؛ menuButton.scaleY = menuButton.scaleX ؛ menuButton.x = (stage.stageWidth - menuButton.width) / 2 ؛ menuButton.y = ScoreText.y + ScoreText.height + 30 ؛ // زر "تشغيل المزيد" مرة أخرىButton = زر جديد ("AGAIN") ؛ addChild (مرة أخرى زر) ؛ againButton.width = stage.stageWidth / 2 ؛ againButton.scaleY = againButton.scaleX ؛ againButton.x = (stage.stageWidth - againButton.width) / 2 ؛ againButton.y = menuButton.y + menuButton.height + 30 ؛ )))
والأخير هو الطبقة الأساسيةمن الجذور. الطبقة الرئيسية للعبة. تستخدم لتبديل الشاشات ومسح هذه المفاتيح. يستمع إلى أزرار الشاشة وأحداث اللعبة. بناءً عليها ، يمسح المشهد ويظهر الشاشة المطلوبة
الحزمة (استيراد الثوابت ، نوع الشاشة ، استيراد الأحداث ، GameEvent ، استيراد flash.desktop.NativeApplication ، استيراد flash.display.Sprite ، استيراد flash.display.StageAlign ، استيراد flash.display.StageScaleMode ، استيراد flash.events.Event ، استيراد فلاش. events.TouchEvent؛ استيراد flash.ui.Multitouch؛ استيراد flash.ui.MultitouchInputMode؛ استيراد الشاشات. GameScreen؛ استيراد الشاشات.القائمة الرئيسية؛ استيراد الشاشات.ScoreScreen؛ / ** * فئة اللعبة الرئيسية. يتحكم في عرض شاشات الألعاب المختلفة. * تمثل اللعبة ما يلي: يوجد في أسفل الشاشة "منصة" يمكن تحريكها. * من أعلى الخريف "كائنات" من ثلاثة أنواع: أحمر ، أخضر ، أزرق. تحتاج إلى الإمساك بهم باستخدام النظام الأساسي. * * تم إنشاؤه باستخدام FlashDevelop 4.0.1 و Flex SDK 4.6 * С باستخدام المكتبة من greensock - http://www.greensock.com/v11/ * *author illuzor * @ الإصدار 0.6 * / فئة عامة Main extends Sprite (/ ** @ شاشة القائمة الرئيسية الخاصة * / شاشة قائمة var الخاصة: MainMenu ؛ / ** @ شاشة اللعبة الخاصة * / لعبة var الخاصة: GameScreen ؛ / ** @ شاشة خاصة لعرض نتيجة اللعبة (النتيجة) * / شاشة var الخاصة: ScoreScreen ؛ / **private هذا المتغير يخزن القيم النصية لنوع الشاشة * من الثوابت. نوع الشاشة ، المعروض حاليًا * مطلوب للتنظيف بشكل صحيح من المستمعين وكائنات الشاشة * / var currentScreen: String؛ / ** * المُنشئ الرئيسي * / الوظيفة العامة الرئيسية (): باطل (stage.scaleMode = StageScaleMode.NO_SCALE ؛ stage.align = StageAlign.TOP_LEFT ؛ // حدث إلغاء التنشيط "أو" الرجوع ") stage.addEventListener (Event.DEACTIVATE ، إلغاء التنشيط) ؛ // نوع الإدخال. يتم تعيين TOUCH_POINT افتراضيًا وهو يناسبنا اللمس المتعدد. function showMenu (): void (currentScreen = ScreenType.MAIN_MENU؛ // تطبيق قائمة نوع الشاشة menuScreen = new MainMenu () ؛ // إنشاء قائمة وإضافتها إلى المشهد addChild (menuScreen) ؛ menuScreen.playButton.addEventListener (TouchEvent. TOUCH_TAP ، startGame) ؛ // إضافة مستمعين إلى قائمة أزرار القائمة menuScreen.exitButton.addEventListener (TouchEvent.TOUCH_TAP ، إلغاء التنشيط) ؛) / ** *private اعرض شاشة اللعبة * *param e للمس زر التشغيل utton من القائمة الرئيسية * / بدء تشغيل الوظيفة الخاصة (e: TouchEvent): void (clear () ؛ // clear currentScreen = ScreenType. GAME_SCREEN ، // قم بتطبيق نوع الشاشة gameScreen = new GameScreen () ؛ // قم بإنشاء شاشة لعبة وأضف إلى المشهد addChild (gameScreen) ؛ gameScreen.addEventListener (GameEvent.EXIT_GAME ، exitGame) ؛ // حدث الخروج من اللعبة عن طريق زر gameScreen.addEventListener (GameEvent.GAME_OVER ، gameOver) ؛ // حدث الخسارة) / ** * @ الخروج الخاص من اللعبة بالضغط على الزر * *param e حدث الخروج من اللعبة * / الوظيفة الخاصة exitGame (e: GameEvent): void (clear () ؛ // clear showMenu ()؛ // إظهار القائمة الرئيسية) / ** *private the game يتم لعبها ، تظهر النتيجة * *param e loss event * / private function game game (e: GameEvent): void (var Score: uint = gameScreen.maxScore ؛ // النتيجة مأخوذة من شاشة اللعبة من متغير maxScore clear () ؛ // clear currentScreen = ScreenType.SCORE_SCREEN ؛ // تطبيق نوع الشاشة ScoreScreen = new ScoreScreen (النتيجة) ؛ // إنشاء وعرض شاشة النتيجة addChild (ScoreScreen) ؛ ScoreScreen.menuButton. addEventListener (TouchEvent.TOUCH_TAP ، exitScore) ؛ // مستمعون لأزرار شاشة النتائج التي تسجل الشاشة. شاشة النتائج بواسطة زر. * عليك أن تفعل الشيء نفسه عندما تضغط على زر الخروج ، لذا فقط اتصل بـ exitGame () * *param e event من لمس زر الخروج من شاشة النتائج * / الوظيفة الخاصة exitScore (e: TouchEvent): void (exitGame (null)؛) / ** *private يقوم بتنظيف المستمعين وكائنات الشاشة غير الضرورية * اعتمادًا على الشاشة الحالية. * / الوظيفة الخاصة clear (): void (switch (currentScreen) (case ScreenType.MAIN_MENU: menuScreen.playButton.removeEventListener (TouchEvent.TOUCH_TAP، startGame)؛ menuScreen.exitButton.removeEventListener (TouchEventScreen؛ break ؛ case ScreenType.GAME_SCREEN: gameScreen.removeEventListener (GameEvent.EXIT_GAME ، exitGame) ؛ gameScreen.removeEventListener (GameEvent.GAME_OVER ، gameOver) ؛ إزالة تشيلد (gameScreen) ؛ caseScreen ScoreScreen.menuButton againButton.removeEventListener (TouchEvent.TOUCH_TAP ، startGame) ؛ removeChild (ScoreScreen) ؛ ScoreScreen = null ؛ break ؛)) / ** * الخروج من التطبيق عبر NativeApplication * الضغط على زر الصفحة الرئيسية أو الرجوع يخرج من التطبيق * *param e deactivation event * / إلغاء تنشيط الوظيفة الخاصة (هـ: الحدث): باطل (NativeApplication.nativeApplication.e) xit () ؛ )))

تجميع وتشغيل.

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

الآن نحن بحاجة إلى تنفيذ بعض الإجراءات في FlashDevelop.
- نقوم بتجميع المشروع مشروع / بناء مشروع(F8). في المجلد سلة مهملاتسيظهر محرك أقراص فلاش ؛
- يطلق PackageApp.bat... أدخل "2" ، اضغط على Enter. نحن في انتظار حزم المشروع في ملف apk ويظهر في المجلد حي;
- اختر من القائمة تصحيح / بدء جلسة عن بعد;
- يطلق Run.bat- سيتم تحميل التطبيق على الجهاز وتشغيله هناك وتوصيله بمصحح الأخطاء.

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

يمكن القيام بكل هذه الإجراءات الأربعة بطريقة مختلفة. فقط اختر مشروع / مشروع اختبار(F5). كل شيء سوف يتم تلقائيا.

عندما يتم اختبار التطبيق والانتهاء ، قم بتشغيل PackageApp.bat، نقدم الوحدة. في المجلد حيسوف يظهر الإصدار apk.

نهاية الجزء الأول.