القائمة الرئيسية

الصفحات

طريقة صنع لعبة Flappy Bird بالجافا على الجوال 2026

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



طريقة صنع لعبة Flappy Bird بالجافا على الجوال 2026


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


ماهو تطبيق AIDE وكيفية إعداده للبرمجة الاحترافية


يعتبر تطبيق AIDE (Android IDE) هو البوابة الحقيقية لكل من
 يرغب في برمجة ألعاب الجوال دون الحاجة لجهاز كمبيوتر.
 هذا التطبيق ليس مجرد محرر نصوص، بل هو بيئة تطوير متكاملة تحتوي على مترجم
 (Compiler) داخلي يسمح لك بتحويل أسطر الكود إلى ملف APK قابل للتثبيت فوراً.
* لإعداد التطبيق بشكل احترافي، يجب عليك اتباع الآتي:
1- تحميل النسخة المتوافقة: تأكد من تحميل إصدار يدعم مكتبات Java الحديثة ويتوافق مع نظام أندرويد الخاص بك.
2- إعداد مسار العمل: قم بإنشاء مجلد خاص لمشاريعك على الذاكرة الداخلية لسهولة الوصول إلى ملفات اللعبة (Assets).
3- تفعيل الميزات المتقدمة: قم بتنشيط خاصية "التحقق من الأخطاء في الوقت الفعلي" داخل الإعدادات لتساعدك على اكتشاف الأخطاء البرمجية أثناء الكتابة.


شرح مكتبة LibGDX للجوال وأهميتها في تطوير الألعاب


إذا كنت تتساءل عن السر وراء سلاسة الألعاب الشهيرة، فالإجابة هي مكتبة LibGDX.
 هي إطار عمل (Framework) مفتوح المصدر يعتمد على لغة الجافا، ويعد
الخيار الأول عند التفكير في تطوير ألعاب 2D احترافية مثل Flappy Bird.
تكمن أهمية LibGDX في عدة نقاط تقنية:
*عالية الأداء: تعتمد على مكتبة OpenGL لإدارة الرسوميات، مما يضمن تشغيل اللعبة بسرعة 60 إطاراً في الثانية (FPS).
*تعدد المنصات: الكود الذي تكتبه على الجوال باستخدام هذه المكتبة يمكن تشغيله
 لاحقاً على الكمبيوتر أو المتصفح دون تغييرات جذرية.
*سهولة التعامل مع الأصول: توفر أدوات جاهزة لإدارة الصور (Textures)، الأصوات،
 والخطوط، مما يقلل من حجم الكود الذي تحتاجه لبناء اللعبة من الصفر.
*مجتمع برمي واسع: نظراً لشهرتها، ستجد مئات الشروحات الجاهزة والأكواد المفتوحة
 التي تساعدك في حل أي مشكلة برمجية تواجهك.


خطوات برمجة لعبة Flappy Bird على الموبايل خطوة بخطوة



صناعة لعبة شبيهة بـ Flappy Bird تتطلب تقسيم العمل إلى مراحل تقنية منظمة تضمن استقرار الأداء:

أولاً: إنشاء دورة حياة اللعبة (Game Loop)
في LibGDX، تعتمد اللعبة على دالة render(). هذه الدالة تتكرر 60 مرة في الثانية،
 ومهمتها تحديث مواقع العناصر (Logic) ثم رسمها على الشاشة (Drawing). 
بدون "دورة الحياة" هذه، ستظل اللعبة ساكنة كالصورة.

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

* كيف أجعل الشخصية تقفز وتحاكي الجاذبية؟
لجعل حركة الطائر واقعية، لا نحركه للأعلى والأسفل بشكل خطي، بل نستخدم فيزياء القوى:
- قوة الجاذبية: نقوم بإنشاء متغير يُسمى gravity (مثلاً قيمته -0.5).
 في كل إطار، يتم إضافة هذه القيمة إلى "سرعة الطائر العمودية" (velocity).
- السقوط: يتم تحديث موقع الطائر Y بإضافة السرعة الحالية إليه، مما يجعله يسقط بشكل متسارع لأسفل.
- القفز: عند اكتشاف نقرة على شاشة الموبايل عبر Gdx.input.justTouched()،
 نقوم بتغيير قيمة velocity إلى رقم موجب (مثلاً +10). هذا يدفع الطائر للأعلى فوراً، 
