어떤 개념 설명하지만, 임의의 관측의 무리 :
나는 캔버스 너비/높이 변수를 추가하고 입자의 위치에 그들을 비교하는 것을 권 해드립니다. 지금은 입자가 캔버스에서 떨어져도 떨어지지 않습니다. 같은 뭔가 :
if(particles[i][1] > height)
particles.splice(i,1);
newPY < objects[k][2] + objects[k][3] + radius
정말 이상해. 이게 뭐야? 물체의 너비와 높이 및 입자 반경 추가하기? 이 부분을 제거하면 파티클은 "기세"가있는 한 오브젝트에서 튀어 나옵니다.
운동량에 대해서는 입자가 입자를 통과하여 떨어지는 것을 방지하는 방법을 알아 내려한다고 가정합니다. 현재 코드를 감안할 때, 저는 이것을 할 것입니다 : 파티클에 다섯 번째 변수를 추가하고 캔버스의 높이를 기본값으로 설정하십시오. 그런 다음, 영향을 미쳤다는 것을 알게되면 입자에 충격 위치를 저장하고 루프 후에 입자가 그 지점 아래에 있는지 확인하십시오. 그렇다면 그 지점으로 재설정하십시오. 더러운 수정,하지만, 이봐, 작동합니다. 아래에 완전한 루프를 추가하여 저에게 효과적이었습니다. clearRect 메소드로 객체를 지우지 않으려면 객체를 다시 그릴 수 있습니다.
당신은 객체의 상단에 입자를 확인하고 있습니다,하지만 난 가정 측면 당신이 순간 너무 너무 중요하지,에 대해 질문 버그의 일부입니다 "를 통해 떨어지는"
particles[i][1] < objects[k][1] + objects[k][3] + radius
그러나 주위를 놀고 중력을 줄이기로 결정한 경우 입자가 대신 운동량을 얻고 위의 개체에 대해 튀어 오를 수 있습니다. 당신의 objCheck 변수로
, 당신은 마지막 & & 부분에 Y의 폭을 혼동. 그것은해야한다 :
mY < objects[i][1] + objects[i][3] + radius
대신 지금
mY < objects[i][2] + objects[i][3] + radius
의, 당신의 objCheck가 작동하지 않습니다.
또한
for(var i=0; i < particles.length; i++) {
var clrRadius = 2*radius;
canvas.clearRect(particles[i][0]-radius, particles[i][1]-radius, clrRadius, clrRadius);
}
더 이상
for(var i=0; i < particles.length; i++){
var clrRadius = radius + 4;
canvas.clearRect(particles[i][0]-(clrRadius/2), particles[i][1]-(clrRadius/2), clrRadius, clrRadius);
}
편집입니다 : 내가 마지막으로 확인하기 때문에 당신이 코드를 변경 같다, 그래서 위에서 더 이상 관련이 없을 수도 있습니다!
edit2 : 추가 입자 정지 수정. 여기에 완전한 중력 루프가 있습니다 :
for(var i=0; i<particles.length; i++){
var clrRadius = 2*radius;
canvas.clearRect(particles[i][0]-radius, particles[i][1]-radius, clrRadius, clrRadius);
}
for(var i=0; i < particles.length; i++){
var newPY = particles[i][1] += particles[i][2] + particles[i][3];
for(var k=0; k<objects.length; k++){
if(
//particle
particles[i][0] > objects[k][0] - radius &&
particles[i][0] < objects[k][0] + objects[k][2] + radius &&
particles[i][1] > objects[k][1] - radius &&
particles[i][1] < objects[k][1] + objects[k][3] + radius //&&
){
//reverse gravity
particles[i][2] = particles[i][2] * -1;
particles[i][5] = objects[k][1] - radius;
}
}
particles[i][2] += particles[i][3]*weight;
particles[i][1] += particles[i][2];
if(particles[i][1] > particles[i][5])
particles[i][1] = particles[i][5];
if(particles[i][1] > height)
particles.splice(i,1);
}
for(var i=0; i <particles.length; i++){
canvas.fillStyle = "#000";
canvas.beginPath();
canvas.arc(particles[i][0], particles[i][1], radius, 0, Math.PI*2, true);
canvas.closePath();
canvas.fill();
}
이것은 내 문제를 해결하지 못합니다. 문제는 충돌 감지 자체에 있습니다. – maxhud