C++;WriteConsole输出显示问题 我开始用C++编写一个简单的游戏。
在这个阶段,我将所有字符和属性(tile)存储在一个文件中,然后将该文件加载到CHAR_INFO中。然后使用WriteConsoleOutputA,我基本上可以绘制地图/世界 确保所有功能正常工作,并且没有显示问题。然而,当我开始移动我的角色时,他正在弄脏瓷砖。这有点难以解释,所以这里有一个小视频 正如你们所看到的,绿色瓷砖并没有问题(前景和背景是相同的颜色)。但当我走近灰色瓷砖时,它并没有按预期工作 main.cpp代码段C++;WriteConsole输出显示问题 我开始用C++编写一个简单的游戏。,c++,winapi,C++,Winapi,在这个阶段,我将所有字符和属性(tile)存储在一个文件中,然后将该文件加载到CHAR_INFO中。然后使用WriteConsoleOutputA,我基本上可以绘制地图/世界 确保所有功能正常工作,并且没有显示问题。然而,当我开始移动我的角色时,他正在弄脏瓷砖。这有点难以解释,所以这里有一个小视频 正如你们所看到的,绿色瓷砖并没有问题(前景和背景是相同的颜色)。但当我走近灰色瓷砖时,它并没有按预期工作 main.cpp代码段 int main() { while (0 < 1)
int main()
{
while (0 < 1)
{
if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState(0x57))
player.Move('u');
if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState(0x53))
player.Move('d');
if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState(0x41))
player.Move('l');
if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState(0x44))
player.Move('r');
Sleep(100);
}
}
intmain()
{
而(0<1)
{
if(GetAsyncKeyState(VK|u UP)| GetAsyncKeyState(0x57))
玩家移动('u');
if(GetAsyncKeyState(VK|U向下)| GetAsyncKeyState(0x53))
玩家移动('d');
if(GetAsyncKeyState(VK|U左)| GetAsyncKeyState(0x41))
玩家移动('l');
if(GetAsyncKeyState(VK|u RIGHT)| GetAsyncKeyState(0x44))
玩家移动('r');
睡眠(100);
}
}
字符类代码段
void Character::Move(char d)
{
COORD oldLoc = loc;
char walkableTiles[12] = {
4, 179, 191, 192, 193, 194, 195, 196, 197, 217, 218, 255
};
//set character
switch (d)
{
case 'u' :
loc.Y--;
break;
case 'd':
loc.Y++;
break;
case 'l':
loc.X--;
break;
case 'r':
loc.X++;
break;
}
//setup the buffer and location of tiles
CHAR_INFO newTile[1];
COORD buffSize = {1,1};
COORD buffPos = {0,0};
SMALL_RECT newBuffArea = {loc.X, loc.Y, loc.X, loc.Y};
SMALL_RECT oldBuffArea = {oldLoc.X, oldLoc.Y, oldLoc.X, oldLoc.Y};
//store newTile info
ReadConsoleOutputA(outHnd, newTile, buffSize, buffPos, &newBuffArea);
//check if newTile is valid
bool valid = 0; // assume not valid
for (int i=0; i < sizeof(walkableTiles); i++)
{
if (newTile[0].Char.AsciiChar == walkableTiles[i])
valid = 1;
}
if (!valid)
{
loc = oldLoc;
return;
}
//restore oldTile information
WriteConsoleOutputA(outHnd, oldTile, buffSize, buffPos, &oldBuffArea);
//newTile becomes oldTile
oldTile[0] = newTile[0];
//get bg of newTile and set character/attributes
int bg = (newTile[0].Attributes & Blue << BG ) | (newTile[0].Attributes & Red << BG) | (newTile[0].Attributes & Green << BG) | (newTile[0].Attributes & BACKGROUND_INTENSITY);
newTile[0].Char.AsciiChar = 1;
newTile[0].Attributes = White | bg;
//place character on newTile
WriteConsoleOutputA(outHnd, newTile, buffSize, buffPos, &newBuffArea);
void Character::Move(char d)
{
坐标oldLoc=loc;
char walkableTiles[12]={
4, 179, 191, 192, 193, 194, 195, 196, 197, 217, 218, 255
};
//设定字符
开关(d)
{
案例“u”:
loc.Y--;
打破
案例“d”:
loc.Y++;
打破
案例“l”:
loc.X--;
打破
案例“r”:
loc.X++;
打破
}
//设置磁贴的缓冲区和位置
字符信息新文件[1];
COORD buffSize={1,1};
COORD buffPos={0,0};
小纽布法里亚={loc.X,loc.Y,loc.X,loc.Y};
SMALL_RECT oldBuffArea={oldLoc.X,oldLoc.Y,oldLoc.X,oldLoc.Y};
//存储新文件信息
ReadConsoleOutputA(outHnd、NewFile、buffSize、buffPos和NewBuffaria);
//检查newfile是否有效
bool valid=0;//假定无效
对于(int i=0;i int bg=(新文件[0].Attributes&Blue所需的行为是什么?我没有看到任何平铺被弄脏。如果你看到角色在一些平铺上向左移动,似乎会将它们向左移动2个像素,从而在其中创建一个间隙。但是当你在它们上面向右移动时,它们是好的。再进一步观察,似乎角色重叠。当我们从右向左写入字符这将导致问题。