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

标签 c++ frame sfml rate

所以这个问题比一些更抽象一点。假设我有一个游戏,我只想每秒渲染一次,例如俄罗斯方 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/

相关文章:

c++ - SFML sprite 在制作多个纹理时是一个白色方 block

c++ - SFML游戏开发书籍——理解FPS计算

c++ - 如何用矩形制作2点角并保持正确的厚度?

c++ - Windows C++ - 在类中创建窗口使其看起来不寻常

javascript - 如何使用 Javascript 删除嵌套框架和 iframe 的滚动条

frame - 检查FCS以太网帧CRC-32在线工具

javascript - 在 Google Chrome 中使用 javascript 访问另一个框架( Uncaught ReferenceError )

c++ - 将参数作为对函数/方法的引用传递时的性能相关问题

c++ - 对 `TVersionCheck::TVersionCheck(int) 的 undefined reference

c++ - 正确使用嵌套循环和 fin