减去 int 给出与加法不同的结果
subtracting int gives different result than addition
(我并不是说减法给出的数学结果与加法不同——这是显而易见的)
我正在尝试制作一个粒子模拟器游戏,但我 运行 遇到了一个奇怪的现象。 (我正在使用 javascript 和 javap5.js)。在draw函数中,我有一个函数,测试一个粒子下面的space是否为空,如果是,则向下移动一个像素(或将结果加一-就是加法的地方)唯一的问题是,它不是在下降时逐渐变化,而是立即进入屏幕底部。当我改为使用减法时(因此重力上升),它的行为符合预期并逐渐上升。
这是我正在谈论的功能(游戏是粒子数组)-
function updateParticles() {
for(var i = 0; i<250; i++) {
for(var i2 = 0; i2<250; i2++) {
if(game[i][i2] == 1) {
if(game[i][i2+1] == 0) {
game[i][i2]=0;
game[i][i2+1]=1;
}
}
}
}
}
这是全部内容(jsfiddle)-
https://jsfiddle.net/gwood5901/trm6xLv8/
您的 for
循环从左到右,从上到下。这是正在发生的事情的简化模型:
i = 0;
[ 1 ] <-- Is this a one?
[ 0 ] <-- And is this a zero?
[ 0 ]
YES
SWAP
[ 0 ] <-- prev 1
[ 1 ] <-- prev 0
[ 0 ]
i = 1;
[ 0 ]
[ 1 ] <-- Is this a one?
[ 0 ] <-- And is this a zero?
YES
SWAP
[ 0 ]
[ 0 ] <-- prev 1
[ 1 ] <-- prev 0
所有这些都在函数的一次调用中立即发生。
加上减法:
i = 0;
[ 0 ] <-- Is this a zero?
[ 0 ] <-- And is this a one?
[ 1 ]
NO
DO NOTHING
i = 1;
[ 0 ]
[ 0 ] <-- Is this a zero?
[ 1 ] <-- And is this a one?
YES
SWAP
[ 0 ]
[ 1 ] <-- prev 0
[ 0 ] <-- prev 1
在第二次函数调用中:
i = 0;
[ 0 ] <-- Is this a zero?
[ 1 ] <-- And is this a one?
[ 0 ]
YES
SWAP
[ 1 ] <-- prev 0
[ 0 ] <-- prev 1
[ 0 ]
i = 1;
[ 1 ]
[ 0 ] <-- Is this a zero?
[ 0 ] <-- And is this a one?
NO
DO NOTHING
这可以通过两种方式解决:缓冲区或仅向后遍历数组。
下面是向后遍历数组的简单方法:
function {
for(var i = 250-1; i >= 0; i--) {
for(var i2 = 250-2; i2 >= 0; i2--) {
if(game[i][i2] == 1) {
if(game[i][i2+1] == 0) {
game[i][i2]=0;
game[i][i2+1]=1;
}
}
}
}
}
这是一个 JSFiddle,updateParticles()
函数更改为:https://jsfiddle.net/Lhqgujxt/
(我并不是说减法给出的数学结果与加法不同——这是显而易见的) 我正在尝试制作一个粒子模拟器游戏,但我 运行 遇到了一个奇怪的现象。 (我正在使用 javascript 和 javap5.js)。在draw函数中,我有一个函数,测试一个粒子下面的space是否为空,如果是,则向下移动一个像素(或将结果加一-就是加法的地方)唯一的问题是,它不是在下降时逐渐变化,而是立即进入屏幕底部。当我改为使用减法时(因此重力上升),它的行为符合预期并逐渐上升。 这是我正在谈论的功能(游戏是粒子数组)-
function updateParticles() {
for(var i = 0; i<250; i++) {
for(var i2 = 0; i2<250; i2++) {
if(game[i][i2] == 1) {
if(game[i][i2+1] == 0) {
game[i][i2]=0;
game[i][i2+1]=1;
}
}
}
}
}
这是全部内容(jsfiddle)- https://jsfiddle.net/gwood5901/trm6xLv8/
您的 for
循环从左到右,从上到下。这是正在发生的事情的简化模型:
i = 0;
[ 1 ] <-- Is this a one?
[ 0 ] <-- And is this a zero?
[ 0 ]
YES
SWAP
[ 0 ] <-- prev 1
[ 1 ] <-- prev 0
[ 0 ]
i = 1;
[ 0 ]
[ 1 ] <-- Is this a one?
[ 0 ] <-- And is this a zero?
YES
SWAP
[ 0 ]
[ 0 ] <-- prev 1
[ 1 ] <-- prev 0
所有这些都在函数的一次调用中立即发生。
加上减法:
i = 0;
[ 0 ] <-- Is this a zero?
[ 0 ] <-- And is this a one?
[ 1 ]
NO
DO NOTHING
i = 1;
[ 0 ]
[ 0 ] <-- Is this a zero?
[ 1 ] <-- And is this a one?
YES
SWAP
[ 0 ]
[ 1 ] <-- prev 0
[ 0 ] <-- prev 1
在第二次函数调用中:
i = 0;
[ 0 ] <-- Is this a zero?
[ 1 ] <-- And is this a one?
[ 0 ]
YES
SWAP
[ 1 ] <-- prev 0
[ 0 ] <-- prev 1
[ 0 ]
i = 1;
[ 1 ]
[ 0 ] <-- Is this a zero?
[ 0 ] <-- And is this a one?
NO
DO NOTHING
这可以通过两种方式解决:缓冲区或仅向后遍历数组。
下面是向后遍历数组的简单方法:
function {
for(var i = 250-1; i >= 0; i--) {
for(var i2 = 250-2; i2 >= 0; i2--) {
if(game[i][i2] == 1) {
if(game[i][i2+1] == 0) {
game[i][i2]=0;
game[i][i2+1]=1;
}
}
}
}
}
这是一个 JSFiddle,updateParticles()
函数更改为:https://jsfiddle.net/Lhqgujxt/