Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

como fazer a minha Array ler o evento.shiftkey

Objetivo fazer a bolinha virar um balão

<canvas width="600" height="400"></canvas>

<script>
    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');

    pincel.fillStyle = 'grey';
    pincel.fillRect(0, 0, 600, 400);
    var raio = [10, 20]
    var raioAtual = 0 
    function desenhaCirculo(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = 'blue';
        pincel.beginPath();
        pincel.arc(x, y, raio[raioAtual], 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);

    }
function raioA () {

    raioAtual++

    if (raioAtual >= raio.length) {
     raio=0
    if (evento.shiftKey) {
     raioA = raioAtual + 30
      }
    }
}
    tela.onclick = desenhaCirculo;


</script>
1 resposta
solução!

Bom dia, Breno! Tudo bem?

Dei uma lida no seu código e testei aqui. Uma observação é que o array é só uma lista, ele não vai ler o evento shiftkey, quem tem que ler é o script em si =D

Quando testei realmente não acha o evento shiftkey, mas isso acontece pois ele está lá dentro da função raioA() e ela não está sendo chamada e nem enviado o evento pra ela. Então vamos resolver juntos!

Tem outros meios de fazer mas vou seguir com sua lógica para fazer os ajustes necessários:

1. Nossa função raioA() está sendo declarada mas não está sendo chamada. Por exemplo a desenhaCirculo(), tem a sua criação e é chamada no evento onclick, mas a raioA() não está em nenhum lugar.

Podemos resolver isso chamando dentro da desenhaCirculo(), e enviar o evento pra lá também (se não ele não vai funcionar o comando evento.shiftkey):

    function desenhaCirculo(evento) {
        raioA(evento);            <<<<<<<<<<
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = 'blue';
        pincel.beginPath();
        pincel.arc(x, y, raio[raioAtual], 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);

    }

2. Agora chamamos o que acontece lá dentro da função raioA(). Mas ainda temos alguns problemas.

Ao entrar o código já faz o comando raioAtual++. Esse comando vai fazer o raio[raioAtual] ir pro último item do array.

OBS: Um array começa na posição zero, então quando somar um na posição desse array com dois itens, ele vai pra posição 1 que é a final).

Valores1020
Posição01

Indo pra última posição, ele vai entrar na condicional if (raioAtual >= raio.length) que está zerando o raio e não o raioAtual (que serve pra pegar a posição no array).

function raioA (evento) {                            //como estamos enviando o evento, também botei pra receber

    raioAtual++                                                 // aumenta o [raioAtual] pra 1, e como o array [...]
                                                                               // começa em 0 já fomos pro ultimo lugar.

    if (raioAtual >= raio.length) {             // chegando no ultimo lugar
    raio=0                                                              // transformamos o array raio em zero

    if (evento.shiftKey) {
     raioA = raioAtual + 30
      }
    }

}

Pra ajustar isso, vamos transformar raio = 0 em raioAtual = 0.

3 - Até agora ele lê o shiftKey. Mas ainda não terminamos: dentro de if (evento.shiftKey) ele está tentando atribuir um valor para raioA. raioA é o nome da nossa função, e não de uma variável.

Nessa parte entramos em um dilema, você fez um array no inicio que limita os tamanhos da bola para [10, 20]. Na hora de desenhar o pincel, você chama o raio com raio[raioAtual], permitindo chamar só os valores de dentro do array raio.

Então, quando apertarmos o shift ele deveria aumentar pro raio 20? Ou devia ultrapassar os limites? Se ele deve aumentar pro raio 20, não devemos aumentar o raioAtual ao entrar na função e sim dentro da condição if (evento.shiftKey):

function raioA (evento) {

       if (evento.shiftKey) {
    raioAtual++ 
      }

    if (raioAtual >= raio.length) {
     raioAtual=0
    }
}

Desse modo, ele irá fazer a bolinha de raio 10 normalmente e quando clicar em shift ele irá fazer a bola de raio 20, depois voltando para o tamanho normal.

Isso seria um meio de solução mas depende muito da sua intenção pra alterar o que acontece dentro do raioA(). Pode alterar do jeito que quiser, agora o shiftkey está sendo detectado hehe

O código inteiro ficaria assim:

<canvas width="600" height="400"></canvas>

<script>
    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');

    pincel.fillStyle = 'grey';
    pincel.fillRect(0, 0, 600, 400);
    var raio = [10, 20]
    var raioAtual = 0 
    function desenhaCirculo(evento) {
        raioA(evento);
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = 'blue';
        pincel.beginPath();
        pincel.arc(x, y, raio[raioAtual], 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);

    }

function raioA (evento) {

    if (evento.shiftKey) {
    raioAtual++ 
    }
    if (raioAtual >= raio.length) {
     raioAtual=0
    }
}
    tela.onclick = desenhaCirculo;
</script>

Espero que tenha te ajudado a entender melhor sobre o código =)

Bons estudos!