게임 프로그래밍에 대해서는 거의 알지 못하지만 더 배우고 싶습니다. 이 게임 의 코드를 이해하려고합니다 . 코드가 왜 “델타”를 Shipcontrols.js에 전달하는지 이해하려고합니다.이 컨트롤은 사용자 입력에 따라 선박의 방향을 변경합니다.
기본적으로 게임은 모든 루프 “델타”를 계산합니다 …
다음은 하나의 루프를 통해 델타를 사용하는 약식 버전의 스택입니다.
var delta = now - this.time;
this.time = now;
this.current.render.call(this.current, delta, this.renderer);
여기에 단계 …
ctx.manager.add("game", scene, camera, function(delta, renderer)
{
if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++;
var dt = delta/16.6;
this.objects.components.shipControls.update(dt);
여기에 단계 …
bkcore.hexgl.ShipControls.prototype.update = function(dt)
{
var pitchAng;
var yaw;
var roll;
if (undefined != hand){
이 같은 것들을 …
if(this.key.forward)
this.speed += this.thrust * dt;
else
이…
if(this.key.right)
{
angularAmount -= this.angularSpeed * dt;
델타의 요점은 무엇입니까? 무작위 요소를 도입하려고합니까? 이 게임의 코드는 매우 좋습니다. 왜이 사람이 델타를 사용 했습니까?
답변
이것이 “시간 델타”입니다. 이전 업데이트 이후로 경과 된 시간입니다. 애니메이션, 물리 등이 올바른 속도로 실행되고 있는지 확인해야합니다.
코드는 프레임 업데이트마다 한 번씩 실행됩니다. 그러나 프레임이 일정한 속도로 그려지는 것은 아닙니다. 한 프레임은 1/60 초가 걸리고 다음 프레임은 1/30 초가 걸릴 수 있습니다. 이것을 측정하고 설명하지 않으면 게임이 불안하고 다양한 상황에서 너무 빠르거나 느리게 실행됩니다.
시간 델타는 물리학에 종종 적용되는데, 이는 간단한 오일러 통합을 위해 방정식이 지정되는 방식입니다. 속도를 위치에 통합 x1 = x0 + v * (t1 - t0)
하는 것은 코드처럼 단순화하는 것으로 정의됩니다 x += v * dt
. 따라서 물리 업데이트를 평가하려면 시간 델타가 필요합니다.
타임 델타를 측정하고 적용하는 것은 매우 정상입니다.
답변
“델타”, “d”또는 “Δ”는 수학적 문맥에서 “차이”를 의미한다 . 비슷한 의미를 가진 두 숫자 사이에 차이가있을 때마다 그 차이를 “델타”또는 “d”라고 할 수 있습니다.
델타는 게임 개발에서 매우 일반적입니다. 예를 들어, 1 초 전에 문자의 X 좌표와 X 좌표의 차이를 “델타 x”라고하며 일반적으로 dx
, delta_x
또는 로 표시됩니다 d_x
.
또한 코드에서와 같이 두 번의 차이를 갖는 것이 매우 일반적입니다.
var delta = now - this.time;
이 경우, 해당 변수에 저장된 어떤 시간의 차이 나타내는된다 this.time
및 저장 시간 now
.
델타는 일반적으로 시간의 변화를 나타내는 데 사용됩니다. 예를 들어, 플레이어의 X 좌표가 프레임마다 5 픽셀 씩 변경되어야한다는 것을 알고 있다면이 변경 사항을 델타로 저장할 수 있습니다.
var delta_x = 5
그런 다음 해당 델타를 사용하여 필요할 때마다 변경 사항을 적용하십시오.
player.x = player.x + delta_x
그러나 이것은 컨벤션 일뿐입니다. 아무도 변수의 이름을 “델타”또는 “d”로 지정하도록 강요하지 않지만, 그렇게하면 코드를 읽는 다른 사람이나 나중에 코드를 읽는 사람이 변수의 역할을 이해하는 데 도움이 될 수 있습니다.
프로그래밍에 널리 사용되는 다른 일반적인 그리스 문자는 다음과 같습니다.
엡실론 : 아주 작은 가치. 부동 소수점 또는 기타 변수를 정밀 문제와 비교할 때 일반적으로 사용됩니다.
const epsilon = 0.0001
...
if abs(some_float - other_float) < epsilon then
-- close enough, let's say they're equal
end
Pi : 시상수
세타 : 각도 표현
Lambda : 익명 함수 또는 클로저 표현
답변
dt
의 약자 delta time
. 프레임 속도에 관계없이 게임이 같은 속도로 실행되도록 프레임 속도 계산에 사용됩니다.
에 대한 자세한 정보를 framerate independence
찾을 수 있습니다 여기에 .
답변
dt (델타 시간)는 루프의 각주기 / 렌더 프레임 (또는 원하는 타임 스탬프) 사이의 시간입니다. 이 델타 시간으로 시간이 지남에 따라 특정 값을 늘릴 수 있습니다. 실제와 마찬가지로 시간이 지남에 따라 특정 물리 속성을 측정합니다.
게임을 초당 60 프레임으로 실행한다고 가정 해 봅시다. 플레이어가 초당 5 픽셀 씩 움직 이도록하려면
5 * (1/60); //Assuming we have a stable delta time of 0.016
// (1/60) = 0.016 || 0.016 * 5 = 0.083 --> moved per frame || 60 frames * 0.083 = 5
또는
5 * (newTime - oldTime); //aka dt
캐릭터는 60 프레임 위로 5 픽셀 이동합니다. 사이클이 길수록 델타 시간이 길어집니다.
모든 프레임 속도 (1/30, 1/25 등)에 대해 결과는 동일합니다.