저는 2D 플랫폼을 만드는 SFML을 사용하고 있습니다. 나는 너무 많은 시간대 기사를 읽었지 만 그들은 나를 위해 잘 작동하지 않는다. 나는 2500fps 타임 스텝과 같은 방식으로 구현하고 있는데, 놀랍게도 부드럽다. 내 랩톱에서 300FPS를 얻고있다. (나는 랩으로 체크한다.) 랩탑에서는 부드럽지만 여전히 재생 가능하다. 여기2500 FPS에서 시간대가 고정 되었습니까?
는 코드 조각입니다 :
sf::Clock clock;
const sf::Time TimePerFrame = sf::seconds(1.f/2500.f);
sf::Time TimeSinceLastUpdate = sf::Time::Zero;
sf::Time elapsedTime;
이 변수이며, 여기에 게임 루프가의 Player.h에서
while(!quit){
elapsedTime = clock.restart();
TimeSinceLastUpdate += elapsedTime;
while (TimeSinceLastUpdate > TimePerFrame){
TimeSinceLastUpdate -= TimePerFrame;
Player::instance()->handleAll();
}
Player::instance()->render();
}
, 내가있어 이동 상수,
const float GRAVITY = 0.35 /2500.0f; // Uses += every frame
const float JUMP_SPEED = -400.0f/2500.0f; //SPACE -> movementSpeed.y = JUMP_SPEED;
//When character is touching to ground
const float LAND_ACCEL = 0.075 /2500.0f; // These are using +=
const float LAND_DECEL = 1.5 /2500.0f;
const float LAND_FRICTION = 0.5 /2500.0f;
const float LAND_STARTING_SPEED = 0.075; // This uses =, instead of +=
Player 클래스의 handleAll 함수에는
이 있습니다.cImage.move(movementSpeed);
checkCollision();
마지막으로 checkCollision 함수는 문자의 마스터 경계 상자가 각면에서 객체의 사각형과 교차하는지 확인하고 속도 x 또는 y를 0으로 설정 한 다음 문자 위치를 가장자리로 설정하여 겹침을 수정합니다. * 2500.0f/60.0f 모든 상수, 그것은 같은 느끼지 않는다처럼 간단하게 할 수 없어,
//Collision
if(masterBB().intersects(objectsIntersecting[i]->GetAABB())){
//HORIZONTAL
if(leftBB().intersects(objectsIntersecting[i]->GetAABB())){
if(movementSpeed.x < 0)
movementSpeed.x = 0;
cImage.setPosition(objectsIntersecting[i]->GetAABB().left + objectsIntersecting[i]->GetAABB().width + leftBB().width , cImage.getPosition().y);
}
else if(rightBB().intersects(objectsIntersecting[i]->GetAABB())){
if(movementSpeed.x > 0)
movementSpeed.x = 0;
cImage.setPosition(objectsIntersecting[i]->GetAABB().left - rightBB().width , cImage.getPosition().y);
}
//VERTICAL
if(movementSpeed.y < 0 && topBB().intersects(objectsIntersecting[i]->GetAABB())){
movementSpeed.y = 0;
cImage.setPosition(cImage.getPosition().x , objectsIntersecting[i]->GetAABB().top + objectsIntersecting[i]->GetAABB().height + masterBB().height/2);
}
if(movementSpeed.y > 0 && bottomBB().intersects(objectsIntersecting[i]->GetAABB())){
movementSpeed.y = 0;
cImage.setPosition(cImage.getPosition().x , objectsIntersecting[i]->GetAABB().top - masterBB().height/2);
//and some state updates
}
}
내가 좋아하는 만 시간을 60 FPS 타임 스텝을 사용하려고하지만, 모든 속도의 변수가 너무 느려집니다. 가까이있는 상수를 얻으면 "괜찮습니다"라고 느껴지지만 충돌이 일어날 때마다 캐릭터의 위치가 항상 설정되고 모든 프레임 I에 고속 상수가 적용되어 대상에 큰 무릎이 생겨지도에서 벗어납니다. 나는 일반적으로, 나는 시간 단계 코드
cImage.move(movementSpeed*TimePerFrame.asSeconds());
사용했다하지만 당신이 본대로, 난 그냥 모든 일정에 /2500.0f 넣어 내가 사용하지 않는 책을 추가 할 필요가 ...
를 추측 그것.
프레임 당 1/2500 초입니까? 그렇지 않다면, 어떻게 이것들을 모두 1/60.0f로 바꿀 수 있습니까?
시뮬레이션을 애니메이션보다 빠른 속도로 실행 시키거나 움직이기 전에 충돌을 확인할 수 있으므로이를 기반으로 동작을 조정하고 조정할 수 있습니다. 예 : 이동하기 전에 충돌에 대한 새 경계 상자를 확인하고 충돌이 발생한 지점과 시간을 정확히 파악한 다음이를 기반으로 새 경로를 계산하십시오 – bames53
2500 FPS ?! 너 진심이야? – Exceptyon