webForumDet fria alternativet

khibit problem...

C/C++

10 svar · 261 visningar · startad av Gaski

Medlem sedan juni 2000310 inlägg
Frågan#1

Har i mitt fagra win program försökt lägga till en knapptrycks avkännare :)

Dvs i det eviga lopen i WinMain funktionen har jag lagt till följande kod:

        if(kbhit()) {
            // Hämta nedtryckt tangent
            int key = getch();
            // Kolla om tangenten är 32(mellanslag)
            if(key == 32) {

				if(x < 1)
					xvel = 1;
				if(x > 139)
					xvel = -1;
				if(y < 1)
					yvel = 1;
				if(y > 392)
					yvel = -1;
	
				x += xvel;
				y += yvel;
             }
        }

Men ingenting händer när jag trycker på mellanslag, om jag tar bort alla knapp-if-satser och bara har x och y satserna kvar kommer objektet att röra på sig fint och studsa mot kanterna men meningen är att jag ska kunna styra det med mellanslagstangenten.

Varför fungerar inte ovanstående kod?

Medlem sedan juli 2002581 inlägg
#2

kbhit() är en konsollfunktion; den fungerar ej i GUI-apps.

Titta närmare på WM_KEYDOWN

Medlem sedan juni 2000310 inlägg
#3

Antar att jag ska använda den i switch-satsen i WindowProc funktionen men vad ska jag skriva där? Hur gör jag för att kolla vilken knapp det är osv...

Medlem sedan maj 20021 466 inlägg
#4

T.ex. så här:

switch(uMsg)
{
case WM_KEYDOWN:

int key = (int)wParam;
if(key == VK_SPACE)
{
...
}

break;
}

Läs i dokumentationen för WM_KEYDOWN och virtual-key codes.

Medlem sedan juni 2000310 inlägg
#5

Kör följande kod:

		case WM_KEYDOWN:
		{
			int key = (int)wparam;
			switch(key)
			{
			case VK_UP:
				{
					xvel = 0;
					yvel = 1;
				}
		        case VK_DOWN:
				{
					xvel = 0;
					yvel = -1;
				}
				case VK_LEFT:
				{
					xvel = -1;
					yvel = 0;
				}
		        case VK_RIGHT:
				{
					xvel = 1;
					yvel = 0;
				}
			}

			x += xvel;
			y += yvel;

			return(0);
		} break;

Men den väljer alltid VK_RIGHT, varför då?

Dokumentation? Var finns den?

Medlem sedan maj 20021 466 inlägg
#6

Dokumentationen följde med när du installerade.
Den kan också hittas någonstans på msdn.microsoft.com

Ditt problem är att du inte använder break efter varje case-sats.

				case VK_UP:
				{
					xvel = 0;
					yvel = 1;
				}
				[b]break;[/b]
			        case VK_DOWN:
Medlem sedan maj 20002 993 inlägg
#7

Gör du ett spel? (eftersom du frågar om directx i en annan tråd)
Då kan du ju använda DirectInput eller skapa en array med 255 bools.

Sen lägger du till i WM_KEYDOWN om arrayen heter keys:
keys[wParam] := TRUE;

och tvärtom i WM_KEYUP

Medlem sedan maj 20002 993 inlägg
#8

Sen kan du varje ruta kontrollera om tex pilupp tangenten är nedtryckt genom att skriva

if keys[VK_UP]
{
//kod
}

Medlem sedan juni 2000310 inlägg
#9

Försöker lära mig att göra spel :)
Hur menar du med directInput, har försökt lite med koden ovan men den kan ju bara hantera en tangent i taget, vill hantera minst två i taget vilket directInput klarar. Har du nåt enkelt exempel?

Medlem sedan maj 20002 993 inlägg
#10

Hur menar du?
Om du har en array kan du hantera att flera knappar trycks samtidigt.

Du kontrollerar inte om knapparna trycks ner i WM_KEYDOWN utan i spel loopen.

Hur DirectINput fungerar vet jag inte eftersom jag bara har använt DX med DelphiX i delphi och det är inte riktigt samma sak

Medlem sedan maj 20002 993 inlägg
#11

http://www.gamedev.net finns mycket information om spelprogrammering och ett bra forum :) du får aldrig några bra svar på wf om spelproframmering

260 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)