ثم تبدأ الجاذبية بسحبه تدريجياً لأسفل مرة أخرى، مما يخلق منحنى قفز انسيابي.

* طريقة صنع تصادم بين الطائر والأنابيب (Collision Detection)
التصادم هو ما يجعل اللعبة "تحدياً". في ألعاب الجافا 2D، نستخدم فئة Rectangle:
نقوم بإنشاء مستطيل غير مرئي يحيط بالطائر (birdRect) ومستطيلات تحيط بالأنابيب (pipeRect).
في كل إطار، نحدث مواقع هذه المستطيلات لتطابق صور الطائر والأنابيب.
- نستخدم الدالة Intersects(): إذا تداخل مستطيل الطائر مع أي مستطيل للأنبوب،
 يتم استدعاء دالة gameOver() لإيقاف اللعبة.

* نظام حفظ النقاط والمراحل (Scoring & Persistence)
لكي يشعر اللاعب بالإنجاز، يجب برمجة نظام لحساب النقاط وحفظ "أعلى نتيجة"
 (High Score) حتى بعد إغلاق التطبيق:

1. حساب النقاط (Score Logic)
نضيف متغير score يبدأ من الصفر. في دورة اللعبة، نتحقق: إذا تجاوزت إحداثيات 
الطائر X إحداثيات الأنبوب X بنجاح، يتم زيادة النقاط بمقدار 1 وتشغيل صوت "النقاط".

2. حفظ النقاط بشكل دائم (Preferences)
في الجوال، لا نستخدم قواعد بيانات معقدة للأرقام البسيطة، بل نستخدم Preferences في LibGDX:
للحفظ: عند انتهاء اللعبة، نتحقق إذا كانت النتيجة الحالية أكبر من النتيجة المحفوظة. إذا كانت كذلك، نستخدم الكود:

prefs.putInteger("highScore", score);
prefs.flush(); (هذا الأمر يضمن كتابة الرقم في ذاكرة الهاتف فوراً).
للاسترجاع: عند فتح اللعبة مرة أخرى، نستدعي النتيجة المحفوظة لعرضها في القائمة الرئيسية:
int topScore = prefs.getInteger("highScore", 0);
--

3. تصميم المراحل (Level Progression)
بما أن Flappy Bird لعبة "لا نهائية"، فإن تطوير المراحل يعتمد على زيادة الصعوبة التدريجية:
زيادة سرعة حركة الأنابيب كلما زادت النقاط.
تقليل المسافة (Gap) بين الأنبوب العلوي والسفلي لجعل المرور أصعب.




كيف تبدأ صنع لعبة Flappy Bird بالجافا على الجوال؟


عند فتح مشروع LibGDX على AIDE، ستجد ملفاً أساسياً هو قلب اللعبة 
(غالباً ينتهي اسمه بـ Game أو MyGdxGame). داخل هذا الملف، سنقوم بكتابة الأكواد التالية:

الخطوة 1: تعريف "أدوات" اللعبة
في بداية الكلاس (Class)، نحتاج لتعريف الصور والفيزياء:
Java

SpriteBatch batch; // المسؤول عن رسم الصور
Texture bird;      // صورة الطائر
float birdY;       // موقع الطائر العمودي
float velocity = 0; // سرعة الطائر
--

الخطوة 2: تحميل الموارد (دالة Create)
هنا نقول للتطبيق: "جهز الصور عند تشغيل اللعبة":
Java

@Override
public void create() {
    batch = new SpriteBatch();
    bird = new Texture("bird.png"); // تأكد من وضع الصورة في مجلد assets
    birdY = Gdx.graphics.getHeight() / 2; // وضع الطائر في منتصف الشاشة
}
--

الخطوة 3: برمجة الجاذبية والقفز (دالة Render)
لكي لا يظل الطائر ثابتاً، نحتاج لإضافة منطق "السرعة" و"الجاذبية". 
سنقوم بتحديث موقع الطائر داخل دالة render التي تتكرر باستمرار، هذا هو الجزء الأهم، 
هنا يحدث السحر 60 مرة في الثانية:
Java

