Gå til innhold

Hvordan skjekker jeg om en knapp er trykt på?


Anbefalte innlegg

Hvordan skjekker jeg om en knapp er trykt på?

Jeg driver å leker meg og skal ha en firkant som jeg kan bevege rundt omkring med piltastene, men det får jeg ikke til.

Jeg klarte det når jeg satt inn 4 cmdknapper som representerte de fire piltastene.

Endret av Masticore-
Lenke til kommentar
Videoannonse
Annonse

Jeg vet ikke hvor avansert du ville lage dette, men jeg tok en råsjanse og satset på følgende. Legg koden inn i en form sammen med en Shape du navngir shapeSquare:

 

' Vårt API-kall som lar kjøringen av den lokale tråden vente i en gitt antall millisekunder

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

 

' Dette API-kallet returnerer statusen på en gitt tastaturknapp

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

 

' Hvorvidt vi skal avslutte spillprosedyren

Private bExit As Boolean

 

' De to forskjellige bevegelser

Private MovementX As Single

Private MovementY As Single

 

Public Sub GameLoop()

 

    ' Nullstill variabel

    bExit = False

   

    ' Forsett løkken inntil avslutningsvariabelen settes til True

    Do Until bExit

   

        ' Sjekk etter tastetrykk

        CheckKeyboard

   

        ' Her beveger vi selve objektet etter bevegelseshastighetene

        shapeSquare.Left = shapeSquare.Left + MovementX

        shapeSquare.Top = shapeSquare.Top + MovementY

       

        ' Dersom objektet kommer utenfor formen, må vi sette den i bevegelse i motsatt retning

        CheckPosition

       

        ' La forskjellige hendelser bli eksekvert

        DoEvents

       

        ' Vent ti millisekunder (slik at vi ikke forbruker 100% CPU)

        Sleep 10

   

    Loop

 

End Sub

 

Public Sub CheckPosition()

 

    ' Dersom vi ligger utenfor kanten til høyre, ...

    If shapeSquare.Left < 0 Then

       

        ' ... må vi nullstille X-posisjonen og invertere X-bevegelsen (samt senke den med 10%)

        shapeSquare.Left = 0

        MovementX = -MovementX * 0.9

       

    End If

   

    ' Likeledes her - bare med den øverste kant

    If shapeSquare.Top < 0 Then

        shapeSquare.Top = 0

        MovementY = -MovementY * 0.9

    End If

   

    ' Ligger objektet utenfor venstre kant, ...

    If shapeSquare.Left + shapeSquare.Width > Me.ScaleWidth Then

       

        ' ... må vi nullstille posisjonen og invertere bevegelsen

        shapeSquare.Left = Me.ScaleWidth - shapeSquare.Width

        MovementX = -MovementX * 0.9

   

    End If

   

    ' Dersom objekter ligger utenfor den nederste kant, ...

    If shapeSquare.Top + shapeSquare.Height > Me.ScaleHeight Then

   

        ' ... gjør vi likeledes.

        shapeSquare.Top = Me.ScaleHeight - shapeSquare.Height

        MovementY = -MovementY * 0.9

       

    End If

 

End Sub

 

Public Sub CheckKeyboard()

 

    Dim aKeys As Variant, Tell As Long

   

    ' De forskjellige tastetrykkene vi skal sjekke for

    aKeys = Array(vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown)

   

    ' Her sjekker vi for tastetrykkene

    For Tell = LBound(aKeys) To UBound(aKeys)

   

        ' Sjekk om tasten er blitt nedtrykket

        If GetAsyncKeyState(aKeys(Tell)) <> 0 Then

       

            Select Case aKeys(Tell)

            Case vbKeyLeft

           

                ' Senk bevegelseshastigheten slik at objektet flyttes til venstre i X-aksen

                MovementX = MovementX - 1

   

            Case vbKeyRight

           

                ' Dersom vi derimot øker hastigheten, gjøres det motsatte

                MovementX = MovementX + 1

           

            Case vbKeyUp

           

                ' Gjør likedan, bare her med Y-aksehastigheten

                MovementY = MovementY - 1

   

            Case vbKeyDown

           

                ' La objektet beveges nedover

                MovementY = MovementY + 1

           

            End Select

   

        End If

   

    Next

 

End Sub

 

