الفيزياء الأساسية
تعلم كيفية إضافة الجاذبية والقفز والاصطدامات لجعل لعبتك أكثر واقعية.
مقدمة في الفيزياء في الألعاب
الفيزياء تجعل الألعاب أكثر واقعية ومتعة. في هذا الدرس، سنتعلم كيفية:
- إضافة الجاذبية للكائنات
- تنفيذ آلية القفز
- كشف الاصطدامات والاستجابة لها
- إنشاء منصات قابلة للتفاعل
- ضبط معاملات الفيزياء مثل الاحتكاك والمرونة
💡 لماذا الفيزياء مهمة؟
الفيزياء الواقعية تجعل تجربة اللعب أكثر انغماسًا وتفاعلية. حتى الألعاب البسيطة تستفيد من الفيزياء الأساسية لجعل الحركة أكثر طبيعية.
مثال تفاعلي: محاكاة الفيزياء
جرب القفز والحركة في هذا العالم الفيزيائي البسيط:
السرعة: 0, 0
الموقع: 0, 0
على الأرض: نعم
الجاذبية: 500
مفاتيح الأسهم
↑
←
↓
→
مفاتيح WASD
W
A
S
D
كود الفيزياء الأساسي
هذا الكود يوضح كيفية تنفيذ الجاذبية والقفز:
// حالة اللاعب مع الفيزياء
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): محاكاة الكائنات الصلبة
- السوائل والجسيمات: محاكاة الماء والنار والدخان
- الأقمشة والنسيج: محاكاة الملابس والأعلام
- الفيزياء المدمرة: تدمير الكائنات ديناميكيًا
نصائح لتحسين الفيزياء
💡 أفضل الممارسات:
- اجعل معاملات الفيزياء قابلة للتعديل بسهولة
- استخدم قيم واقعية للجاذبية والتسارع
- أضف تأثيرات صوتية للاصطدامات
- استخدم الظلال والجسيمات لتعزيز الفيزياء
- اختبر الفيزياء على مختلف معدلات الإطارات
- أضف "تسامح الاصطدام" لمنع الاختراق
ما التالي؟
الآن بعد أن تعلمت أساسيات الفيزياء، يمكنك الانتقال إلى اللعبة النهائية حيث سنطبق كل ما تعلمناه في مشروع متكامل.