Начиная с кода операции, здесь приведен пример, который позволяет шарику скользить по веревке, как если бы веревка продевалась через шар и имела узел на конце.
var compound;
function Compound(){
this.pinDiameter = 25;
this.pinx = width/2;
this.piny = this.pinDiameter;
this.ballDiameter = 50;
this.ballx = width/2;
this.bally = this.ballDiameter + this.pinDiameter * 2;
this.ballSpeed = 1;
this.ropeWidth = 4;
this.ropeHeight = 200;
this.ropex = this.pinx - this.ropeWidth/2;
this.ropey = this.piny;
this.updatePin = function(){
}
this.updateBall = function(){
if (this.bally < this.piny + 200){
this.ballSpeed = this.ballSpeed + 1;
this.bally = this.bally + this.ballSpeed;
}
}
this.updateRope = function(){
}
this.show = function(){
ellipse(this.pinx, this.piny, this.pinDiameter);
fill(255);
noStroke();
ellipse(this.ballx, this.bally, this.ballDiameter);
fill(255);
noStroke();
rect(this.ropex, this.ropey, this.ropeWidth, this.ropeHeight);
fill(255);
noStroke();
}
}
function setup() {
createCanvas(600, 600);
compound = new Compound();
setFrameRate(1);
}
function draw() {
background(0);
compound.updatePin()
compound.updateBall()
compound.updateRope()
compound.show()
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.3/p5.js"></script>
Главное изменение здесь, в обновлении, где мы должны проверить, что мяч не сошел с веревки.Мы также инициализируем положение мяча вблизи вершины веревки, чтобы мы могли наблюдать за его скольжением.
this.updateBall = function(){
if (this.bally < this.piny + 200){
this.ballSpeed = this.ballSpeed + 1;
this.bally = this.bally + this.ballSpeed;
}
}