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