gpt4 book ai didi

C++在像俄罗斯方 block 这样的游戏中设置帧速率

转载 作者:行者123 更新时间:2023-11-28 06:41:18 25 4
gpt4 key购买 nike

所以这个问题比一些更抽象一点。假设我有一个游戏,我只想每秒渲染一次,例如俄罗斯方 block 克隆。我只想每秒处理一个输入,然后相应地渲染新帧。俄罗斯方 block 是一款基于网格的游戏,因此我不能将游戏 block 移动一定数量乘以人们通常用于帧速率示例的 timeDelta float 。如何在基于网格的游戏中每秒只渲染一帧?这是我到目前为止的代码,但它是错误的:

void Engine::Go(){
while(window.isOpen()){
if(timeElapsed >= 1000){
timeElapsed = clock.restart().asMilliseconds();;
ProcessInput();
}
UpdateCPU();
Render();
timeElapsed = clock.getElapsedTime().asMilliseconds();
time += timeElapsed;
}
}

void Engine::ProcessInput(){
while(window.pollEvent(event)){
if(event.type == (sf::Event::Closed))
window.close();
}
//process movement detection of piece
int temp = level.GetGamePieces().size();
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
level.GetGamePieces().at(temp - 1).GetPieceSprite().move(-10, 0);
std::cout << "left";
moved = true;
}
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
level.GetGamePieces().at(temp - 1).GetPieceSprite().move(10,0);
std::cout << "right";
moved = true;
}
else{
level.GetGamePieces().at(temp - 1).GetPieceSprite().move(0,10);
std::cout << "down";
moved = true;
}
}

我只想一次将游戏 block 移动一个方格,每秒移动一次,但我不知道该怎么做。

编辑:这是渲染帧的代码

void Engine::Render(){
window.clear();
//draw wall tiles
for(int i = 0; i < 160; i++){
if(i < 60){
level.GetWallTile().setPosition(0, i * 10);
window.draw(level.GetWallTile());
}
if(i >= 60 && i < 100){
level.GetWallTile().setPosition((i - 60) * 10, 590);
window.draw(level.GetWallTile());
}
if(i >= 100){
level.GetWallTile().setPosition(390, (i - 100) * 10);
window.draw(level.GetWallTile());
}
}

//draw BG tiles
for(int i = 1; i < 39; i++){
for(int j = 0; j < 59; j++){
level.GetBGTile().setPosition(i * 10, j * 10);
window.draw(level.GetBGTile());
}
}

for(int i = 0; i < level.GetGamePieces().size(); i++){
window.draw(level.GetGamePieces()[i].GetPieceSprite());
}

window.display();
}

最佳答案

您没有考虑用户可能想要在形状移动之间移动形状这一事实。

您应该允许用户随时向左、向右和向下移动形状,但是在耗时结束之前,不要强行向下移动。

When I made a block-based game, here's what I did

void updateSeconds( double deltaTime ) {
// If timer until shape falls runs out, move the shape down.
timeUntilShapeDrop -= deltaTime;
if ( timeUntilShapeDrop > 0 || currentFallingShape->isAnimating() ) {
return;
}

// If ( shape collides with map when moved down )
currentFallingShape->move(-1,0);
if ( currentFallingShape->isCollisionWithMap ( * map ) ) {
currentFallingShape->move(1,0);

// Lock shape in place on the map
currentFallingShape->setBlocksOnMap( * map );
lastUpdateLinesCleared = clearFullLines();
}
timeUntilShapeDrop = calculateShapeDropTimeInterval();

如果您对一种方法感兴趣,我还包括了渐变形状动画。我在逻辑 map 之上构建了一个图形游戏 map ,并使用逻辑 map 开始图形插值。我破坏了我正在使用的图形库,但是逻辑代码仍然可以供您引用或使用。

关于C++在像俄罗斯方 block 这样的游戏中设置帧速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25903640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com