// 1. المتغيرات يجب أن تُعرف خارج دالة render (في أعلى الكلاس) لكي لا يتم تصفيرها في كل إطار
float birdY; 
float velocity = 0;    
float gravity = 0.7f;  // قوة الجاذبية

@Override
public void render() {
    // 2. تنظيف الشاشة (ضروري جداً لكي لا يترك الطائر "أثراً" خلفه أثناء الحركة)
    Gdx.gl.glClearColor(0, 0, 0, 1); // تحديد لون الخلفية (أسود مثلاً)
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    // 3. منطق القفز: إذا لمس المستخدم الشاشة
    if (Gdx.input.justTouched()) {
        velocity = 15; // دفع الطائر للأعلى
    }

    // 4. محاكاة الجاذبية: السرعة تنقص باستمرار
    velocity = velocity - gravity; 
    birdY = birdY + velocity; 

    // 5. منع الطائر من الخروج خارج حدود الشاشة السفلية
    if (birdY < 0) birdY = 0;

    // 6. الرسم
    batch.begin();
    // تأكد من استخدام اسم المتغير الصحيح للصورة (imgBird أو bird) حسب تعريفك لها في create
    batch.draw(imgBird, 100, birdY); 
    batch.end();
}

--

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

float pipeX = Gdx.graphics.getWidth(); // تبدأ الأنابيب من أقصى يمين الشاشة
// داخل دالة render:
pipeX = pipeX - 5; // سرعة تحرك الأنبوب لليسار
if (pipeX < -200) { pipeX = Gdx.graphics.getWidth(); } // إذا خرج الأنبوب، أعده لليمين
--




كيف تبرمج "التصادم" (Collision) بالتفصيل؟


نظام التصادم هو المحرك الأساسي للتحدي في لعبة Flappy Bird؛ 
فبدونه سيمر الطائر من خلال الأنابيب دون أي تأثير. في مكتبة LibGDX،
 نعتمد على "المستطيلات الوهمية" أو ما يعرف بـ Bounding Boxes لاكتشاف التداخل بين العناصر.

أولاً: فكرة المستطيلات الوهمية (The Concept)
لكل عنصر في اللعبة (الطائر، الأنبوب العلوي، الأنبوب السفلي)، نقوم برسم مستطيل
 غير مرئي يحيط به تماماً. عندما يتقاطع مستطيل الطائر مع مستطيل الأنبوب،
 تكتشف اللعبة "التصادم" وتنفذ أمر الخسارة.

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

// تعريف المستطيلات في أعلى الكلاس
Rectangle birdRect;
Rectangle pipeRect;

@Override
public void create() {
    // تجهيز المستطيلات عند تشغيل اللعبة
    birdRect = new Rectangle();
    pipeRect = new Rectangle();
}
--

ثالثاً: تحديث مواقع المستطيلات واكتشاف التصادم
داخل دالة render التي تتكرر 60 مرة في الثانية، سنقوم بربط إحداثيات المستطيلات
 بمواقع الصور الفعلية، ثم نتحقق من التداخل:

Java

@Override
public void render() {
    // 1. تحديث إحداثيات مستطيل الطائر ليتتبع موقعه الحالي
    birdRect.set(100, birdY, imgBird.getWidth(), imgBird.getHeight());

    // 2. تحديث إحداثيات مستطيل الأنبوب (مثال للأنبوب السفلي)
    pipeRect.set(pipeX, 0, 200, 400); 

    // 3. التحقق من التداخل باستخدام دالة overlaps
    if (birdRect.overlaps(pipeRect)) {
        
        // --- هنا تبدأ "برمجة الخسارة" ---
        
        // 1. إعادة الطائر لمنتصف الشاشة
        birdY = Gdx.graphics.getHeight() / 2;
        
        // 2. تصفير السرعة لمنع السقوط السريع فور البدء
        velocity = 0;
        
        // 3. إعادة الأنبوب لنقطة البداية في جهة اليمين
        pipeX = Gdx.graphics.getWidth();
        
        // نصيحة احترافية: أضف اهتزازاً للموبايل عند التصادم
        Gdx.input.vibrate(100); 
    }
}
--

