webForumDet fria alternativet

Tangb bufferten

3 svar · 636 visningar · startad av Zaiboot

ZaibootMedlem sedan jan. 200225 inlägg
#1

Är det nån som kan hjälpa mig med ett litet problem?

Har gjort ett litet spel på skoj, fast en sak får jag inte riktigt till. När man ska flytta/skjuta osv kan man inte hålla ner tangeterna för då kommer den att forstsätta ett bra tag efter att man har slutat.

Jag tror att det löser sig om man kan tömma tangbords bufferten innan man börjar om med loopen och frågar efter en ny tangent (getch()).

Ser ungefär ut så här:
if (kbhit()) //om tangenttryckning då getch
{
c=getch();

  	if (c=='8') { fxr=0; fyr=-10; }
  	if (c=='2') { fxr=0; fyr=10; }
  	if (c=='4') { fxr=-10; fyr=-0; }
  	if (c=='6') { fxr=10; fyr=0; }

  	if (c=='n') { skott\[s1\]=1; skottx\[s1\]=fx; skotty\[s1\]=fy; }

  	if (c=='0') { n=0; gameover(p); }

sedan kommer resten som utför allt.

Hoppas nån kan hjälpa mig.

dBugMedlem sedan juni 200014 inlägg
#2

I Win32 API finns 2 funktioner

För att få status om alla tangenter:
GetKeyboardState()

eller polla enstaka tangent:
GetAsyncKeyState()

annars använd DirectInput.

ynefMedlem sedan jan. 20022 inlägg
#3

Zaiboot:
Jag utgår ifrån att du inte skriver för Win32 utan för DOS. Annars hade du säkerligen använt WinAPI eller DirectX, och inte de gamla funktionerna kbhit() och getch().

Det största problemet är att du använder just de funktioner du använder... det är rätt logik du har -- men funktionerna är dåliga och lämpar sig rätt uselt till spel. Om du är seriös med att göra spel i DOS (vilket jag antar att du gör just nu) så kan du skaffa dig djgpp http://www.delorie.com/ och allegro http://www.allegro.cc/ -- allegro är ett bra bibliotek som gör allt du kan vilja att ett spel ska klara (grafik, input, ljud, timers mm). Ok, slut på reklamen... man kan göra det själv i assembly också om man nu vill.

Du skulle alternativt kunna med en timers hjälp kunna kolla vid vilket tick (en sekund delat med 18.2) en tangent trycktes ner och sen om en ny tangent trycks ner så kollar du bara om tillräckligt lång tid har gått och behandlar det på något lämpligt sätt. Dessa timers är inte en standarddel av c/c++ men du kan som sagt få dem via ett bibliotek som allegro om du inte vill pilla med det själv i assembly (behöver skriva en egen interrupt till klockan som anropas just vid varje tick).

------------------
mu

MinsannMedlem sedan feb. 20011 517 inlägg
#4

-> ynäff
välkommen till wF! ;)

------------------
i'm going nowhere without my mössa!

Rinaldo> Minsanns intelekt försätter mig, Matti och Pace i en mörk skugga

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)