React Native + Matter.js
В этом нет ничего удивительного, но в настоящее время мобильные игры занимают лидирующие позиции в цифровом мире. Итак, я попытался найти вдохновение для создания игры, но в чем же захватывающий факт этой игры? Да! вы правильно поняли, что это сделано с использованием React Native.
Несомненно, эта игра не позволила бы вам оставить свои телефоны. Обдумывая дизайн этой игры и чтобы приветствовать игроков с вышеупомянутым чувством удивления, я решил придать физическим материалам более реалистичный вид, чем раньше.
Просто хочешь проверить код? Угощайся
Https://github.com/garganurag893/Game-Using-React-Native
Сложность создания игр - это синхронизировать всю логику, которую вы хотите применить, чтобы заставить вещи двигаться, например, в моем случае я хочу использовать гравитацию. React Native не предоставляет никаких функций для обеспечения гравитации, поэтому в этом случае мне пришла в голову идея использовать Matter.js.
Что такое Matter.js? Matter.js - это 2D-физический движок, который поможет нам добавить физику в React Native. Но один только файлatter.js не справится с этим, поэтому мы должны использовать react-native-game-engine, который поможет нам легко настроитьatter.js с React Native.
Итак, начнем с создания нового приложения:
npx react-native init GameApp
Теперь нам нужно добавить react-native-game-engine и Matter.js:
npm install matter-js react-native-game-engine --save
Всегда полезно начинать писать код в правильной структуре папок, чтобы сэкономить время на рефакторинге кода. Вы можете следовать любой структуре папок, которую хотите использовать, я буду следовать приведенной ниже структуре папок:
Теперь пришло время, наконец, начать кодировать ... Нам нужно создать мир и добавить к нему самолет.
App.js ☟
src / entity / index.js ☟
src / components / Plane.js ☟
Теперь давайте просто добавим немного физики, чтобы гравитация могла творить чудеса… ✨
По умолчанию Matter предоставляет миру гравитацию 1.0, но для большей гладкости мы установим ее на 0.25. Теперь мы будем использовать функцию обновления материи.js, которая обновит последнее значение всех сущностей, присутствующих в его мире, и будет обернута в свойства системы RNGE, которые вызывают переданный набор функций в цикле периода.
Обновите App.js ☟
import Systems from './src/systems'; <GameEngine ref={(ref) => { this.gameEngine = ref; }} style={styles.gameContainer} running={this.state.running} systems={Systems} entities={this.entities}> </GameEngine>
src / systems / index.js ☟
import Physics from './physics'; export default [Physics];
src / systems / Physics.js ☟
Пришло время заставить этот самолет летать… 🚀
Matter.js предоставляет несколько функций, с помощью которых мы можем решить эту проблему. Тот, который мы собираемся использовать, это setVelocity, который может вызываться при прикосновении к экрану, и здесь RNGE играет свою роль, предоставляя нам событие касания.
src / systems / plane.js ☟
Обновите src / systems / index.js:
import Physics from './physics'; import Plane from './plane'; export default [Physics, Plane];
Теперь пришло время добавить пол и потолок, чтобы мы могли определять, когда происходит столкновение, иначе наш самолет никогда не перестанет падать ...
src / components / Floor.js ☟
src / components / Ceiling.js ☟
Обновите src / entity / index.js ☟
import Floor from '../components/Floor'; import Ceiling from '../components/Ceiling'; Floor: Floor(world,'white',{x: width / 2, y: height - 50},{height: 100, width: width}), Ceiling: Ceiling(world,'white',{x: width / 2, y: 0},{height: 100, width: width}),
В материи.js, применяя isStatic
, мы можем сделать пол и потолок статичными телами, которые никогда не могут менять положение или угол и полностью фиксированы. С помощью этого мы теперь можем предотвратить падение самолета или его пролет над нашей игровой зоной.
Пришло время сделать нашу игру более интересной, добавив препятствия и повысив уровень сложности.
src / components / Obstacle.js ☟
src / utils / random.js ☟
Мы будем использовать Math.random для получения разных размеров для каждого препятствия.
src / utils / constants.js ☟
const Constants = { TOP_PIPE_WIDTH: 250, BOTTOM_PIPE_WIDTH: 100, }; export default Constants;
Обновите src / entity / index.js ☟
import Obstacle from '../components/Obstacle'; import {getRandom,topObstacleHeight,topObstacleHeight} from '../utils/random'; import Constants from 'src/utils/constants'; Obstacle1: Obstacle(world,'top',{x: width * 2 - Constants.TOP_PIPE_WIDTH / 2, y: getRandom(100, 400)},{height: topObstacleHeight, width: Constants.TOP_PIPE_WIDTH}), Obstacle2: Obstacle(world,'bottom',{x: width - Constants.BOTTOM_PIPE_WIDTH / 2,y: getRandom(400, 700)},{height: bottomObstacleHeight, width: Constants.BOTTOM_PIPE_WIDTH}),
Но создания препятствий недостаточно, нам нужно перемещать эти препятствия и создавать бесконечные препятствия. Для достижения этой цели нам нужно использовать material.js.
src / systems / preventle.js ☟
Обновите src / systems / index.js:
import Physics from './physics'; import Plane from './plane'; import Obstacle from './obstacle'; export default [Physics, Plane, Obstacle];
Matter.js имеет функцию translate, с помощью которой мы можем изменить положение по заданному вектору относительно его текущего положения, не сообщая никакой скорости. Благодаря этому мы получаем иллюзию движущихся препятствий.
Если положение по оси X тела препятствия становится отрицательным по отношению к его ширине, это означает, что оно покинуло экран. В это время мы можем установить положение этого тела в 2 раза больше его исходной позиции, и поэтому этот цикл будет повторяться, делая его бесконечным.
Наконец, мы хотим проверить, когда произошло столкновение, чтобы мы могли остановить игру и объявить счет.
Matter.Events. On помогает передать функцию обратного вызова всякий раз, когда происходит определенное событие. С помощью этого метода мы легко можем добавить событие столкновения.
Обновите src / systems / .js:
Matter.Events.on(engine, 'collisionStart', (event) => { dispatch({ type: "game-over"}); });
Обновите App.js:
onEvent = e => { if (e.type === 'gameOver') { Alert.alert('Game Over'); this.setState({running: false,}); } }; <GameEngine ref={(ref) => { this.gameEngine = ref; }} style={styles.gameContainer} onEvent={this.onEvent} running={this.state.running} systems={Systems} entities={this.entities}> </GameEngine>
Ыйыыыы !!! Мы нашли новую игру, к которой можно пристраститься…