Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

Quiero que la Diana no se salga del canvas

Pero solo puedo concretar los máximos disminuyendo 25 a los dos ejes, pero aunque pienso e intento no encuentro la forma de poder crear mínimos para evitar que se salga por la izquierda y por arriba. Me pueden ayudar a revisar la forma de solucionarlo?

<canvas width="600" height="400"> </canvas>
<script>
  var pantalla = document.querySelector("canvas");
  var pincel = pantalla.getContext("2d");
  pincel.fillStyle = "lightgrey";
  pincel.fillRect(0, 0, 600, 400);//dibuja rectangulo gris 
  var radio = 10;//variable del radio inicial, corresponde al circulo más pequeño
  var xAleatorio;//estas dos serán para las coordenadas aleatorias
  var yAleatorio;
  function disenharCircunferencia(x, y, radio, color) {
    pincel.fillStyle = color;//propiedad que llama al color traido como parámetro de la función
    pincel.beginPath();// Función q sirve para decirle al contexto del canvas que vamos a empezar a dibujar un camino
    pincel.arc(x, y, radio, 0, 2 * Math.PI);//método dibujar circulo, xy como centro, radio, ang inicial y ang final rad
    pincel.fill();//método que rellena el circulo creado anteriormente con el color de fillstyle
  }
  function limpiarPantalla() {
    pincel.clearRect(0, 0, 600, 400);//método q borra los píxeles de un rectángulo dado, x,y, width, height
  }
  function disenharObjetivo(x, y) {//los parémetros serán los valores de xy aleatorio de mas abajo
    disenharCircunferencia(x, y, radio + 20, "red");//Circunferencia más grande, como si fuera el fondo
    disenharCircunferencia(x, y, radio + 10, "white");// circunferencia mediana de la diana
    disenharCircunferencia(x, y, radio, "red");//la más pequeña se sobrepone , para denotar la accion del mouse
  }
  function sortearPosicion(maximo) {//el max esta definido más abajo, recibe ese valor para ejecutarse
    return Math.floor(Math.random() * maximo);//floor redondea hacia abajo, llega hasta maximo
  }
  function actualizarPantalla() {
    limpiarPantalla();
    xAleatorio = sortearPosicion(570);//envia 570 como max a la funcion en x y guarda el valor aleatorio x
    yAleatorio = sortearPosicion(370);//envia 370 como min a la funcion en y y guarda el valor aleatorio y
    disenharObjetivo(xAleatorio, yAleatorio);// los valores guardados anteriormente pasan a los parametros de la función
  }
  setInterval(actualizarPantalla, 1300);//hace q una función se repita con un tiempo de retraso entre cada ejecución mS
  function disparar(evento) {
    var x = evento.pageX - pantalla.offsetLeft;//Propiedad evento mouse que trar la coordenada horizontal y  el offsetLeft quita el marco o margen en izquierda
    var y = evento.pageY - pantalla.offsetTop;//Propiedad evento mouse que trar la coordenada vertical y el offsetTop quita el marco o margen de arriba
    if ((x < xAleatorio + radio) &&//condición para actuar en cualquier parte del circulo central
      (x > xAleatorio - radio) &&//es decir, dentro del perímetro del circulo entonces sera verdadero
      (y < yAleatorio + radio) &&
      (y > yAleatorio - radio)) {
      alert("Tiro Certero");//mensaje en pop-up al acertar en el centro con el clic del mouse
    }
  }
  pantalla.onclick = disparar;//Evento que ejecuta la función disparar cuando se da clic a un elemento
</script>
2 respuestas
solución!

Buenas, así como hay un valor máximo, deberías añadir un mínimo valor en la posición.

El mínimo debería ser mayor al tamaño de la diana, con el mayor igual, deberías restar el tamaño de la diana al valor máximo (aproximadamente).

function sortearPosicion(min, max) { 
          return Math.floor(Math.random() * (max - min + 1) + min);
    }

function actualizarPantalla(){
    limpiarPantalla();
    xAleatorio = sortearPosicion(50, 550);
    yAleatorio = sortearPosicion(50, 350);
    disenharObjetivo(xAleatorio,yAleatorio);
    x++;
}

Espero haber sido de ayuda, de ser así no olvides marcar como solucionado. Saludos :)

Muchas gracias lucas, aún estoy analizando como el random me devuelve los dos valores a la función pero funcionó. Saludos.