 E aí, meu nome é Henrique e nesse vídeo a gente vai fazer uma caixa de seleção, uma mecânica bem comum em jogos de estratégia em tempo real, tipo Dota 2, Warcraft, Starcraft, Joffin Pies etc. Ela funciona de um jeito bem simples, tudo o que está dentro da caixa vai ser selecionado, tudo o que está fora da caixa vai ser desselecionado. Isso dá maior controle para o jogador sobre as unidades que estão na tela, ele pode selecionar múltiplas unidades e aí definir o comportamento delas de acordo com a preferência dele. A gente precisa que a caixa seja desenhada na tela de acordo com a posição do mouse, que vai ajudar aí o começo quando o jogador clicar e o final da caixa de acordo com que ele for arrastando o mouse. Para desenhar a nossa caixa de seleção a gente vai estar usando aqui qualquer uma das classes que herdem aqui a nossa class control, porque ela possui duas funções que servem justamente para a gente definir o começo, que é essa Function Set Begin e o final da nossa caixa de seleção, que é essa Function Set End. Já para a gente estar monitorando aí os nossos eventos do mouse, eu vou estar usando uma função que foi liberada uma versão não oficial do Godot, eu vou estar deixando o link dela na descrição e essa função retorna verdadeiro só no frame que o evento aconteceu. Então ela não fica monitorando constantemente o evento caso ele seja pressionado, porém a gente vai usar também a função que monitora constantemente se um evento está acontecendo. Para a gente estar pegando a posição do mouse a gente vai estar usando a função do canvas item, essa função já está presente no control porque teoricamente ele erra dessa função do canvas item, porque control é uma classe filha da classe canvas item. Para o nosso script eu vou estar usando aqui o node ColorFrame, ele é basicamente um quadro que aplica uma cor dentro do retângulo de influência dele, porém vocês aí podem estar usando qualquer outra classe filha da classe control, até por isso eu vou estar usando aqui no nosso script que ele estende control para facilitar. Daí a gente vai declarar duas variáveis, uma para a posição inicial e uma para a posição atual do mouse, vamos ligar também o input process na função ready e dentro do callback do input process a gente vai chamar a função que vai criar a caixa. Para criar a nossa caixa a gente vai estar usando aquela função lá da classe impute, a is action just press it, monitorando o evento do botão esquerdo do mouse, e aí caso o botão tenha acabado de ser pressionado ele vai atribuir a variável initial position a posição do mouse atual na tela. Daí enquanto o botão esquerdo do mouse estiver sendo pressionado a gente vai atribuir a variável grant pos, a posição atual do mouse na tela e caso o botão esquerdo seja solto a gente pare de pressionar ele a gente vai estar colocando a posição tanto de começo quanto de final do retângulo para ser 0x0, para ele sumir da tela, o resultado vai ficar assim, só que a gente ainda tem um problema para resolver, a caixa não está sendo atribuída em todas as direções, ela está sendo desenhada de cima para baixo e da esquerda para a direita da posição onde o jogador acabou de clicar, então a gente precisa fazer com que ela desenhe em todas as direções, para isso a gente vai estar usando duas funções nativas aqui do dd script, que são as funções de min e max, elas pegam o valor mínimo entre dois ou mais valores e o valor máximo entre dois ou mais valores, e a gente vai usar essas duas funções quando o jogador tiver com o botão esquerdo pressionado, a gente vai estar verificando qual que é o menor valor e atribuindo ele a posição inicial, qual que é o maior valor e atribuindo ele a posição final, aí vai ficar assim do jeito que a gente queria que ficasse, bom depois disso a gente precisa entender mais uma coisa sobre caixa de seleção, o principal objetivo é que ela selecione o sol que está dentro da caixa, até agora a gente só fez desenhar a caixa, então agora é a parte principal dessa mecânica, para a gente estar podendo fazer uso dessa mecânica também com objetos 3d a gente vai precisar fazer o uso da classic camera, porque vai ser ela que vai desprojetar a posição 3d dos objetos, em coordenadas 2d na tela e a nossa caixa, a nossa caixa de seleção, ela só funciona com coordenadas em tela, ou seja, bidimensionais, para isso a gente vai usar a função unprojectposition, que recebe como argumento uma posição 3d, um vector tree, e retorna uma posição 2d, um vector 2, já para a gente saber se essa posição 2d é esse vector 2, está dentro do nosso retângulo, a gente vai fazer o uso da classe rect2, que é justamente a classe que cria os retângulos lá da nossa caixa, ela tem uma função chamada RESTPOINT, essa função ela verifica se um ponto coincide com um que esteja dentro do retângulo, e ela retorna verdadeiro ou falso, voltando para nosso script a gente vai declarar uma variável referente ao path do node da câmera, e também uma variável para o node em si, vamos deixar declarado também uma variável que é um array, vai ser referente aos objetos selecionáveis da cena, no callback da function array a gente vai estar verificando se o camera path não é vazio, ou seja, se tem alguma câmera designada para esse script, se tiver então a gente vai atribuir ela a variável câmera, se não tiver, ou seja, se ele for nulo, então a gente não precisa designar nenhuma câmera, agora para a gente estar selecionando todos os objetos dentro da nossa caixa de seleção a gente vai estar pegando esse retângulo, referente a nossa caixa de seleção, através dessa variável separate, e a gente vai estar usando um loop que vai passar por todos os objetos do array que a gente criou lá em cima, dentro desse loop a gente vai estar verificando duas coisas, se o objeto estende spatial, spatial é a classe que deriva todos os outros objetos tridimensionais, então sempre que a gente tiver um objeto tridimensional, ou seja, um objeto spatial, a gente vai estar fazendo essa linha de código aqui, e a segunda coisa que a gente vai verificar é se o objeto está dentro da nossa caixa de seleção, para essa parte aqui do script vocês podem estar fazendo do jeito que vocês quiserem, mas eu vou estar emitindo um sinal no objeto dentro aqui do nosso array, mas vocês podem estar usando uma variável boleana ou um método dentro do objeto, qualquer coisa aí vai depender do padrão de design de vocês, no meu caso eu vou estar emitindo um sinal e esse sinal ele pede um argumento boleano, ou seja, vai ser verdadeiro ou falso, o nome do sinal é select, e aí eu vou estar retornando o seguinte argumento, na verdade é o resultado dessa função aqui, da função response, ela retorna boleano, só que ela pede um valor de vector 2, ou seja, um valor pidimensional, e a gente vai estar convertendo a origem do objeto tridimensional através dessa função getTransform.org, passando aqui para a nossa função um projectPosition, e então a gente vai estar verificando se esse ponto pidimensional está dentro do retângulo da nossa caixa de seleção, e como essa função ela retorna verdadeiro ou falso, então eu já cumpri aqui com os requisitos do meu sinal. Já para os objetos pidimensionais, a gente vai estar verificando se eles estendem canvasItem, que como a gente viu é a classe pai de todos os objetos pidimensionais, e aí a gente só precisa estar passando aqui para a nossa verificação do retângulo a posição do objeto normal, não precisa converter nada porque ela já retorna uma posição pidimensional, vector 2. Bom, com isso a gente termina aqui a nossa caixa de seleção, e ela vai estar pegando todos os objetos visíveis para o jogador, ou seja, tanto objetos 3D, porque ela vai estar reconhecendo objetos special, quanto objetos 2D, que ela reconhece tanto canvasItem, quanto node2D, então ela está englobando tudo aí que está visível para o jogador. Se a gente vai dar do certo, a caixa vai estar funcionando perfeitamente, tanto objetos 2D quanto 3D. Prova de as 3D a gente só precisa colocar a nossa câmera na cena. Qualquer dúvida pode me postar aí nos comentários que eu vou responder, ou pelo menos tentar. Galera, eu abri uma página no Patreon, é isso aí, se vocês quiserem apoiar o canal e ajudar a gente a estar melhorando cada vez mais o conteúdo e a qualidade dos vídeos, vai lá no Patreon, dá aquela ajuda para a gente, tem vários tipos de retribuições lá, tem a sociedade secreta aqui do nosso canal lá no Discord, que é para a galera que ajuda a gente no Patreon, então dá uma olhada lá, acho que vocês vão se interessar. A página é essa que está aí na tela e tem o link também na descrição do vídeo. Bom galera, é isso aí, nos vemos na próxima semana e continue desenvolvendo. FALO U!