* نصائح لتحسين دقة التصادم
- المساحات البيضاء: إذا كان طائرك يحيط به فراغ شفاف كبير في الصورة، 
سيخسر اللاعب قبل أن يلمس الأنبوب فعلياً. الحل هو جعل أبعاد المستطيل 
أصغر قليلاً من حجم الصورة الفعلي (مثلاً imgBird.getWidth() - 5).
- الأنابيب المتعددة: إذا كان لديك أنبوب علوي وسفلي، ستحتاج لإنشاء مستطيلين 
(topPipeRect و bottomPipeRect) والتحقق من التصادم مع كليهما باستخدام أداة الشرط || (أو).

* ملاحظة : استخدام دالة .set() بدلاً من إنشاء مستطيل جديد بكلمة new داخل 
الـ Render هو ما يحمي لعبتك من "التشنج" أو الـ (Force Close) المفاجئ
 الناتج عن امتلاء الذاكرة، وهو الفرق بين المبرمج الهاوي والمحترف.


الخطوة الخامسة: حفظ النقاط (High Score)

لكي لا تضيع النقاط عند إغلاق اللعبة، نستخدم Preferences وهي مخزن صغير في ذاكرة الهاتف:
Java

// تعريف المخزن
Preferences prefs = Gdx.app.getPreferences("MyGameStorage");

// حفظ النقاط عند الخسارة
int highScore = prefs.getInteger("score", 0);
if (currentScore > highScore) {
    prefs.putInteger("score", currentScore);
    prefs.flush(); // حفظ فعلي في ذاكرة الهاتف
}
--


 حل مشكلة الـ SDK في AIDE وتجاوز أخطاء التثبيت


مشكلة الـ SDK هي "البعبع" الذي يواجه مبرمجي الجوال، وغالباً ما تظهر
 كرسالة خطأ تخبرك بأن التطبيق لا يستطيع بناء ملف الـ APK.

*كيف تحل المشكلة عملياً؟
1- تعديل ملف Build.gradle: هو أهم ملف في مشروعك. افتحه وقم بتعديل الأسطر التالية لتتوافق مع هاتفك:
* compileSdkVersion: اجعلها 30 أو 31 (حسب إصدار أندرويد لديك).
* minSdkVersion: اجعلها 21 لضمان عمل اللعبة على أغلب الأجهزة.
2- تحميل حزمة الـ Build Tools: إذا استمر الخطأ، اذهب إلى إعدادات AIDE ثم
 Settings > Android SDK وقم بتحميل الإصدارات الناقصة.
3- تنزيل Maven و Gradle: أحياناً يحتاج التطبيق لتحميل مكتبات من الإنترنت، تأكد 
من تفعيل "Download missing libraries" لكي يقوم AIDE بجلبها تلقائياً.



 لماذا يتوقف التطبيق عن العمل وما هو الـ Force Close


رسالة "للأسف توقف التطبيق" أو Force Close تعني أن الكود يحتوي على
 خطأ منطقي جعل المعالج يتوقف عن التنفيذ فوراً.
* أشهر الأسباب وكيف تكتشفها:
- خطأ NullPointerException: وهو استدعاء صورة أو متغير قبل تعريفه 
(مثلاً تحاول رسم الطائر وأنت لم تحمّل صورته في دالة create).
- فحص الـ LogCat: داخل AIDE، اذهب إلى قائمة More > LogCat. 
سيعطيك التطبيق سطراً باللون الأحمر يخبرك برقم السطر الذي تسبب في الانهيار ونوع الخطأ.
- خطأ المسارات: تأكد أن اسم الصورة في الكود يطابق تماماً اسمها في مجلد assets
 (تذكر أن الجافا حساسة لحالة الأحرف، فصورة Bird.png تختلف عن bird.png).


لماذا اللعبة بطيئة على هاتفي وطرق تحسين الأداء

البطء (Lag) في ألعاب الجافا يحدث عندما تستهلك اللعبة طاقة المعالج بشكل غير مدروس.
خطوات تحسين الأداء (Optimization):
1- استخدام SpriteBatch بذكاء: لا تفتح وتغلق الـ batch أكثر من مرة. افتحه في بداية دالة
 render وأغلقه في نهايتها مرة واحدة فقط.