Private Sub Form_Load()

 

    ' Vi bruker piksler i stedet, da dette er en mer korrekt måleenhet

    Me.ScaleMode = vbPixels

 

    ' På dette punktet er ikke formen synlig - således må vi synliggjøre den manuelt

    Show

 

    ' Start spillprosedyren

    GameLoop

 

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

 

    ' Når brukeren avslutter vinduet, må vi òg avslutte spillprosedyren

    bExit = True

 

End Sub

 

Bare spør om du lurer på noe. :)

Lenke til kommentar
Hmmm har ikke formet selv et eget keypress event... ?

KeyPress kan ikke benyttes, idet den ikke eksekveres når piltastene nedtrykkes. Men det stemmer jo for så vidt - formen har så abslutt taste-hendelser en kan anvende. Men, disse hendelsene krever en del koding òg (du må i dette tilfellet håndtere både KeyDown- og KeyUp-hendelsen). Derfor syntes jeg det i bunn og grunn var bedre med API-kallet - antallet kodelinjer sank faktisk i forhold til alternativet.

Endret av aadnk
Lenke til kommentar
Det er en anmodning til å ikke kommentere det, på negativt hvis...

Jeg var positiv til innlegget.. grunnen til det å kommentere er vel fordi folk ikke skal hetse admin folka

Nei, det står bare at du ikke skal kommentere det. Men, for å ikke spore diskusjonen helt av, får det være nok Off-topic fra min side.

Lenke til kommentar

Denne har driver jeg å jobber med, men den funker ikke som den skal, når jeg trykker på en piltast så forsvinner bilde.

 

Option Explicit

 

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

 

Private Const KEY_TOGGLED As Integer = &H1

Private Const KEY_DOWN As Integer = &H1000

 

'Out stop flag

Dim TimeToEnd As Boolean

 

Private Sub Form_Load()

 

RunMain

 

End Sub

 

Private Sub RunMain()

 

'Show and refresh the form

Me.Show

Me.Refresh

 

Do

 

    If (GetKeyState(vbKeyUp) And KEY_DOWN) Then

        osama.Top = osama.Top + 150

    ElseIf (GetKeyState(vbKeyDown) And KEY_DOWN) Then

        osama.Top = osama.Top - 150

    ElseIf (GetKeyState(vbKeyRight) And KEY_DOWN) Then

        osama.Left = osama.Left - 150

    ElseIf (GetKeyState(vbKeyLeft) And KEY_DOWN) Then

        osama.Left = osama.Left + 150

    End If

 

 

    DoEvents

 

Loop Until TimeToEnd

 

 

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

 

'Mark the program to end

TimeToEnd = True

 

End Sub

Lenke til kommentar
aadnk: Nice program men det er ikke helt slikt jeg tenkte på :p

bare helt vanlig lissom at den beveger seg i samme hastighet hele tiden og man må holde inne piltastene hele tiden for at den skal bevege seg, slipper du så stopper den.

I så fall kan du endre CheckKeyboard-prosedyren til følgende:

 

Public Sub CheckKeyboard()

 

    Dim aKeys As Variant, Tell As Long

     

    ' Nullstill variabler

    MovementX = 0

    MovementY = 0

 

    ' De forskjellige tastetrykkene vi skal sjekke for

    aKeys = Array(vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown)

   

    ' Her sjekker vi for tastetrykkene

    For Tell = LBound(aKeys) To UBound(aKeys)

   

        ' Sjekk om tasten er blitt nedtrykket

        If GetAsyncKeyState(aKeys(Tell)) <> 0 Then

       

            Select Case aKeys(Tell)

            Case vbKeyLeft: MovementX = -8

            Case vbKeyRight: MovementX = 8

            Case vbKeyUp: MovementY = -8

            Case vbKeyDown: MovementY = 8

            End Select

   

        End If

   

    Next

 

End Sub

 

For øvrig, årsaken til at objektet forsvinner i ditt tilfelle er ettersom hele kjøringen går altfor raskt. Du MÅ legge til Sleep 10 etter DoEvents. I tillegg bør ScaleMode, i dette tilfellet, stå på Twips. Ennvidere er tastene knyttet til feil bevegelse - eksempelvis beveges objekter oppover når du trykker på ned-piltasten.

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...