c++ ASCII游戏控制台屏幕闪烁

C++ ASCII game console screen flickering

本文关键字:屏幕 闪烁 控制台 游戏 ASCII c++      更新时间:2023-10-16

我正在用c++做一个简单的游戏这只是一个带有ASCII地图的贴图游戏。游戏本身运行良好,但当我移动玩家时,主机屏幕(地图)闪烁,我不知道如何解决这个问题。任何帮助,感谢!

代码:

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <ctime>
#include <vector>
#include <string>
#include <cstdlib>
#include <fstream>
using namespace std;
vector<string> map;
int playerX = 10;
int playerY = 10;
int oldPlayerX;
int oldPlayerY;
bool done = false;
void loadMap();
void printMap();
void setPosition(int y, int x);
void eventHandling();
int main()
{
    loadMap();
    map[playerY][playerX] = '@';
    printMap();
    while(!done){
        eventHandling();
        printMap();
    }
    exit(1);
    return 0;
}
void eventHandling(){
    char command;
    command = _getch();
    system("cls");
    oldPlayerX = playerX;
    oldPlayerY = playerY;
    if(command == 'w'){
        playerY--;
    }else if(command == 'a'){
        playerX--;
    }else if(command == 'd'){
        playerX++;
    }else if(command == 's'){
        playerY++;
    }
    if(map[playerY][playerX] == '#'){
        playerX = oldPlayerX;
        playerY = oldPlayerY;
    }
    setPosition(playerY,playerX);
}
void setPosition(int y, int x){
    map[oldPlayerY][oldPlayerX] = '.';
    map[y][x] = '@';
}
void  printMap(){
    for(int i = 0 ; i < map.size() ; i++){
        cout << map[i] << endl;
    }
}
void loadMap(){
    ifstream file;
    file.open("level.txt");
    string line;
    while(getline(file, line)){
        map.push_back(line);
    }
}

std::cout不打算这样使用。

您应该参考目标操作系统和环境的系统特定API。例如,对于Windows,您应该使用控制台API函数来实现您的目的。这些函数在Wincon.h中定义,包括file.

如果您使用双缓冲系统,这样每帧只更改需要覆盖的内容,这也会有所帮助。IO操作非常昂贵,所以应该尽量减少。

Cameron给出了一个非常全面的描述如何做到这一点

但实际上,您将使用两个数组,一个包含映射的当前状态,一个包含以前的状态,并且只写入已更改的特定位置。

在许多系统上清除屏幕的一种方法是打印表单输入字符f。Linux控制台支持这一点,如果加载ansi.sys, MS-DOS也支持。Unix有ncursesterminfo来抽象这些函数