在更新位置之前,檢查新位置是否在界限內。
尤其是,您應該檢查x
的新值是否大於或等於0
,如果它不是不更新x
。 y
也是如此。
上限有點棘手,因爲它需要使用對象的大小進行檢查。如果不是不更新x
,你需要做的是檢查width
加上x
的新值是否小於或等於世界的大小。做相當於y
。
目前你的代碼如下:
this.x += this.speedx;
this.y += this.speedy;
這相當於:
this.x = this.x + this.speedx;
this.y = this.y + this.speedy;
現在,this.x + this.speedx
和this.y + this.speedy
分別是x
和y
,新的價值觀。我們可以將其改寫如下:
let newx = this.x + this.speedx;
let newy = this.y + this.speedy;
this.x = newx;
this.y = newy;
到目前爲止,我們剛剛重構了代碼。這應該和以前完全一樣。
讓我們去了什麼,我說:
你應該檢查是否爲x
新的值大於或等於0
,如果不是不更新x
這與說法相同:只有在x
的新值大於或等於0
時更新x
。另外,在代碼:
let newx = this.x + this.speedx;
let newy = this.y + this.speedy;
if (newx >= 0)
{
this.x = newx;
}
this.y = newy;
同樣爲y
。
let newx = this.x + this.speedx;
let newy = this.y + this.speedy;
if (newx >= 0)
{
this.x = newx;
}
if (newy >= 0)
{
this.y = newy;
}
檢查,如果width
加上x
新值較小或等於世界的大小,如果不是不更新x
另一種方式說的是:只有更新x
時width
加上x
的新值小於或等於世界的大小。另外,在代碼:
let newx = this.x + this.speedx;
let newy = this.y + this.speedy;
if (newx >= 0 && this.width + newx <= this.gamearea.canvas.width)
{
this.x = newx;
}
if (newy > 0)
{
this.y = newy;
}
執行相當於y的
let newx = this.x + this.speedx;
let newy = this.y + this.speedy;
if (newx >= 0 && this.width + newx <= this.gamearea.canvas.width)
{
this.x = newx;
}
if (newy > 0 && this.height + newx <= this.gamearea.canvas.height)
{
this.y = newy;
}
來吧,複製粘貼的是,它應該工作... 除非我誤解你的代碼。然而,我想鼓勵你瞭解這裏發生了什麼。否則,你會在你的理解中出現一個缺口,而這個缺口會回來咬你。
對於這些類型的遊戲開發,您需要根據尺寸來思考。在這種特殊情況下,我們可以通過單獨考慮每個組件解決這個問題......請考慮以下事項:
你不應該讓X大於零較小的值 - 你不應該允許值的
和
x使得x +寬度大於世界的寬度。
正如你可以在圖片中看到的x
值必須始終大於0
更大,使得x + width
比世界的寬度。
換句話說,x
必須在間隔[0, (width of the world) - width]
。
對於y
等同。這些要求來自你想要建模的行爲(你不要對象超出範圍)並且沒有歧義地定義它(爲這些範圍給出值,所以你可以在代碼中檢查它們)。
注意:你的速度是每幀的像素,如果你的幀速率變化,它會影響多少物體移動。這是因爲您沒有使用幀間的流逝時間......但這不是當前的主題。另外,處理碰撞是另一個話題。
「W」,「A」,「S」和「D」有什麼問題? – BenM