الإمالة والحركة: مستشعر التسارع
قراءة الميل وبناء ألعاب وأدوات تتفاعل مع الحركة. ⏱ نحو 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يعيد{ x, y }بالدرجات.transform: [{ translateX }, { translateY }]يحرّك العنصر بالميل.Math.abs(x)وMath.abs(y)قرب الصفر = الجهاز مستوٍ.
تحدٍّ برمجي: مؤشّر اتجاه الميل
متوسطاقرأ الإمالة واعرض اتجاهها نصًّا.
- استورد
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 },});