Movimento Balístico e Colisão Versao II
//movimento balístico e colisão com velocidade e angulo
float relogio;
float clock;
float intervalo = 10; //intervalo de tempo incrementado - quanto menos melhor decomposto é o movimento e mais rapido a execução
float an=75; //angulo de lançamento - esta em graus e deve ser convertido para radianos
float v=90; //velocidade do lançamento
float dY;
float vX= cos(radians(an))*v; //decomposição para o eixo x dos valores introduzidos acima - conversao do ang para radiandos
float vY0= sin(radians(an))*v; //decomposição para o eixo y dos valores introduzidos acima - conversao do ang para radiandos
float a=-9.8; //aceleração
float dX=0; // distância do x, ponto de origem
float t=0;
int contador = 0;
float linha =0;
int altura=50;
int largura=50;
int paddleX;
int paddleY;
float[] x = new float[300]; //esse vetor irá armazenar as posições no eixo x as quais eu quero que seja desenhada um ponto da trajetória
float[] y = new float[300]; //esse vetor é a mesma coisa do anterior sendo que para o eixo y
void setup(){
relogio = millis();
size(600,600);
background(#302239);
}
void draw(){
if(millis()>relogio + intervalo){
relogio=millis();
moveBolaMRUVV(); //função que faz com que a bola se mexa e crie a trajetória
t=t+0.1; // esse valor deve ser ajustado em conjunto com o valor de 'intervalo' - as duas se completam para decompormelhor o movimento e executar mais rapidamente
}
//desenhando alvo
paddleX=(width/2)-(largura/2);
paddleY=(height/2)-(altura/2);
noStroke();
fill(#8D3736);
rect(paddleX, paddleY, largura, altura);
/*if (collision()){
println("bateu no aviao");
fill(#C54F4D);
noStroke();
ellipse(dX, height-dY,70,70);
}*/
}
void moveBolaMRUVV(){
//nova posição do projétil
dY=(vY0*t)+((a*t*t)/2); //Essa é a formula do MRUVV (Mov Retilineo Uniformemente Variado Vertical)
dX=vX*t; //Essa é fórmula do MRUH(Movimento Retilínio Uniforme Horizontal). Ela varia o "x" da elipse e tem uma velocidade x própria
//background(#302239);
desenharGrid();
fill(#DEA383);
noStroke();
//aqui eu atribuo aos vetores, as posições que eu quero que a trajetoria seja desenhada
if (millis()>clock+intervalo*10){ //esse valor de 10 regula o espaçamento entre um ponto e outro da trajetoria
clock=millis();
x = append(x, dX); //essa função append serve para armazenar um novo valor ao final do vetor x
y = append(y, dY); //essa função append serve para armazenar um novo valor ao final do vetor y
ellipse(dX ,height-dY,25,25); //redesenho a ellipse como trajetória
}
//nessa parte a trajetória é repreenchida descarregando o valor dos vetores x e y
//até que o contador estoure a capacidade do vetor
if(contador<x.length){
for (int i=0;i<contador;i++){
fill(255, 50);
ellipse(x[i], height-y[i],largura/4, altura/4);
}
contador++;
}
}
void desenharGrid(){
for (linha=0; linha <= 800; linha=linha + 100){
line(linha,0,linha,800);
line(0,linha,800,linha);
stroke(#FDF2D6);
}
}
//detecção de colisão
boolean collision() {
return (dX > paddleX) && (height-dY >= paddleY) && (height-dY <= paddleY + altura) && (dX<=paddleX+largura); //retorno verdadeiro ou falso se a posição da bola entrar ou invadir a área do padle.
}