Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 神秘的打字错误_Javascript_Visual Studio_Graphics_Raphael_Typescript - Fatal编程技术网

Javascript 神秘的打字错误

Javascript 神秘的打字错误,javascript,visual-studio,graphics,raphael,typescript,Javascript,Visual Studio,Graphics,Raphael,Typescript,我正在尝试用Typescript和RaphaelJs制作一个小游戏。到目前为止,代码非常简短: /// <reference path="raphael-2.1.d.ts"/> window.onload = () => { var paper: RaphaelPaper = Raphael(10, 50, 500, 500); var time: Date =new Date(); var now = time.getTime(); var e

我正在尝试用Typescript和RaphaelJs制作一个小游戏。到目前为止,代码非常简短:

/// <reference path="raphael-2.1.d.ts"/>
window.onload = () => {
    var paper: RaphaelPaper = Raphael(10, 50, 500, 500);
    var time: Date =new Date();
    var now = time.getTime();
    var elapsedTime = time.getTime() - now;
    var gameObjects = new GameObject[];
    var robot =new Robot( paper.rect(10, 10, 100, 100));
    robot.elem.attr("fill", "green");
    gameObjects.push(robot);
    while (true) {

        elapsedTime = time.getTime() - now;
        gameObjects.forEach((object) => object.update(elapsedTime));
        //gameObjects.forEach((object) => object.draw(paper));
    }
}

interface GameObject{
    update(time:number);
}

class Robot implements GameObject{
    public x: number;
    public y: number;
    public elem: RaphaelElement;
    constructor(element: RaphaelElement) { 
        this.elem = element;
        this.x = this.elem.attr("x");
        this.y = this.elem.attr("y");
    }
    public update(time: number) {
        this.x += 1;
        this.y += 1;
        this.elem.attr("x", this.x);
        this.elem.attr("x", this.y);
    }
}
//
window.onload=()=>{
var纸张:RaphaelPaper=Raphael(10,50,500,500);
变量时间:日期=新日期();
var now=time.getTime();
var elapsedTime=time.getTime()-now;
var gameObjects=新游戏对象[];
var robot=新机器人(paper.rect(10,10100100));
robot.elem.attr(“填充”、“绿色”);
游戏对象。推(机器人);
while(true){
elapsedTime=time.getTime()-现在;
gameObjects.forEach((object)=>object.update(elapsedTime));
//gameObjects.forEach((object)=>object.draw(paper));
}
}
界面游戏对象{
更新(时间:编号);
}
类机器人实现游戏对象{
公共x:数字;
公众y:数字;
公共元素:拉斐勒门特;
构造函数(元素:Raphaelement){
this.elem=元素;
this.x=this.elem.attr(“x”);
this.y=this.elem.attr(“y”);
}
公开更新(时间:编号){
这个.x+=1;
这个。y+=1;
this.elem.attr(“x”,this.x);
this.elem.attr(“x”,this.y);
}
}
当页面加载完一个新的Raphaelpper并创建一个游戏对象列表时。每个游戏对象都需要实现一个方法:更新。其思想是,在游戏过程中创建的每个Raphaelement都存储在GameObject的具体实现中,并根据其规格进行更新

让我们假设敌人是蓝色的小矩形。为了将这些敌人添加到我的游戏中,我会添加一个类敌人,它实现GameObject,并有一个特殊的更新方法,将敌人移动到玩家身边并检查交叉点。机器人对象只是一个非常简单的例子

代码对我来说似乎很好,VisualStudio没有将任何内容标记为错误,但当我尝试运行游戏时,会弹出一条错误消息,通知我:

错误1命令“tsc--sourcemap”…strategy go\game.ts” “…strategy go\raphael-2.1.d.ts”“…strategy go\app.ts”“已退出,代码为” 1.strategy go\strategy go.csproj 85 5 strategy go

我确信这与我的IDE设置无关,因为另一个typescript/raphaelJs项目工作得很好。不幸的是,我无法从错误消息中获得任何有用的信息

更新: 在注释掉
gameObjects.forEach((object)=>object.update(elapsedTime))之后项目编译时没有错误。VisualStudio表示“构建成功”,Chrome打开了。但页面从未完成加载。即使我输入这个,我甚至看不到html文件中的文本

更新2:
我用window.setInterval交换了while循环,现在错误消失了,页面加载了。但这不是经典的游戏循环。我想知道为什么一个简单的while循环会阻止我的页面加载。这似乎是自相矛盾的,因为while循环是在window.onload中执行的。

我不确定您最初的TypeScript错误(在Visual Studio中构建项目时,您通常可以通过查看输出窗口来查看错误本身),但至于为什么页面会在while(true){循环是因为您创建了无限块循环。JavaScript在单线程进程中运行,因此您最初的循环所做的是阻止窗口中发生任何其他事情

JavaScript也在基于队列的系统上执行代码,setInterval(fn,delay)所做的实际上是将函数添加到队列中,以便在遇到延迟时执行(这也是我们在JavaScript中实现异步编程的方式)。因此,setInterval(fn,0)实际上并不会立即执行代码(尽管它似乎会立即执行),而是会将函数添加到队列顶部,执行队列中的其他代码,然后在到达时执行函数(因此,如果您正在评估执行时间,这取决于代码中发生的一切,那么您的代码可能不会以指定的0毫秒执行)


也正因为如此,如果您试图以一致的帧速率实现游戏循环,您不应该依赖setInterval函数的“延迟”参数,因为这甚至可能因浏览器而异。如果帧速率一致性在游戏中很重要,您应该跟踪自己的时间间隔和弹性时间。

关于您最初的TypeScript错误(您通常可以通过在Visual Studio中构建项目时查看输出窗口来查看错误本身),但是关于您的页面在while(true){}期间冻结的原因循环是因为您创建了一个无限阻塞循环。JavaScript在一个单线程进程中运行,所以您最初的循环所做的是阻止窗口中发生的任何其他事情

JavaScript也在基于队列的系统上执行代码,setInterval(fn,delay)所做的实际上是将函数添加到队列中,以便在遇到延迟时执行(这也是我们在JavaScript中实现异步编程的方式)。因此,setInterval(fn,0)实际上不会立即执行代码(虽然看起来是这样),但会将函数添加到队列的顶部,执行队列中的其他代码,然后在到达时执行函数(因此,如果您正在评估执行时间,取决于代码中发生的一切,您的代码可能不会像您指定的那样以0毫秒的速度执行)


也正因为如此,如果您试图以一致的帧速率实现游戏循环,则不应依赖setInterval函数的“delay”参数,因为这甚至可能因浏览器而异。如果帧速率一致性在游戏中很重要,您应该跟踪自己的时间间隔和弹性时间。

我将对其进行微调own,谢谢你的提示,我已经用…替换了长文件路径,我的意思是命令被截断,导致编译器混乱。嗯,如果我