طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 251 · برمجة الأجهزة الذكية
الدرس 7 · الوحدة 3: التفاعل مع مكوّنات الجهاز والمستشعرات

الإمالة والحركة: مستشعر التسارع

قراءة الميل وبناء ألعاب وأدوات تتفاعل مع الحركة. ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تقرأ مستشعر التسارع (الإمالة) على محورين.
  • تربط موضع عنصرٍ بالإمالة بـ transform.
  • تبني منطق أداة المستوى (قرب الصفر).

١مستشعر التسارع Accelerometer

مستشعر التسارع يقيس ميل الجهاز على محورين: x (يمين/يسار) وy (أعلى/أسفل). منه تُبنى الألعاب، وأداة «المستوى» (الميزان)، وعدّ الخطوات. نقرأه بخطّاف useTilt الذي يعيد { x, y }:

import { View, Text, StyleSheet } from 'react-native';import { useTilt } from 'smartdevice'; export default function App() {  const tilt = useTilt();              // { x, y } بالدرجات  return (    <View style={styles.box}>      <Text style={styles.v}>x: {tilt.x}°</Text>      <Text style={styles.v}>y: {tilt.y}°</Text>    </View>  );} const styles = StyleSheet.create({  box: { padding: 24, alignItems: 'center' },  v: { fontSize: 22, fontWeight: 'bold', color: '#E8820C', marginVertical: 4 },});

حرّك منزلقَي الإمالة في لوحة المستشعرات، أو اضغط «هزّ» لمحاكاة حركةٍ سريعة.

٢تحريك عنصر بالإمالة

نربط موضع عنصرٍ بقيمة الإمالة: كرةٌ «تتدحرج» باتجاه الميل. نستخدم transform: [{ translateX }, { translateY }]:

import { View, StyleSheet } from 'react-native';import { useTilt } from 'smartdevice'; export default function App() {  const tilt = useTilt();  const dx = tilt.x * 2;              // كبّر الأثر  const dy = tilt.y * 2;  return (    <View style={styles.arena}>      <View style={[styles.ball, { transform: [{ translateX: dx }, { translateY: dy }] }]} />    </View>  );} const styles = StyleSheet.create({  arena: { height: 220, margin: 12, borderRadius: 16, backgroundColor: '#FFF3E0', alignItems: 'center', justifyContent: 'center', overflow: 'hidden' },  ball: { width: 44, height: 44, borderRadius: 22, backgroundColor: '#E8820C' },});

أمِل الجهاز (المنزلقان) فتتحرّك الكرة. هذا جوهر ألعاب الإمالة.

٣أداة المستوى (الميزان)

تطبيقٌ عمليّ: نعتبر الجهاز «مستويًا» إذا كان الميل قريبًا من الصفر على المحورين، فنغيّر اللون والرسالة:

import { View, Text, StyleSheet } from 'react-native';import { useTilt } from 'smartdevice'; export default function App() {  const { x, y } = useTilt();  const level = Math.abs(x) <= 3 && Math.abs(y) <= 3;  return (    <View style={[styles.box, { backgroundColor: level ? '#C8E6C9' : '#FFCDD2' }]}>      <Text style={styles.t}>{level ? '✅ مستوٍ' : '↕ مائل'}</Text>      <Text style={styles.s}>x={x}°  y={y}°</Text>    </View>  );} const styles = StyleSheet.create({  box: { padding: 30, alignItems: 'center', borderRadius: 16, margin: 12 },  t: { fontSize: 26, fontWeight: 'bold' },  s: { marginTop: 8, color: '#444' },});

اجعل المنزلقين قرب الصفر ليصبح «مستوٍ». هذا منطق أداة المستوى الحقيقية.

توقّع وتحقّق

مستشعر التسارع يقيس:

كم محورًا يعيد useTilt؟

لتحريك عنصرٍ بالإمالة نستخدم:

لفحص «قرب الصفر» نستخدم:

الخلاصة

تحدٍّ برمجي: مؤشّر اتجاه الميل

متوسط

اقرأ الإمالة واعرض اتجاهها نصًّا.

المطلوب:
  • استورد useTilt من smartdevice.
  • <Text testID="x"> يعرض قيمة x.
  • <Text testID="dir">: إن كان x موجبًا «يمين»، سالبًا «يسار»، صفرًا «وسط».
👀 اعرض الناتج المطلوب (وجرّبه)
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء في Console
  • x الابتدائيّ صفر
  • الاتجاه الابتدائيّ «وسط»
  • استُخدم useTilt

💡 تلميح 1
الإمالة الابتدائيّة x=0 فالاتجاه «وسط».
💡 تلميح 2
شرط ثلاثيّ: x > 0 ? … : x < 0 ? … : ….

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

import { View, Text, StyleSheet } from 'react-native';import { useTilt } from 'smartdevice'; export default function App() {  const { x } = useTilt();  const dir = x > 0 ? 'يمين' : x < 0 ? 'يسار' : 'وسط';  return (    <View style={{ padding: 20 }}>      <Text testID="x" style={styles.v}>x = {x}°</Text>      <Text testID="dir" style={styles.d}>{dir}</Text>    </View>  );} const styles = StyleSheet.create({  v: { fontSize: 22, fontWeight: 'bold', color: '#E8820C' },  d: { fontSize: 18, marginTop: 6 },});
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس