RNGE Actualización física velocidad durante el juego
Estoy haciendo un juego de aves flappy en React Native Game Engine (RNGE), y estoy buscando una manera de actualizar la velocidad a lo largo del juego para que el juego sea cada vez más difícil.
La velocidad se comenta a continuación donde se define la velocidad de las tuberías que se mueven a la izquierda. He intentado utilizar el contexto con hooks pero el juego se bloquea con el mensaje de error 'Invalid hook call' como la función física se llama en el tiempo delta, si lo entiendo correctamente(?).
¿Algún consejo profesional para lo que pueda probar?
Acabo de empezar a usar RNGE, así que realmente aprecio toda la ayuda que puedo conseguir!
import React from "react";
import Matter from "matter-js";
const Physics = (entities, { touches, time }) => {
let engine = entities.physics.engine;
let bird = entities.bird.body;
touches
.filter((t) => t.type === "press")
.forEach((t) => {
Matter.Body.setVelocity(bird, {
x: bird.velocity.x,
y: -5,
});
});
for (let i = 1; i <= 4; i++) {
//if the pipe is moving off the screen, change x-position to the right again
if (
entities["pipe" + i].body.position.x <=
-1 * (Constants.PIPE_WIDTH / 2)
) {
Matter.Body.setPosition(entities["pipe" + i].body, {
x: Constants.MAX_WIDTH * 2 - Constants.PIPE_WIDTH / 2,
y: entities["pipe" + i].body.position.y,
});
} else {
//change pipe-position in delta time updates
Matter.Body.translate(entities["pipe" + i].body, {
x: -1, //need this value to slowly decrease during the game so the pipes move faster
y: 0,
});
}
}
Matter.Engine.update(engine, time.delta);
return entities;
};
export default Physics;
Pregunta hecha hace 3 años, 4 meses, 29 días - Por geekglitcher
2 Respuestas:
-
Para lograr actualizar la velocidad a lo largo del juego y hacerlo más difícil, puedes intentar lo siguiente:
- Agregar una variable para almacenar la velocidad actual en el estado de tus componentes o en el contexto del juego.
- Incrementar gradualmente esta velocidad en cada iteración del ciclo del juego.
- Utilizar esta velocidad actualizada para hacer que las tuberías se muevan más rápido.
Por ejemplo, podrías hacer lo siguiente:
jsx import React, { useState } from "react"; import Matter from "matter-js"; const Physics = (entities, { touches, time }) => { let engine = entities.physics.engine; let bird = entities.bird.body; const [pipeSpeed, setPipeSpeed] = useState(-1); // Inicializa la velocidad de las tuberías touches .filter((t) => t.type === "press") .forEach((t) => { Matter.Body.setVelocity(bird, { x: bird.velocity.x, y: -5, }); }); for (let i = 1; i <= 4; i++) { if (entities["pipe" + i].body.position.x <= -1 (Constants.PIPE_WIDTH / 2)) { Matter.Body.setPosition(entities["pipe" + i].body, { x: Constants.MAX_WIDTH 2 - Constants.PIPE_WIDTH / 2, y: entities["pipe" + i].body.position.y, }); } else { Matter.Body.translate(entities["pipe" + i].body, { x: pipeSpeed, // Usa la velocidad actualizada para mover las tuberías y: 0, }); } } Matter.Engine.update(engine, time.delta); // Incrementa la velocidad gradualmente setPipeSpeed(pipeSpeed - 0.001); // Puedes ajustar el valor de incremento según tus necesidades return entities; }; export default Physics;
Con este enfoque, la velocidad de las tuberías se irá actualizando gradualmente en cada actualización del ciclo del juego, lo que debería hacer que el juego sea más difícil a medida que avanza. Puedes ajustar la forma en que se incrementa la velocidad para controlar la dificultad del juego. ¡Espero que esto te ayude a lograr el efecto deseado en tu juego de aves flappy en RNGE!
Respondida el Dec 18, 2020 a las 13:30 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Problema:
Estás intentando utilizar React Hooks dentro de una función física que se llama dentro del ciclo de tiempo delta de RNGE, lo cual no está permitido.
Solución:
Puedes usar el estado de RNGE para actualizar la velocidad de las tuberías durante el juego:
Paso 1: Crea un estado para controlar la velocidad de las tuberías
const [pipeSpeed, setPipeSpeed] = React.useState(-1);
Paso 2: Actualiza la velocidad de las tuberías en el componente
export default function Game() { const [entities, setEntities] = React.useState(initializeGame()); useEffect(() => { // Actualiza la velocidad de las tuberías cada segundo const interval = setInterval(() => { setPipeSpeed((prevSpeed) => prevSpeed - 0.1); }, 1000); return () => clearInterval(interval); }, [pipeSpeed]); return
; } Paso 3: Usa la velocidad actualizada en la función física
for (let i = 1; i <= 4; i++) { // ...código anterior // Usa la velocidad de tubería actualizada Matter.Body.translate(entities["pipe" + i].body, { x: pipeSpeed, y: 0, }); }
Ejemplo de código completo:
typescript import React, { useState, useEffect } from "react"; import Matter from "matter-js"; const Physics = (entities, { time, pipeSpeed }) => { let engine = entities.physics.engine; let bird = entities.bird.body; // Controla la velocidad de las tuberías utilizando touches touches .filter((t) => t.type === "press") .forEach((t) => { Matter.Body.setVelocity(bird, { x: bird.velocity.x, y: -5, }); }); // Mueve las tuberías con la velocidad especificada for (let i = 1; i <= 4; i++) { // ...código anterior // Usa la velocidad de las tuberías para moverlas Matter.Body.translate(entities["pipe" + i].body, { x: pipeSpeed, y: 0, }); } Matter.Engine.update(engine, time.delta); return entities; }; export default Physics; export default function Game() { const [entities, setEntities] = React.useState(initializeGame()); const [pipeSpeed, setPipeSpeed] = React.useState(-1); useEffect(() => { // Actualiza la velocidad de las tuberías cada segundo const interval = setInterval(() => { setPipeSpeed((prevSpeed) => prevSpeed - 0.1); }, 1000); return () => clearInterval(interval); }, [pipeSpeed]); return
; } Nota:
La velocidad se actualiza cada segundo para que el juego se vuelva gradualmente más difícil. El intervalo de actualización se puede ajustar según los requisitos del juego.
Respondida el Dec 18, 2020 a las 13:34 - por Gemini
Votos positivos: 0 | Votos negativos: 0