Registreer FAQ Berichten van vandaag


Ga terug   Scholieren.com forum / Technologie / Software & Hardware
Reageren
 
Topictools Zoek in deze topic
Oud 08-01-2005, 19:32
Dr HenDre
Avatar van Dr HenDre
Dr HenDre is offline
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?

Laatst gewijzigd op 08-01-2005 om 20:33.
Met citaat reageren
Advertentie
Oud 08-01-2005, 21:03
MightyMarcel
Avatar van MightyMarcel
MightyMarcel is offline
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 ?
__________________
Aut Caesar aut nullus
Met citaat reageren
Oud 09-01-2005, 10:45
Dr HenDre
Avatar van Dr HenDre
Dr HenDre is offline
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
Met citaat reageren
Oud 09-01-2005, 11:33
Fade of Light
Avatar van Fade of Light
Fade of Light is offline
Zomaar een idee: Kunstmatig een "toetsaanslag" in de buffer zetten (afgestemd op tijd, hovol de buffer zit etc) ?
Met citaat reageren
Oud 09-01-2005, 13:11
Dr HenDre
Avatar van Dr HenDre
Dr HenDre is offline
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.

Met citaat reageren
Oud 09-01-2005, 20:00
Dr HenDre
Avatar van Dr HenDre
Dr HenDre is offline
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

Laatst gewijzigd op 09-01-2005 om 20:40.
Met citaat reageren
Oud 10-01-2005, 00:42
McMotion
Avatar van McMotion
McMotion is offline
hoe crashtie? en waarom gebruik je trouwens malloc ipv new? (en waarom alloceer je dat geheugen uberhaupt dynamisch?)
__________________
[AvatarDraw(c) v1.0 is uit de lucht (en per ongeluk van mijn hardeschijf verdwenen tijdens het weggooien ervan
Met citaat reageren
Oud 10-01-2005, 09:43
Dr HenDre
Avatar van Dr HenDre
Dr HenDre is offline

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
Met citaat reageren
Oud 10-01-2005, 10:04
Dr HenDre
Avatar van Dr HenDre
Dr HenDre is offline
nevermind, tis opgelost (dankzij got (a))
Met citaat reageren
Oud 10-01-2005, 16:55
Fade of Light
Avatar van Fade of Light
Fade of Light is offline
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 :+
Met citaat reageren
Oud 10-01-2005, 18:59
Dr HenDre
Avatar van Dr HenDre
Dr HenDre is offline
hahaa, lool
Met citaat reageren
Advertentie
Reageren


Regels voor berichten
Je mag geen nieuwe topics starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit

Spring naar


Alle tijden zijn GMT +1. Het is nu 06:07.