Masticore- Skrevet 23. september 2005 Del Skrevet 23. september 2005 (endret) 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 25. september 2005 av Masticore- Lenke til kommentar
aadnk Skrevet 24. september 2005 Del Skrevet 24. september 2005 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 millisekunderPrivate 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
hunters Skrevet 24. september 2005 Del Skrevet 24. september 2005 Hmmm har ikke formet selv et eget keypress event... ? Så slipper du å bruke API, jeg lagde et P2P Pacman og det var uten noen keylogg funksjoner! Lenke til kommentar
aadnk Skrevet 24. september 2005 Del Skrevet 24. september 2005 (endret) 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 24. september 2005 av aadnk Lenke til kommentar
hunters Skrevet 24. september 2005 Del Skrevet 24. september 2005 (endret) Fjernet! Endret 24. september 2005 av hunters Lenke til kommentar
aadnk Skrevet 24. september 2005 Del Skrevet 24. september 2005 Hunters, du skulle ikke kommentere innlegget, ser du vel. Lenke til kommentar
hunters Skrevet 24. september 2005 Del Skrevet 24. september 2005 Hunters, du skulle ikke kommentere innlegget, ser du vel. 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 Lenke til kommentar
aadnk Skrevet 24. september 2005 Del Skrevet 24. september 2005 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
Masticore- Skrevet 25. september 2005 Forfatter Del Skrevet 25. september 2005 aadnk: Nice program men det er ikke helt slikt jeg tenkte 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. Lenke til kommentar
Masticore- Skrevet 25. september 2005 Forfatter Del Skrevet 25. september 2005 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 Skrevet 25. september 2005 Del Skrevet 25. september 2005 aadnk: Nice program men det er ikke helt slikt jeg tenkte 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
Masticore- Skrevet 25. september 2005 Forfatter Del Skrevet 25. september 2005 takker :!: Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå