Toon posts:

[C++]Soort van lichtkrant werkt alleen tijdens debug

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:

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 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Als iets in debug wel werkt, maar nioet in release, dan is het meestal het geval dat er een variabele niet geinitialiseerd wordt. Bij debug wordt die vaak op 0 gezet, en in release niet.

  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 10-05 09:52

LazySod

Scumbag with a mission

In het algemeen is het zo dat je in dit geval een variable bent vergeten te initialiseren. In debug mode worden alle variabelen netjes uitgeveegd, in release build niet.

Welke het in jouw geval zou moeten zijn weet ik niet, maar ik zou beginnen met kijken naar de status van de variabelen in player ..

-- edit --

aargh.. sneller typen of reloaden? altijd handig die dubbele antwoorden.

[ Voor 13% gewijzigd door LazySod op 08-01-2005 19:53 ]

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


Verwijderd

Topicstarter
hmm, ik zal eens kijken, maar volgens bij begrijpen jullie het verkeerd. Ik kan het in release mode of in debug mode compilen (VC++ 6.0). Als ik m in debug mode compile kan ik m gewoon uitvoeren, maar kan ik er ook doorheen stappen. Als ik er doorheen stap werkt het wel, als ik m _in debug mode gecompiled_ uitvoer, werkt het niet.

edit:
Ik zie nu dat het wel werkt als ik steeds op een willekeurige toets druk, alsof de functie dan pas uitgevoerd word |:( :?

[ Voor 18% gewijzigd door Verwijderd op 08-01-2005 20:40 ]


Verwijderd

Topicstarter
met een truukje is het inmiddels gelukt :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:31

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op zondag 09 januari 2005 @ 18:54:
met een truukje is het inmiddels gelukt :)
welk trucje is dat? Altijd handig voor diegene die met de search tegen deze draad aanlopen :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
GetNumberOfConsoleInputEvents(gamedata.inputHandle, &unreadEvents); 
    if(unreadEvents)
    {
        ReadConsoleInput(gamedata.inputHandle, &inputRecord, 1, &eventsReadIn);
    //enz
    }
    else
    {
        moveObject(&player); //voorheen heette dit dus dontChangeDir() :p
    }
Pagina: 1