【问题标题】:Javascript "ball" bouncingJavascript“球”弹跳
【发布时间】:2014-10-19 22:48:37
【问题描述】:

我是 JS 菜鸟。我正在进入浏览器游戏编程,并想制作一个球掉落和弹跳的快速示例,只是为了学习。出于某种原因,当我创建一个 jsfiddle 时,我的代码实际上没有工作,我的 div id="ball" 的 onclick 事件似乎没有附加,但是当我在浏览器中运行它时它会附加。但这不是我的问题。

在这段代码中,用户点击了球,它只是一个带有黑色背景的 div。然后 div 跟随用户光标,当用户第二次单击时,div 开始向窗口底部下降。当它到达底部时,它应该反弹回来,顶点距离它最初下降的位置的 y 坐标和窗口底部之间的距离的一半。因此,如果它被放置在 y 位置 600 并且页面底部为 800,那么第一次反弹的顶点应该是 700。第二次反弹,顶点应该是 750。第三次反弹,775。你明白了。有人可以在这里帮助我吗?我猜每次球落到底部时我都需要增加一个计数器?

<html>
<head>
<style>
#ball {
    width: 50px;
    height: 50px;
    background-color: black;
    position: absolute;
}
</style>
<script>

window.onload = function() {

    var ballClicked = false;
    var ballFalling = false;
    var ballX = 100;
    var ballY = 100;
    var timesBounced = 0;
    var bounceApex = 0;
    var startingDropHeight = 0;
    var intervalVar;
    var ball = document.getElementById("ball");
    ball.style.left = ballX;
    ball.style.top = ballY;

    ball.onclick = function() {
        if (ballClicked == false) {
            ballClicked = true;
        } else {
            ballClicked = false;
            ballFalling = true;
            startingDropHeight = ballY;
            intervalVar = setInterval(function(){dropBall()} , 5);
        }
    };

    document.onmousemove = function(e) {
        if (ballClicked == true) {
            ballX = e.pageX;
            ballY = e.pageY;
            ball.style.left = ballX;
            ball.style.top = ballY;
        }
    };

    function dropBall() {
        if (ballFalling == true) {
            ballY = ballY + 1;
            ball.style.top = ballY;
            if (ballY == window.innerHeight - 50) {
                timesBounced = timesBounced + 1;
                bounceApex = (startingDropHeight + (window.innerHeight - 50)) / 2;
                ballFalling = false;
                if (bounceApex > window.innerHeight - 50) {
                    clearInterval(intervalVar);
                }
            };
        } else {
            ballY = ballY - 1;
            ball.style.top = ballY;
            if (ballY == bounceApex) {
                ballFalling = true;
            };
        }
    };

};

</script>
</head>
<body>
<div id="ball"></div>
</body>
</html>

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    添加left和top样式时,还需要指定单位。所以,而不是:

    ball.style.left = 100;
    

    应该是:

    ball.style.left = "100px";
    

    我已经在您的代码中修复了这个问题并制作了一个可以工作的 jsfiddle,它将稍微改善弹跳。在这里查看:http://jsfiddle.net/12grut99/

    关于重复弹跳,这行是问题:

    bounceApex = (startingDropHeight + (window.innerHeight - 50)) / 2;
    

    您总是根据原始下落高度计算顶点,但每次反弹后,下落高度应该是之前的bounceApex(球到达的最高点)。

    【讨论】:

    • 是的,这是因为您像 ballY == bounceApex 一样检查,这有时可能不是真的,因为除以 2(所以您会得到 50 == 49.5 这会导致球开始向上飞行,并且永远不会返回...我将其更改为ballY &lt;= bounceApex。在我发送给您的最后一个版本中,您只需要弄清楚何时停止弹跳,我相信您的 clearInterval 检查已关闭,但我会让您自己修复那个. :)
    • 不客气!祝你未来的努力好运。在这里,停止反弹问题是类似的(&gt; 而不是&gt;=):jsfiddle.net/12grut99/2
    • |是按位或,||是逻辑或。如果您有(first || second),它将首先检查first 是否为真,如果是,则返回它;如果不是,它会检查 second 的相同内容。看看这个小例子是否有意义:jsfiddle.net/Lm3o0sjy
    • 很好,显然我还有很长的路要走,但是像你这样的人和这个网站让这个过程变得更容易:D
    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多