Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >按下Javascript键+ setTimeout()

按下Javascript键+ setTimeout()
EN

Stack Overflow用户
提问于 2015-07-18 13:37:13
回答 1查看 288关注 0票数 1

我正在用html和javascript制作一个游戏。只是为了澄清,这不是重复或任何事情。什么都没有我需要的答案。另外,在我解释之前,我想说我对关键听者没有问题,我的游戏知道什么时候按下一个键,什么时候释放它。好吧,我有5个角色行走的画面。我有一个like循环,基本上是说,当按下D键或按右箭头时,然后增加帧,使之看起来像字符在行走。然后它有一个setTimeout函数,暂停1/10秒钟。这应该会让这个角色看起来像在走路。我知道这与setTimeout()函数有关。下面是while循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (keys[68] || keys[39]) {
    charFrame++;
    setTimeout(function() {

    }, 100);
}   

下面是我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Sparring Spartans</title>
        <style type="text/css">

        </style>
    </head>
<body>
    <canvas id="canvas" width="1000" height="600"></canvas>
    <script type="text/javascript">
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");
        var width = canvas.width;
        var height = canvas.height;
        var groundX = 0, groundY = 400;
        var playerx = width/2, playery = groundY-120;
        var charFrame = 1;
        var speed = 4;
        var keys = [];
        window.addEventListener("keydown", function(e) {
            keys[e.keyCode] = true;
        }, false);
        window.addEventListener("keyup", function(e) {
            delete keys[e.keyCode];
        }, false);

        var spartan1 = new Image();
        spartan1.src = "spartan1.png";
        var spartan2 = new Image();
        spartan2.src = "spartan2.png";
        var spartan3 = new Image();
        spartan3.src = "spartan3.png";
        var spartan4 = new Image();
        spartan4.src = "spartan4.png";
        var spartan5 = new Image();
        spartan5.src = "spartan5.png";
        var stone = new Image();
        stone.src = "stone.png";

        function game() {
            update();
            render();
        }

        function player() {
            if (charFrame === 1) {
                context.drawImage(spartan1, playerx, playery);
            } else if (charFrame === 2) {
                context.drawImage(spartan2, playerx, playery);
            } else if (charFrame === 3) {
                context.drawImage(spartan3, playerx, playery);
            } else if (charFrame === 4) {
                context.drawImage(spartan4, playerx, playery);
            } else if (charFrame === 5) {
                context.drawImage(spartan5, playerx, playery);
            }
        }

        function ground() {
            for (var i = 0; i <= 1000; i += 55) {
                context.drawImage(stone, i, groundY);
            }
            for (var i = 0; i <= 1000; i += 55) {
                context.drawImage(stone, i, groundY+55);
            }
            for (var i = 0; i <= 1000; i += 55) {
                context.drawImage(stone, i, groundY+110);
            }
            for (var i = 0; i <= 1000; i += 55) {
                context.drawImage(stone, i, groundY+165);
            }
        }

        function manager() {
            ground();
            while (keys[68] || keys[39]) {
                charFrame++;
                setTimeout(function() {

                }, 100);
            }   
            player();
        }

        function update() {
            manager();
            player();
        }

        function render() {
            context.fillStyle = "#AFE4FF";
            context.fillRect(0, 0, width, height);
            manager();
        }

        setInterval(function() {
            game();
        }, 1000/30);
    </script>
</body>
</html>

我做错了什么?我知道成为setTimeout,但是我已经多次尝试解决这个问题了。图像甚至不会改变。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-18 13:47:07

因为您的manager函数每秒调用30次,所以应该使用if语句而不是循环来检查每帧按键一次:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function manager() {
    ground();
    if (keys[68] || keys[39]) {
        charFrame++;
    }
}

此外,manager函数每帧调用两次,一次在update函数中,一次在render函数中。另外,您的player函数在updatemanager中都被调用,每帧再次调用两次。您的代码需要一些重构才能正常工作,以确保每个帧没有任何调用两次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31495826

