Gå til innhold

Knapper ødelegger for Form KeyDown


Anbefalte innlegg

Den registrerer ingen ting, nei. Du bruker feil måte.

 

I spillprogramering bruker man loops. Å bare oppdatere når brukeren trykker på en knapp er en fin ide, men kansje du vil ha fiender som rører på seg? Animerte fiender? Da funker plutselig ikke denne måten lenger.

 

Jeg har postet et veldig enkelt eksempel på hvordan man lager en loop for spill, og hvordan man stopper ved å trykke Esc. Jeg poster det her også. Bare lim inn koden i et tomt prosjekt:

Option Explicit

'Dette er en API som gjør at programmet "venter", og spillet vil ikke kreve mer resurser en nødvendig
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'Dette er en API som sjekker taster
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

'Når EndGame er true vil spillet stoppes
Dim EndGame As Boolean

Private Sub Form_Unload(Unload As Integer)

EndGame = True

End Sub

Private Sub Form_Load()

'Siden programmet aldri vil komme ut av form_load
'må vi Show'e formen
Me.Show

'Og vi starter "spillet"
GameLoop

End Sub

Private Sub GameLoop()

'Lage en loop helt til en variabel stopper den
Do Until EndGame = True
  
  'Så går ikke pc'en til helvete (100% cpu bruk)
  DoEvents
  
  'Sjekker om brukeren trykker noen knapper, og evt flytter formen
  SjekkTasteTrykk
  
  'Programmet venter
  Sleep 10
  
Loop

End

End Sub

Private Sub SjekkTasteTrykk()

'Hvis spilleren trykker escape, stopper spiller
If Not GetAsyncKeyState(vbKeyEscape) = 0 Then EndGame = True

'Sjekker piltastene og flytter formen hvis noen er trykker ned
If Not GetAsyncKeyState(vbKeyUp) = 0 Then Me.Top = Me.Top - 15
If Not GetAsyncKeyState(vbKeyDown) = 0 Then Me.Top = Me.Top + 15
If Not GetAsyncKeyState(vbKeyLeft) = 0 Then Me.Left = Me.Left - 15
If Not GetAsyncKeyState(vbKeyRight) = 0 Then Me.Left = Me.Left + 15

End Sub

Jo større spillet er, jo mer resurser krever det. Da bør man sette ned Sleep-tiden, eller fjerne den.

Lenke til kommentar
Videoannonse
Annonse

Skjønner at du gjerne vil ha denne loopen, men jeg har som sagt ikke holdt på med programmering noe særlig lenge og jeg ønsker ikke at denne versjonen av programmet skal inneholde animasjoner eller beveglige fiender (Annet enn eventuelt samtidig som når jeg flytter meg selv).

 

Alt jeg ønsker er å kunne lage spillet på min måte, enkelt og greit, og da helst ved at characteren flytter på seg når du trykker ned en piltast. Og da helst samtidig med at det er mulig å ha noen knapper på skjemaet.

 

Så beklager, men det du kommer med nå er for avansert. Dersom det ikke er mulig å bruke Form_KeyDown når en har knapper på skjemaet bruker jeg heller labels som knapper. Men jeg takker uansett for hjelpen, den kommer sikkert bedre med når jeg ønsker å lage et spill som skal fungere på den måten. :)

Lenke til kommentar

Hm. Dersom du ikke ønsker å benytte deg av infløkte teknikker, er vel den eneste muligheten å bruke en PictureBox til å lese alle innkommende tastetrykk. Altså, legg en slik kontroll i formen din (eksempelvis med samme bakgrunnsfarge som formen, slik at brukeren ikke ser den), og se etter KeyDown-hendelsen på denne kontrollen. Ettersom denne PictureBox-en også er en kontroll, i likhet med kommandoboksene, får denne også fokus. Idet man normalt sett ikke kan bruke piltastene for å flytte seg fra en PictureBox, vil dermed brukeren være låst på kontrollen, og den vil motta tastehendelsene sålenge den har fokus. Man kan imidlertid flytte fokus fra boksen og til andre kontroller, men dette kan du fikse ved å automatisk sette fokus til boksen når brukeren skriver:

 

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer)

   Picture1.SetFocus

End Sub

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...