2- تجنب تعريف المتغيرات داخل الـ Render: لا تكتب 
Rectangle rect = new Rectangle() داخل دالة الـ render، لأن هذا سينشئ 60 كائن 
في الثانية مما يملأ الذاكرة (RAM) ويسبب البطء. عرفها في البداية واستخدمها فقط.
3- ضغط الصور: استخدم صوراً بأبعاد معقولة. لا تستخدم صورة بدقة 4K لطائر صغير؛ 
دقة 128x128 بكسل كافية جداً وستجعل اللعبة طيارة!


خطوات تحميل Sprites جاهزة وأيقونات أزرار لألعاب الجافا

المبرمج الذكي ليس بالضرورة رساماً بارعاً، بل هو من يعرف كيف يحصل على "الموارد" (Assets) الجاهزة.
أين تجد هذه الموارد؟
1- موقع OpenGameArt: هو الكنز الأول، ابحث فيه عن "2D Bird" أو
 "Game Buttons" وستجد آلاف الصور المجانية.
2- موقع Kenney.nl: يقدم حزم صور (Assets) متكاملة واحترافية جداً وبشكل 
مجاني تماماً، وتناسب جداً ألعاب الموبايل.
3- محرك بحث Itch.io: في قسم Game Assets، يمكنك فلترة النتائج للحصول على
 صور "Top-down" أو "Side-scroller" مجانية.
4- موقع CraftPix.net: يوفر قسماً خاصاً للأصول المجانية (Freebies) يحتوي على
 واجهات مستخدم (UI) وأزرار وشخصيات 2D احترافية جداً.
* نصيحة : عند تحميل الصور، ابحث دائماً عن صيغة PNG بخلفية شفافة لتسهيل 
دمجها في اللعبة دون ظهور مربعات بيضاء حول الشخصيات.


أفضل 3 تطبيقات لبرمجة الألعاب من جوالك


إذا كنت تريد البدء في برمجة ألعاب الجوال، فهذه التطبيقات هي الأفضل
 حالياً في 2026 من حيث الإمكانيات والدعم:
1- تطبيق AIDE: هو الخيار رقم 1 لمطوري الجافا. يتميز بدعمه الكامل لمكتبة
 LibGDX وقدرته على بناء ملفات APK احترافية.
2- تطبيق Sketchware Pro: يعتمد على البرمجة المرئية (البلوكات) ولكنه يسمح
 لك بحقن كود جافا مخصص. ممتاز لمن يريد نتائج سريعة وتصميم واجهات معقدة.
3- تطبيق It's Magic Engine: محرك ألعاب متطور للهواتف يدعم الألعاب ثلاثية الأبعاد
 (3D) وثنائية الأبعاد، ويشبه في تصميمه محرك Unity الشهير.



أسئلة شائعة حول تطوير ألعاب جافا


- هل يمكنني الربح من لعبة صنعتها على الجوال؟ 
نعم، يمكنك دمج إعلانات AdMob داخل الكود ورفع اللعبة على متجر جوجل بلاي.
- ما هي أفضل لغة لبرمجة ألعاب الأندرويد؟ 
تظل الجافا (Java) هي الأساس، تليها لغة Kotlin و C# (مع محرك Unity).
- هل أحتاج إلى إنترنت قوي لاستخدام AIDE؟ 
لا، التطبيق يعمل بالكامل بدون إنترنت، تحتاجه فقط عند تحميل المكتبات لأول مرة.
- لماذا تختفي صوري عند تشغيل اللعبة؟ 
تأكد من وضع الصور داخل مجلد assets وليس res عند استخدام مكتبة LibGDX.
- هل تدعم هذه التطبيقات الألعاب ثلاثية الأبعاد؟ 
نعم، LibGDX تدعم 3D، ولكنها تتطلب مهارة برمجية أعلى من الألعاب الثنائية.
- كيف أحمي كود اللعبة من السرقة؟ 
يمكنك استخدام أداة ProGuard المدمجة في AIDE لتشفير الكود (Obfuscation) قبل استخراج النسخة النهائية.

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


أنت الان في اول موضوع
جدول المحتويات