Я делаю простую игру, используя 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
включить файл.
Один из способов очистки экрана, который работает во многих системах, — это печать символа перевода страницы, \f
, Консоль Linux поддерживает это, как и MS-DOS, если вы загрузили ansi.sys
, Unix имеет ncurses
а также terminfo
абстрагировать эти функции.
Также полезно, если вы используете систему двойной буферизации, так что меняется только то, что необходимо перезаписывать в каждом кадре. Операции ввода-вывода чрезвычайно дороги, поэтому их следует минимизировать.
Кэмерон дает очень подробное описание того, как сделать это здесь
Но, по сути, вы должны использовать два массива, один из которых содержит текущее состояние карты, другой содержит предыдущее состояние и записывать только в определенные местоположения, которые изменились.