webForumDet fria alternativet

khibit problem...

10 svar · 261 visningar · startad av Gaski

GaskiMedlem sedan juni 2000325 inlägg
#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?

Sang-draxMedlem sedan juli 2002570 inlägg
#2

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

Titta närmare på WM_KEYDOWN

GaskiMedlem sedan juni 2000325 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...

Marcus EMedlem sedan maj 20021 294 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.

GaskiMedlem sedan juni 2000325 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?

Marcus EMedlem sedan maj 20021 294 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:
Alpha IIMedlem sedan maj 20002 579 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

Alpha IIMedlem sedan maj 20002 579 inlägg
#8

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

if keys[VK_UP]
{
//kod
}

GaskiMedlem sedan juni 2000325 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?

Alpha IIMedlem sedan maj 20002 579 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

Alpha IIMedlem sedan maj 20002 579 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

Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb