C++在俄罗斯方块这样的游戏中设置帧速率
C++ Setting a frame rate in a game like Tetris
所以这个问题比一些问题更抽象一些。假设我有一个游戏,我只想每秒渲染一次,比如俄罗斯方块克隆。我只想每秒处理一个输入,然后相应地渲染新帧。俄罗斯方块是一款基于网格的游戏,所以我不能只将游戏片段移动人们通常用于帧速率示例的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();
如果你感兴趣的话,我还包括了渐变动画。我在逻辑地图上构建了一个图形游戏地图,并使用逻辑地图开始图形插值。我破坏了我正在使用的图形库,但逻辑代码仍然可以参考或使用,如果你愿意的话。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何为我的游戏设置主菜单场景?QT C++
- 在Windows 8上设置COCOS 2DX游戏开发环境中的错误
- 设置碰撞检测,然后在 2D 游戏中处理碰撞
- C++在俄罗斯方块这样的游戏中设置帧速率
- 在简单的游戏设置中正确使用物体
- c++入门课程作业:井字游戏;设置数组时出现错误
- 如何在游戏中设置通知系统