Javascript 当球触地时只发出一次声音
我想在球第一次落地时播放声音,就这样。但即使球停在地上,它也会不断重放。我在循环函数中播放声音。我希望这样,当球静止在地面上时,声音就不会发出。我试着让球在x&y方向的速度为0时,停止声音,但它继续播放。我想这是因为它在一个循环中,但我想不出一个方法使它值得Javascript 当球触地时只发出一次声音,javascript,html,audio,Javascript,Html,Audio,我想在球第一次落地时播放声音,就这样。但即使球停在地上,它也会不断重放。我在循环函数中播放声音。我希望这样,当球静止在地面上时,声音就不会发出。我试着让球在x&y方向的速度为0时,停止声音,但它继续播放。我想这是因为它在一个循环中,但我想不出一个方法使它值得 function getMousePosition(e) { mouse.x = e.pageX - canvas.offsetLeft; mouse.y = e.pageY - canvas.offsetTop; } va
function getMousePosition(e) {
mouse.x = e.pageX - canvas.offsetLeft;
mouse.y = e.pageY - canvas.offsetTop;
}
var mouseDown = function(e) {
if (e.which == 1) {
getMousePosition(e);
mouse.isDown = true;
ball.position.x = mouse.x;
ball.position.y = mouse.y;
}
}
var mouseUp = function(e) {
if (e.which == 1) {
mouse.isDown = false;
ball.velocity.y = (ball.position.y - mouse.y) /10;
ball.velocity.x = (ball.position.x - mouse.x) / 10;
}
}
var setup = function() {
canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
canvas.onmousemove = getMousePosition;
canvas.onmousedown = mouseDown;
canvas.onmouseup = mouseUp;
ctx.fillStyle = 'red';
ctx.strokeStyle = '#000000';
loopTimer = setInterval(loop, frameDelay);
}
var loop = function() {
if ( ! mouse.isDown) {
var Fx = -0.5 * Cd * A * rho * ball.velocity.x * ball.velocity.x * ball.velocity.x / Math.abs(ball.velocity.x);
var Fy = -0.5 * Cd * A * rho * ball.velocity.y * ball.velocity.y * ball.velocity.y / Math.abs(ball.velocity.y);
Fx = (isNaN(Fx) ? 0 : Fx);
Fy = (isNaN(Fy) ? 0 : Fy);
var ax = Fx / ball.mass;
var ay = ag + (Fy / ball.mass);
ball.velocity.x += ax*frameRate;
ball.velocity.y += ay*frameRate;
ball.position.x += ball.velocity.x*frameRate*100;
ball.position.y += ball.velocity.y*frameRate*100;
}
if (ball.position.y > height - ball.radius){
snd.play();
}
if (ball.velocity.x == 0 && ball.velocity.y == 0) {
snd.pause();
}
if (ball.position.y > height - ball.radius) {
ball.velocity.y *= ball.restitution;
ball.position.y = height - ball.radius;
}
if (ball.position.x > width - ball.radius) {
ball.velocity.x *= ball.restitution;
ball.position.x = width - ball.radius;
}
if (ball.position.x < ball.radius) {
ball.velocity.x *= ball.restitution;
ball.position.x = ball.radius;
}
ctx.clearRect(0,0,width,height);
ctx.save();
ctx.translate(ball.position.x, ball.position.y);
ctx.beginPath();
ctx.arc(0, 0, ball.radius, 0, Math.PI*2, true);
ctx.fill();
ctx.closePath();
ctx.restore();
ctx.fillStyle = "blue";
ctx.font = "20px Arial";
ctx.fillText(msg, 1300,20);
if (mouse.isDown) {
ctx.beginPath();
ctx.moveTo(ball.position.x, ball.position.y);
ctx.lineTo(mouse.x, mouse.y);
ctx.stroke();
ctx.closePath();
}
}
setup();
</script>
函数getMousePosition(e){
mouse.x=e.pageX-canvas.offsetLeft;
mouse.y=e.pageY-canvas.offsetTop;
}
var mouseDown=函数(e){
如果(e.which==1){
获取鼠标位置(e);
mouse.isDown=true;
ball.position.x=鼠标.x;
ball.position.y=鼠标.y;
}
}
var mouseUp=函数(e){
如果(e.which==1){
mouse.isDown=false;
ball.velocity.y=(ball.position.y-mouse.y)/10;
ball.velocity.x=(ball.position.x-mouse.x)/10;
}
}
var setup=function(){
canvas=document.getElementById(“canvas”);
ctx=canvas.getContext(“2d”);
canvas.onmousemove=getMousePosition;
canvas.onmousedown=mouseDown;
canvas.onmouseup=mouseUp;
ctx.fillStyle='红色';
ctx.strokeStyle='#000000';
loopTimer=设置间隔(循环、帧延迟);
}
var循环=函数(){
如果(!mouse.isDown){
var Fx=-0.5*Cd*A*rho*ball.velocity.x*ball.velocity.x*ball.velocity.x/Math.abs(ball.velocity.x);
var Fy=-0.5*Cd*A*rho*ball.velocity.y*ball.velocity.y*ball.velocity.y/Math.abs(ball.velocity.y);
Fx=(isNaN(Fx)?0:Fx);
Fy=(伊斯南(Fy)?0:Fy);
var ax=Fx/球质量;
var ay=ag+(Fy/球质量);
ball.velocity.x+=ax*帧速率;
ball.velocity.y+=ay*帧速率;
ball.position.x+=ball.velocity.x*帧率*100;
ball.position.y+=ball.velocity.y*帧率*100;
}
if(球位置y>高度-球半径){
snd.play();
}
if(ball.velocity.x==0&&ball.velocity.y==0){
暂停();
}
if(球位置y>高度-球半径){
ball.velocity.y*=ball.restoration;
ball.position.y=高度-ball.radius;
}
if(球位置x>宽度-球半径){
ball.velocity.x*=ball.restoration;
ball.position.x=宽度-ball.radius;
}
if(球位置x<球半径){
ball.velocity.x*=ball.restoration;
ball.position.x=ball.radius;
}
ctx.clearRect(0,0,宽度,高度);
ctx.save();
平移(ball.position.x,ball.position.y);
ctx.beginPath();
弧(0,0,ball.radius,0,Math.PI*2,真);
ctx.fill();
ctx.closePath();
ctx.restore();
ctx.fillStyle=“蓝色”;
ctx.font=“20px Arial”;
ctx.fillText(msg,1300,20);
if(mouse.isDown){
ctx.beginPath();
ctx.moveTo(球位置x,球位置y);
ctx.lineTo(mouse.x,mouse.y);
ctx.stroke();
ctx.closePath();
}
}
设置();