javascript - 一起运行多个 jquery 函数

标签 javascript jquery html animation

我知道这个问题已经被问过很多次了,而且我已经在 SO 以及其他论坛上看到了这些问题的解决方案。大多数时候建议的解决方案是使用 Web Workers .

我正在开发的游戏需要我同时运行多个功能。其中之一是 click 函数,另一个是 setInterval
我这样做的方法可以看到here in this JSFiddle 。 (持续点击灰色区域使玩家跳跃)。

整个想法是在 1000 毫秒的间隔后连续生成那些蓝色障碍物。

在我之前的方法中,只有当我点击让玩家跳跃时,障碍物才会产生,否则它们不会像预期的那样。

<小时/>
  1. 如何并行运行这两个函数以实现 目的是产生障碍物,同时让玩家跳跃。

  2. 其次,执行此过程的最佳方法是什么 鉴于游戏开发,即达到一定水平 效率,使动画不受影响。

<小时/> 以下是我一直在处理的 HTML 和 Javascript 代码:

<div class="container">
    <div class="player"></div>
    <div class="obstacle-container">
        <div class="obstacle"></div>
    </div>
</div>

$.fn.animator = function () {
    var hit_list, done = false;

    $(".container").click(function () {
        if (!done) {
            $(".obstacle").stop().animate({
                left: "-=105%"
            }, 10000, "linear");
            $(".player").stop().animate({
                bottom: "+=100px"
            }, {
                duration: 300,
                complete: function () {
                    $(".player").animate({
                        bottom: "0"
                    }, 800);
                },
                step: function () {
                    //Test for collision
                    hit_list = $(".player").collision(".obstacle");
                    if (hit_list.length !== 0) {
                        $(function () {
                            if (!done) {
                                $(".container").append("Game Over!");

                                return false;
                            }
                        });
                        done = true;
                    }
                }
            });
        }
    });
};


$(function () {

    $('.container').animator();

});

var interval = null;
$(".obstacle-container").obstacle_generator();
$.fn.obstacle_generator = function () {
    interval = setInterval(function () {
        $(".obstacle-container").append('<div class="obstacle"></div>');
    }, 1000);
};

最佳答案

您想要研究的通用概念称为游戏循环

几乎每个游戏都会使用该系统的某些变体来构建:

  • 初始化游戏
  • 循环:
    • 检查用户输入
    • 更新所有 Actor
    • 绘制场景
    • 等到需要重复的时候

以每秒 60 帧运行的游戏将每秒执行此循环 60 次,或大约每 16 毫秒执行一次。

与您原来的问题相比,您不需要运行多个执行线程(一起运行多个函数)来实现此目的。

在某种程度上,您已经在使用类似的循环。 jQuery 维护自己的循环来更新动画。当您在动画步骤中检查碰撞时,您会在假设的 Player.update() 中执行此操作。方法。您希望将此代码移出 jQuery,并移入您控制的循环中。

由于您在浏览器中运行,通用游戏循环变得更加简单:

  • 检查用户输入 - 这仍然可以由事件处理程序(无论是否为 jQuery)来处理。不过,它们不应直接更改 CSS 位置等属性,而应根据游戏对象的状态进行操作。例如,通过更改 velocityPlayer对象。

  • 更新所有参与者 - 循环的重要部分。您应该检查自上次循环以来已经过去了多少毫秒,因为浏览器不能保证您的代码将准确运行或至少每秒运行 60 次。然后,您应该循环遍历所有游戏对象并更新它们。在你的Player.update()方法,例如,您可能希望根据其速度和耗时来移动它。

  • 绘制场景 - 如果您使用 DOM 元素,那么浏览器当然会为您处理绘制。如果您使用的是 <canvas>元素,那么您将在此处将自己绘制为循环的一部分。

  • 等到需要重复的时候 - 这将由浏览器为您完成,作为正常的一部分 setInterval/setTimeout行为。

JavaScript 中的简单游戏循环可能如下所示:

var gameObjects = [];
// Initialise game, create player objects etc, add them to the array

var gameLoop = function() {
    // Loop through gameObjects, and call their respective update methods
};

setInterval(gameLoop, 16); // Try to run the loop 60 times per second.

在复杂的游戏中,您不会只有一个基本数组来保存所有游戏对象,这只是一个基本示例。

关于javascript - 一起运行多个 jquery 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22018882/

相关文章:

javascript - 为什么生成器下一个函数不能是事件监听器的回调函数

javascript - 什么是具有出色雪崩性的简单可逆非密码字符串密码函数?

javascript - 迭代 JSON 对象时出现问题

javascript - 确定是否按下了字母或数字 - Javascript

javascript - 将脚本/样式从 DOM 传递到子 iFrame

javascript - 单击外部 map 时如何显示信息标记谷歌地图?

javascript - SoundManager2 onplay 事件配置不起作用

jQuery 附加使用第 n 个子级而不是第一个

html - Struts2 中的复选框对齐问题

html - 如何在分区内进行分区以添加图像和文本?