Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [Prog] C++: Lichtkrant werkt alleen bij debuggen (https://forum.scholieren.com/showthread.php?t=1067026)

Dr HenDre 08-01-2005 19:32

[C++]Soort ligtkrant werkt alleen tijdens het debuggen
 
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?

MightyMarcel 08-01-2005 21:03

kweenie zeker (kdoe al een hele tijd niet zoveel op dit gebied en mn C was al niet al te best, deed altijd meer met java), maar is dr niet gewoon een functie die de inhoud van de keyboard buffer doorgeeft ? get_key() of zoiets ?

Dr HenDre 09-01-2005 10:45

ja dat is dus juist t probleem volgens mij, hij moet eerst lezen om het in de buffer te zetten, en hij gaat niet verder tijdens het lezen van de toetsenbord, hij wacht totdat er iets is ingevoerd.

Ik heb nog effe gezocht gister avond op msdn, ik kwam op de functie WaitForSingleObject(), maar kreeg dat niet aan de praat. Weet iemand of dit de goeie functie is enzo hoe ik het hiermee voor elkaar krijg

Fade of Light 09-01-2005 11:33

Zomaar een idee: Kunstmatig een "toetsaanslag" in de buffer zetten (afgestemd op tijd, hovol de buffer zit etc) ?

Dr HenDre 09-01-2005 13:11

Citaat:

Fade of Light schreef op 09-01-2005 @ 12:33 :
Zomaar een idee: Kunstmatig een "toetsaanslag" in de buffer zetten (afgestemd op tijd, hovol de buffer zit etc) ?
daar heb ik ook aan gedacht maar hoe is de vraag. Stel je voor de code komt bij de regel ReadConsoleInput(), als ik datgene wat jij zegt doe, voor die regel doe, dan leest ie niets bij ReadConsoleInput en gaat ie meteen verder. Als ik het erna doe, wordt dat pas uitgevoerd op het moment dat er al een echte toets gelezen is.

:(

Dr HenDre 09-01-2005 20:00

Ok ok, ik ga maar door met jullie lastig vallen. Dat probleem waar dit topic eigenlijk voor is heb ik opgelost, maar nu heb ik een memleak die ik niet gefixt krijg.
de regels die van toepassing zijn:

Code:

gamedata.screenBuff = (CHAR_INFO*)malloc(sizeof(CHAR_INFO) * gamedata.width * gamedata.heigth);
        if(gamedata.screenBuff == NULL)
        {
                cout<<"Something went wrong";
        }
for(int i=0; i<(sizeof(CHAR_INFO) * gamedata.width * gamedata.heigth); i++)
        {
                gamedata.screenBuff[i].Char.AsciiChar = ' ';
                gamedata.screenBuff[i].Attributes = BACKGROUND_GREEN;
        }

Code:

        while(!gamedata.gameover)
        {
                updateMove();
        }
       
        FreeMem();

Code:

void FreeMem()
{
        // If we allocated a screen buffer, free it
        if(gamedata.screenBuff)
        {
                free(gamedata.screenBuff);
                gamedata.screenBuff = NULL;
        }

        // Remove any "keystrokes" that may be queued up
        FlushConsoleInputBuffer(gamedata.inputHandle);
       
}

Op het moment dat free() wordt uitgevoerd crasht ie :(
why o why

McMotion 10-01-2005 00:42

hoe crashtie? en waarom gebruik je trouwens malloc ipv new? (en waarom alloceer je dat geheugen uberhaupt dynamisch?)

Dr HenDre 10-01-2005 09:43

http://members.lycos.nl/hendre/memleak.jpg
dunno waarom ik malloc gebruik ipv new, heb dit een klein beetje gebasseerd op een tut wat ik op inet had gevonden. En de reden dat ik geheugen dynamisch alloceer is omdat ik het later uit wil breiden met de functie dat de gebruiker zelf de grootte in kan stellen van t speelveld :)

Dr HenDre 10-01-2005 10:04

nevermind, tis opgelost (dankzij got (a))

Fade of Light 10-01-2005 16:55

Lol ik open dit topic, ram o[p page down en krijg ineens een error en denk "wtf"...en toen zag ik pas de tekst en dat het een plaatje was :+

Dr HenDre 10-01-2005 18:59

hahaa, lool :D :D


Alle tijden zijn GMT +1. Het is nu 04:31.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.