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

C++ Setting a frame rate in a game like Tetris

本文关键字:游戏 设置 帧速率 俄罗斯 方块 C++      更新时间:2023-10-16

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

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;
    }
}

我只想一次移动一个方块,每秒移动一次,但我不知道该怎么做。

编辑:这是渲染帧的代码

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();
}

您没有考虑到用户可能希望在形状的移动之间移动形状的事实。

您应该允许用户随时向左、向右和向下移动形状,但是直到经过的时间完成之后才强制向下移动。

当我制作一个基于区块的游戏时,以下是我所做的

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();

如果你感兴趣的话,我还包括了渐变动画。我在逻辑地图上构建了一个图形游戏地图,并使用逻辑地图开始图形插值。我破坏了我正在使用的图形库,但逻辑代码仍然可以参考或使用,如果你愿意的话。