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:
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()
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 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?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| 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()
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| 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 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?
[ Voor 19% gewijzigd door Verwijderd op 08-01-2005 21:33 ]