الفيزياء الأساسية

تعلم كيفية إضافة الجاذبية والقفز والاصطدامات لجعل لعبتك أكثر واقعية.

مقدمة في الفيزياء في الألعاب

الفيزياء تجعل الألعاب أكثر واقعية ومتعة. في هذا الدرس، سنتعلم كيفية:

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

💡 لماذا الفيزياء مهمة؟

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

مثال تفاعلي: محاكاة الفيزياء

جرب القفز والحركة في هذا العالم الفيزيائي البسيط:

السرعة: 0, 0
الموقع: 0, 0
على الأرض: نعم
الجاذبية: 500
مفاتيح الأسهم
مفاتيح WASD
W
A
S
D
500
600
0.8

كود الفيزياء الأساسي

هذا الكود يوضح كيفية تنفيذ الجاذبية والقفز:

// حالة اللاعب مع الفيزياء
const player = {
    x: 400,
    y: 200,
    width: 40,
    height: 40,
    vx: 0,           // السرعة الأفقية
    vy: 0,           // السرعة الرأسية
    speed: 200,      // سرعة الحركة الأفقية
    jumpPower: 600,  // قوة القفز
    onGround: false, // هل اللاعب على الأرض؟
    grounded: false  // للتحقق من الأرضية
};

// معاملات الفيزياء
const physics = {
    gravity: 500,    // تسارع الجاذبية (بكسل/ثانية²)
    friction: 0.8,   // معامل الاحتكاك
    airResistance: 0.99 // مقاومة الهواء
};

// تحديث الفيزياء
function updatePhysics(deltaTime) {
    const dt = deltaTime / 1000; // تحويل إلى ثواني
    
    // تطبيق الجاذبية
    player.vy += physics.gravity * dt;
    
    // تطبيق مقاومة الهواء
    player.vx *= physics.airResistance;
    player.vy *= physics.airResistance;
    
    // تحديث الموقع
    player.x += player.vx * dt;
    player.y += player.vy * dt;
    
    // التحقق من الاصطدام بالأرض
    if (player.y + player.height >= canvas.height - 100) {
        player.y = canvas.height - 100 - player.height;
        player.vy = 0;
        player.onGround = true;
        player.grounded = true;
    } else {
        player.onGround = false;
        player.grounded = false;
    }
    
    // منع الخروج من حدود الشاشة
    player.x = Math.max(0, Math.min(canvas.width - player.width, player.x));
}

// القفز
function jump() {
    if (player.onGround) {
        player.vy = -player.jumpPower;
        player.onGround = false;
    }
}

كشف الاصطدامات

كشف الاصطدامات ضروري للتفاعلات الفيزيائية:

1. اصطدام AABB

التحقق من تداخل المستطيلات المحاذاة بالمحاور.

function checkAABBCollision(rect1, rect2) {
    return rect1.x < rect2.x + rect2.width &&
           rect1.x + rect1.width > rect2.x &&
           rect1.y < rect2.y + rect2.height &&
           rect1.y + rect1.height > rect2.y;
}

2. حل الاصطدام

فصل الكائنات المتصادمة لمنع الاختراق.

function resolveCollision(player, platform) {
    // حساب التداخل من كل جانب
    const overlapLeft = (player.x + player.width) - platform.x;
    const overlapRight = (platform.x + platform.width) - player.x;
    const overlapTop = (player.y + player.height) - platform.y;
    const overlapBottom = (platform.y + platform.height) - player.y;
    
    // إيجاد أقل تداخل
    const minOverlap = Math.min(overlapLeft, overlapRight, overlapTop, overlapBottom);
    
    // حل الاصطدام بناءً على أقل تداخل
    if (minOverlap === overlapTop && player.vy > 0) {
        player.y = platform.y - player.height;
        player.vy = 0;
        player.onGround = true;
    } else if (minOverlap === overlapBottom && player.vy < 0) {
        player.y = platform.y + platform.height;
        player.vy = 0;
    } else if (minOverlap === overlapLeft) {
        player.x = platform.x - player.width;
        player.vx = 0;
    } else if (minOverlap === overlapRight) {
        player.x = platform.x + platform.width;
        player.vx = 0;
    }
}

3. المرونة والارتداد

محاكاة ارتداد الكائنات عند الاصطدام.

const elasticity = 0.7; // معامل المرونة (0-1)

function applyElasticity(player) {
    if (player.onGround) {
        player.vy *= -elasticity;
        
        // إيقاف الارتداد الصغير جدًا
        if (Math.abs(player.vy) < 50) {
            player.vy = 0;
        }
    }
}

أنواع الفيزياء المختلفة

⚠️ اعتبارات الأداء:

  • استخدم AABB للكشف السريع عن الاصطدامات
  • قسّم العالم إلى مناطق للحد من عمليات التحقق
  • استخدم التداخل الزمني (temporal coherence)
  • حدّث الفيزياء بتردد ثابت مستقل عن الرسوم
  • استخدم التكامل الفيرليت (Verlet integration) للاستقرار

الفيزياء المتقدمة

للألعاب الأكثر تعقيدًا، يمكنك إضافة:

  • الجسام الصلبة (Rigid Bodies): محاكاة الكائنات الصلبة
  • السوائل والجسيمات: محاكاة الماء والنار والدخان
  • الأقمشة والنسيج: محاكاة الملابس والأعلام
  • الفيزياء المدمرة: تدمير الكائنات ديناميكيًا

نصائح لتحسين الفيزياء

💡 أفضل الممارسات:

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

ما التالي؟

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