Ik ben bezig met het maken van snake in console mode omdat ik me een beetje verveel, maar ik loop nu tegen een probleem. Ik wil dat de speler (in dit geval nog maar bestaande uit 1 char) van links naar rechts beweegt als er geen toetsen ingedrukt zijn. Ik heb nu het volgende:
Code:
bool updateMove()
{
INPUT_RECORD inputRecord;
DWORD eventsReadIn;
ReadConsoleInput(gamedata.inputHandle, &inputRecord, 1, &eventsReadIn);
if(inputRecord.EventType == KEY_EVENT && inputRecord.Event.KeyEvent.bKeyDown)
{
switch(inputRecord.Event.KeyEvent.wVirtualKeyCode)
{
case VK_UP:
//moveUp(&player);
changeDirUp(&player);
break;
case VK_DOWN:
//moveDown(&player);
changeDirDown(&player);
break;
case VK_RIGHT:
//moveRight(&player);
changeDirRight(&player);
break;
case VK_LEFT:
//moveLeft(&player);
changeDirLeft(&player);
break;
case VK_ESCAPE:
gamedata.gameover = true;
break;
}
return 1;
}
else
{
dontChangeDir(&player);
return 1;
}
}
Dit moet ervoor zorgen dat op het moment dat de pijltjes worden gebruikt de bewegingsrichting wordt verander, maar het gaat me nu even om de functie dontChangeDir()
Code:
void dontChangeDir(OBJECT *player)
{
int offset = player->xPos + player->yPos * gamedata.width;
gamedata.screenBuff[offset].Char.AsciiChar = ' ';
gamedata.screenBuff[offset].Attributes = BACKGROUND_GREEN;
//huidige plaats wordt hersteld naar orgineel
if(player->xPos != gamedata.width-1)
player->xPos++;
else if(player->xPos == gamedata.width-1)
player->xPos = 0;
//nieuwe positie vaststellen
offset = player->xPos + player->yPos * gamedata.width;
gamedata.screenBuff[offset].Char.AsciiChar = player->dispChar;
gamedata.screenBuff[offset].Attributes = player->color;
//benodige data in array stoppen
drawScreen();
Sleep(100);
}
Op het moment dat ik door de code stap voor stap debug zie ik netjes na een paar keer klikken dat de 1 helemaal van links naar rechts over het scherm beweegt.
Als ik dit echter gewoon uitvoer(gecompiled in debug mode dus, niet in release mode) komt de A niet verder dan "hokje" 2, dus xPos 1.
Iemand een idee wat ik fout doe?
edit:
Inmiddels heb ik gevonden waarom hij niet loopt, hij wacht op invoer van toetsenbord bij ReadConsoleInput(). Als ik de derde param van die funcite op 0 zet, dan begint mn A-tje te lopen, maar leest hij geen toetsen meer in. Met andere woorden, besturing wordt dan onmogelijk. Heeft iemand suggesties van hoe ik dit op kan lossen? Dus dat hij blijft lopen, maar tegerlijkertijd toch controleert of er invoer van het toetsenbord is. Is threads te complex of is dat de enige oplossing?