复制
相关文章
按下开机键,Linux做了什么?
计算机开机是一个神秘的过程。我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面。然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一个命令行或者错误信息。了解计算机开机过程有助于我们修复开机可能出现的问题。
马哥linux运维
2019/05/23
1.4K0
按下开机键,Linux做了什么?
拼多多按下用户加速键
随着互联网的更新迭代,互联网行业的发展也越发迅猛,从前一个头部企业的跑出往往需要十几二十年的时间,而现在只需要几年便可以与许多老牌企业相媲美,比如字节跳动、美团、拼多多等。其中,拼多多的发展最为迅速。
金融外参
2021/06/01
5660
拼多多按下用户加速键
按下开机键后的4.98秒
好的,这似乎是好多人都特别想搞明白的一个问题,有时候非常纳闷,为什么一个看似这么简单的问题,就是搜不到一个直面问题的答案呢?
PHP开发工程师
2021/05/27
1.1K0
按下开机键后的4.98秒
Veritas:疫情按下企业“上云”加速键
一场大型的“云办公”实验自2月起在全球范围轮番上演,“数字化转型”成为全球企业无法回避的热词。IDC调查报告显示,因疫情影响,中国约有85%的公司制定了在家或远程办公的相应计划[1]。微软公司的公开数据显示,针对其远程办公平台Teams会议和会话的云服务仅在意大利一国,一月内便实现了775%的增长。Forrester和GlobalData的联合研究报告也指出,自1月31日起,微软Teams上的会议数量增长达500%,移动端使用率则激增了200%。
CloudBest
2020/07/23
7900
前端javascript如何阻止按下退格键页面回退 但 不阻止文本框使用退格键删除文本
这种写法虽然屏蔽了回车键页面回退的功能,但同样,如果该页面有文本输入框,那么这个输入框将不能使用 退格键 进行文本删除;
CherishTheYouth
2019/07/30
1.9K0
JavaScript如何用setTimeout模拟setInterval
思路就是递归调用 function myInterval(fun,time){ function inside(){ fun(); setTimeout(inside,time); } setTimeout(inside,time); } myInterval(fn,1000); function fn(){ console.log('嘿嘿'); }
henu_Newxc03
2022/05/05
9360
JavaScript 定时器 setTimeout、setInterval
定时器在javascript中的作用 1、制作动画 2、异步操作 3、函数缓冲与节流 定时器类型及语法 示例代码如下: /* 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行一次的定时器 setInterval 反复执行的定时器 clearInterval 关闭反复执行的定时器 */ var time1 = setTimeout(myalert,2000); var time2 = setInterval(
Devops海洋的渔夫
2019/05/30
9850
按下电脑开机键后,究竟发生了什么?
安装完操作系统后,整个操作系统在硬盘中的分布分为boot模块的1个扇区、setup模块的4个扇区,system模块(操作系统代码)的n个扇区。一个扇区为512字节,并且操作系统是从硬盘中0磁道0扇区开始往后分布的。
xujjj
2019/06/29
2.1K0
按下电脑开机键后,究竟发生了什么?
帮校园按下“加速键”,腾讯用了哪些“装备”?
在以分钟来度量的智能教育时代,传统的教育方式消耗了师生大量的时间和精力。如同游戏中的主人公需要不断升级“装备”,才能快速成长为大神一样,无论学校、学生还是教育机构,都需要不断打磨手中的装备,才能不断进步。 腾讯教育自成立以来,通过不断整合内部资源,打造出智能连接、智能教学、智能科研和智能管理等服务,为各个教育场景加buff;同时,利用先进技术为行业孵化出很多“神级装备”,助力生态伙伴快速从“青铜”进阶为“王者”。 学生们的秘密武器篇 Round1 进校-一秒解锁角色 童鞋,恭喜你开启新的人生角色——学
鹅老师
2020/06/10
8550
当我们按下电源键,Android 究竟做了些什么?
我们会否好奇过,如此复杂的 Android 究竟是怎么运作起来的呢?
goo
2018/11/06
2K0
当我们按下电源键,Android 究竟做了些什么?
当我们按下电源键,Android 究竟做了些什么?
现在,按下电源键 下面是Android启动的核心步骤流程图,看文字的时候,记得回来对照图来理解喔,希望阅读全文后,回观流程图,会有恍然大悟的感觉,那么文章的目的就达到啦 :  一、启动电源及系统启动 系统从 ROM 中开始启动,加载引导程序到 RAM ,然后执行。 二、引导程序 引导程序是 Android 操作系统开始运行前的一个小程序,因此它需要针对特定主板与芯片,并不是 Android 操作系统的一部分。引导程序是OEM厂商或运行商进行加锁、限制的地方。 1、两个阶段 检测外部 RAM
腾讯移动品质中心TMQ
2019/07/24
1.1K0
当我们按下电源键,Android 究竟做了些什么?
疫情按下中国数字化转型的“快进键”
2020年的开头,过得不容易。不少人几乎每天一觉醒来,第一个动作就是打开手机看疫情最新通报,急切期盼着“拐点”早日到来。
科技云报道
2022/04/15
8270
疫情按下中国数字化转型的“快进键”
JavaScript 按值传递 & 按引用传递
其次,对象的比较并非值的比较:对象的比较均是引用的比较,当且仅当它们引用同一个基对象时,它们才相等。     即使两个对象包含同样的属性和相同的值,它们也是不相等的。各个索引元素完全相等的两个数组也不相等
书童小二
2018/09/03
3.8K0
Android实现两次按下返回键退出「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115298.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/10
4570
JavaScript定时调用函数(SetInterval与setTimeout)
setTimeout和setInterval的语法相同。它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码。
aehyok
2018/09/11
1.5K0
按enter键表单自动提交
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
1.7K0
重新认识javascript的settimeout和异步
今晚看到QLeelulu的一道JavaScript面试题(setTimeout),稍微想了一下,好不容易连猜带蒙,凑巧说对了答案。但是原因到底是什么呢?自己一时也说不太清楚,反正感觉就是一个死循环造成的。然后看了一下文章下面的评论,发现5楼和6楼的回答很有道理,主要意思就是说javascript引擎是单线程执行的,while循环那里执行的时候,settimeout里面的函数根本没有执行的机会,这样while那里永远为真,造成死循环。但是单纯看还是不怎么踏实,最后发挥实践精神,自己动手做了两个实验: 1、简单
前朝楚水
2018/04/03
9860
js中settimeout和setInterval区别_JavaScript set
注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止
全栈程序员站长
2022/11/09
1.9K0
皮猜按下谷歌招聘暂停键,疫情之下,「紧日子」来了
Airbnb、特斯拉、携程、海信、联想……之前都已公开表态,将在疫情之下,重新调整公司发展和扩张策略。
量子位
2020/04/20
5420
皮猜按下谷歌招聘暂停键,疫情之下,「紧日子」来了
疫情按下加速键,SaaS厂商们在 “风口”下的困局与破局
受疫情影响,节后大量复工企业开启了远程办公模式,尤其是视频会议、文档协作等SaaS服务迎来了需求的激增。在众多行业饱受停业停工困扰的2月份,SaaS行业却迎来在线业务爆发增长的“高光”时刻。
脑极体
2020/03/05
5390

相似问题

用于检查按下的键的函数的setTimeout (javascript)

10

函数键按下javascript

13

按下Javascript多个键

32

使用javascript按下"Delete“键?

413

扩展javascript键按下函数

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文