abovebelow
myAnglemyEnergyballpaddleunitVectorgravitygravityVectorcollision
let myAngle = 0;
let myEnergy = 0.01;
let ball;
let paddle;
let unitVector;
function setup() {
createCanvas(400, 240);
noFill();
d = width / 10;
ball = {
pos: createVector(
random(-width / 3, width / 3),
random(-width / 3, width / 3)
),
vel: createVector(random(-1.5, 1.5), random(-1.5, 1.5)),
diam: 10
};
paddle = {
p1: createVector(0, 0),
p2: createVector(0, 0),
mid: createVector(0, 0)
};
}
function draw() {
let gravity = 1;
if(keyIsPressed && keyCode===32){
gravity = 5;
}
let gravityVector = p5.Vector.normalize(ball.pos).mult(-random(0.01, 0.1) * gravity);
ball.pos.add(ball.vel);
ball.vel.add(gravityVector);
deltaAngle = Math.atan(2) / 2;
translate(width / 2, height / 2);//origin in the middle
background(180, 180, 180);
noFill();
paddle.p1 = createVector(
d * cos(myAngle + deltaAngle),
d * sin(myAngle + deltaAngle)
);
paddle.p2 = createVector(
d * cos(myAngle - deltaAngle),
d * sin(myAngle - deltaAngle)
);
paddle.mid = createVector(d * cos(myAngle) * 0.85, d * sin(myAngle) * 0.85);
circle(0, 0, 5);
line(0, 0, paddle.mid.x, paddle.mid.y);
line(paddle.p1.x, paddle.p1.y, paddle.p2.x, paddle.p2.y);
fill(60);
circle(ball.pos.x, ball.pos.y, ball.diam);
collision();
}
function mouseWheel(event) {
myAngle += event.delta / 40;
paddle.angVel = event.delta / 40;
}
function collision() {
x1 = paddle.p1.x - ball.pos.x;
y1 = paddle.p1.y - ball.pos.y;
x2 = paddle.p2.x - ball.pos.x;
y2 = paddle.p2.y - ball.pos.y;
dx = x2 - x1;
dy = y2 - y1;
dr = sqrt(dx * dx + dy * dy);
D = x1 * y2 - x2 * y1;//dot
r = ball.diam / 2;
delta = r * r * dr * dr - D * D;
xcond = (0 >= x1 && 0 <= x2) || (0 >= x2 && 0 <= x1);
ycond = (0 >= y1 && 0 <= y2) || (0 >= y2 && 0 <= y1);
if (delta >= 0 && xcond) {
normx = -dy / dr;
normy = dx / dr;
dotMe = ball.vel.x * normx + ball.vel.y * normy;
ball.vel.x = ball.vel.x - 2 * dotMe * normx;
ball.vel.y = ball.vel.y - 2 * dotMe * normy;
} else {
}
if (ball.pos.x >= width / 2 - ball.diam) {
ball.vel.x = ball.vel.x * -1;
ball.pos.x = width / 2 - ball.diam - 1;
}
if (ball.pos.x <= -width / 2 + ball.diam) {
ball.vel.x = ball.vel.x * -1;
ball.pos.x = -width / 2 + ball.diam + 1;
}
if (ball.pos.y >= height / 2 - ball.diam) {
ball.vel.y = ball.vel.y * -1;
ball.pos.y = height / 2 - ball.diam - 1;
}
if (ball.pos.y <= -height / 2 + ball.diam) {
ball.vel.y = ball.vel.y * -1;
ball.pos.y = -height / 2 + ball.diam + 1;
}
}