【问题标题】:Is There An Efficient jQuery Hittest?有高效的 jQuery Hittest 吗?
【发布时间】:2011-03-21 05:07:18
【问题描述】:

我正在使用 HTML、CSS 和 JavaScript (jQuery) 创建一个简单的游戏。有一艘主船,所有的粒子(子弹)都来自这里。它们每个都只是 div。然后,敌人的 div 会随机分布在屏幕上。

我正在寻找一种有效的方法来测试每个粒子是否击中特定的敌人。我有一些东西开始工作得很好,但很快就陷入了困境。我是 js 新手,所以我的代码非常混乱,并且在许多其他方面可能效率低下。任何建议将不胜感激!

这是我创建敌人和测试命中的部分:

var createEnemy = function(){
    var xRandom = Math.floor(Math.random() * (containerW-50));
    var yRandom = Math.floor(Math.random() * (containerH-50));
    var newEnemy = $('<div class="enemy"></div>');
    $(newEnemy).css({'left':xRandom,'top':yRandom}).appendTo('#container').fadeTo(200, .7);

    var hitTest = setInterval(function(){
        var enemy = $(newEnemy);
        var particle = $('.particle');  

        var enemyT = enemy.offset().top;
        var enemyB = enemy.height()+enemyT;
        var enemyL = enemy.offset().left;
        var enemyR = enemy.width()+enemyL;

        var particleT = particle.offset().top;
        var particleB = particle.height();
        var particleL = particle.offset().left;
        var particleR = particle.width();

        if(particleT >= enemyT-particleB && particleT <= enemyB && particleL >= enemyL-particleR && particleL <= enemyR){
            enemy.hide();
            var removeEnemy = setTimeout(function(){
                newEnemy.remove();
                clearInterval(hitTest, 0);
            },500);
        }
    }, 20);
}

var enemyInt = setInterval(createEnemy, 1000);

让这样的东西在浏览器中顺利运行是否现实?我的代码是否只需要一些更改?您可能需要更多上下文:

2012 年 1 月 12 日编辑: 游戏链接已删除 // 不相关

注意:目前这在 Chrome 和 Safari 中效果最好。

编辑 2011 年 3 月 22 日: 将敌人的 fadeOut() 更改为 hide(),以便您可以准确地看到敌人何时消失(有时会延迟)。 hitTest 似乎仅在您单击实际敌人时触发,因此如果它通过,则不会触发它。另外,我忘记在 hitTest 上清除Interval。这似乎极大地提高了性能,但还不够。

【问题讨论】:

    标签: javascript jquery hittest


    【解决方案1】:

    如果您想要获得最佳性能,请放弃 jQuery 并使用原生 JavaScript。

    如果这不是一个选项,请分析最慢的部分并在那里使用本机 DOM,例如

    var newEnemy = $('<div class="enemy"></div>');
    

    ...变成...

    var newEnemy = document.createElement('div');
    newEnemy.className = 'enemy';
    

    【讨论】:

    • 谢谢,如果我不能让它加快速度,我以后肯定会改变它。我还有另一款游戏,它可以更快地生成新的 div,并且样式更多,但似乎可以正常工作。我认为我的问题可能是每次敌人产生时我都设置了 20 毫秒的密集 setInterval。还有其他方法可以解决这个问题吗?
    • 我会用本机代码重写一堆 jQuery 的东西,然后对它们进行分析,看看什么能给你带来最好的性能增强。
    • 根据我的经验,与 jQuery 相比,使用 native 的性能优势是微不足道的,并且您会失去它提供的便利性和可读性。我给出的大多数示例确实需要以其他更明显的方式进行优化。例如,页面上的元素过多。
    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    相关资源
    最近更新 更多