Hüpfen / Jump

  • VB6

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von bsHobbit.

    Hüpfen / Jump

    Hallo,

    bin ein Anfänger ---> = Sorry

    Ich möchte ein J & R Spiel machen, weis es gab schon Threads aber haben mir nicht geholfen.

    Erstmal möchte ich es nur schaffen meinen Hero springen zu lassen.

    Ich kriege es schon hin das er quasi hochhüpft (wobei das ja eigentlich auch verzögert laufen soll... das später)

    aber er geht nicht automatisch wieder runter.

    Also erstmal würde ich mich freuen wenn mir jemand sagt wie Hero hüpft und auch wieder runterkommt : >.

    (hab vorher schon nach Tutorials dazu gesucht aber nix gefunden)
    Mit nem Timer o.Ä.
    Also:
    den Timer anfangs auf .Enabled = false stellen, intervall auf z.B. 100 ms


    Dann beim "Sprung"-Eregnis:

    Visual Basic-Quellcode

    1. picture1.Top = Picture1.Top - 120
    2. Timer1.Enabled = true



    Beim Timer1_Timer-Eregnis:

    Visual Basic-Quellcode

    1. picture1.Top = Picture1.Top + 120
    2. Timer1.Enabled = false



    Wenn der Sprung animiert sein soll, wirst du kaum um eine "Mainloop" oder zumindest eine aufwändige Schleife fürs Springen rumkommen...


    so long.. Andy

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

    form.keypreview auf true stellen.

    Dann kannst du die Tasten bei form_keydown ,... abfangen und dementsprechend handeln.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    3. If KeyCode = vbKeyUp Then
    4. MsgBox "Oben"
    5. End If
    6. End Sub
    7. Private Sub Form_Load()
    8. Me.KeyPreview = True
    9. End Sub
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Gut das funktioniert schonmal danke.

    Ich habe jetzt noch ein Problem, hier erstmal mein code


    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    3. If KeyCode = vbKeyUp Then
    4. hero.Top = hero.Top - 300
    5. Timer1.Enabled = True
    6. End If
    7. If KeyCode = vbKeyDown Then
    8. hero.Top = hero.Top + 200
    9. Timer4.Enabled = True
    10. hero.Height = hero.Height - 200
    11. Timer5.Enabled = True
    12. End If
    13. If KeyCode = vbKeyLeft Then
    14. Timer3.Enabled = True
    15. End If
    16. If KeyCode = vbKeyRight Then
    17. Timer2.Enabled = True
    18. End If
    19. End Sub
    20. Private Sub Form_Load()
    21. Timer1.Enabled = False
    22. Timer2.Enabled = False
    23. Timer3.Enabled = False
    24. Timer4.Enabled = False
    25. Timer5.Enabled = False
    26. Me.KeyPreview = True
    27. End Sub
    28. Private Sub Timer1_Timer()
    29. hero.Top = hero.Top + 300
    30. Timer1.Enabled = False
    31. End Sub
    32. Private Sub Timer2_Timer()
    33. hero.Left = hero.Left + 120
    34. Timer2.Enabled = False
    35. End Sub
    36. Private Sub Timer3_Timer()
    37. hero.Left = hero.Left - 120
    38. Timer3.Enabled = False
    39. End Sub
    40. Private Sub Timer4_Timer()
    41. hero.Height = hero.Height + 200
    42. Timer4.Enabled = False
    43. End Sub
    44. Private Sub Timer5_Timer()
    45. hero.Top = hero.Top - 200
    46. Timer5.Enabled = False
    47. End Sub




    Also mein Hero kann jetzt springen, sich ducken und sich nach rechts und links Bewegen.

    Problem :

    wenn ich die nach "unten" Taste für Ducken mehrmals schnell drücke, wird mein Hero immer kleiner ^^

    und wenn ich die nach "oben" Taste mehrmals schnell Drücke springt mein hero immer Höher bzw nimmt sich dann die neue Höhe als Absprungsort an, kannst mir da was sagen wie ich das unterbinden kann =?
    Du musst dir halt merken, ob er sich schon geduckt hat, oder gerade am springen ist und dementsprechend die Aktionen überspringen.

    Also z.b. eine Variable für springen nehmen.
    Im Prinzip so:

    if springen = 0 then

    springen=1
    ....restliche Code
    endif

    irgendwann dann, wenn das Springen erledigt wurde

    if springen fertig then springen=0

    Du nutzt zu viele Timer. Ich würde eine Hauptschleife nutzen, so kannst du die Reihenfolge besser beeinflussen. Siehe mein Beispiel zu deiner anderen Frage zu deinem Projekt.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    So,

    ich bin noch immer beim springen aber es fehlt nur noch der letzte Schliff.

    Ich hoffe peterfido oder Agent können mir helfen.

    Hier erstmal mein Code :


    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim intRx As Integer
    3. Dim intRy As Integer
    4. Dim intHoch As Integer
    5. Dim intRunter As Integer
    6. Dim intRechts As Integer
    7. Dim intLinks As Integer
    8. Dim springen As Boolean
    9. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    10. If KeyCode = vbKeyUp Then
    11. hero.Top = hero.Top - 800
    12. Timer2.Enabled = True
    13. springen = True
    14. End If
    15. If springen = True Then
    16. hero.Top = 6000
    17. End If
    18. If KeyCode = vbKeyDown Then
    19. intRx = intRunter
    20. End If
    21. If KeyCode = vbKeyLeft Then
    22. intRy = intLinks
    23. End If
    24. If KeyCode = vbKeyRight Then
    25. intRy = intRechts
    26. End If
    27. End Sub
    28. Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    29. If KeyCode = vbKeyDown Then
    30. intRx = 0
    31. End If
    32. If KeyCode = vbKeyLeft Then
    33. intRy = 0
    34. End If
    35. If KeyCode = vbKeyRight Then
    36. intRy = 0
    37. End If
    38. End Sub
    39. Private Sub Form_Load()
    40. Me.KeyPreview = True
    41. Timer1.Enabled = True
    42. Timer2.Enabled = False
    43. intRunter = 300
    44. intRechts = 120
    45. intLinks = -120
    46. End Sub
    47. Private Sub Timer1_Timer()
    48. hero.Top = hero.Top + intRx
    49. hero.Left = hero.Left + intRy
    50. End Sub
    51. Private Sub Timer2_Timer()
    52. hero.Top = hero.Top + 800
    53. Timer2.Enabled = False
    54. End Sub



    Mein Hero bewegt sich flüssig und durch die "if then" Regelung hüpft er auch nicht immer höher wenn man die
    keyup taste gedrückt hält.

    Ein Problem noch :

    Wenn ich das allererste mal KEYUP drücke sackt der Hero einmal ab und springt von da an immer Hoch und runter und erst wenn ich nach links oder rechts drücke, wird die alte Höhe wiederhergestellt.

    Hoffe Ihr findet das Problem und könnt mir helfen.
    If springen = True Then
    hero.Top = 6000
    End If

    Damit überschreibst du ja wieder "hero.Top = hero.Top - 800", soll das so sein?

    Und bei KeyUp werden zwar variablen auf 0 gesetzt, aber der hero wird nicht neu positioniert...
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Hmm,

    ich weis nicht,

    also ich hatte das so gedacht :

    KEYUP Taste Drücken = HERO 800 Twips hoch

    dann kommt Timer = Hero wieder 800 Twips runter

    und wenn er gesprungen ist soll die Ausgangshöhe immer wieder 6000 sein.


    Damit er nicht bei haltender KEYUP Taste immer höher springt, was er durch diese "If-Bestimmung" auch nicht mehr tut.

    Aber wie gesagt, dafür sackt er beim ersten drücken einmal ab, aus dieser Position hüpft er dann wunderbar, aber wenn man nach rechts / links läuft wird die TOP erst wieder auf 6000 gesetzt.

    : < Ich probier schon alles aus, aber merze ich einen Fehler aus entsteht ein anderer, habt ihr nicht noch ne idee ?
    Ich steck zwar nicht mehr so in VB drin, aber ich werd mich mal dran versuchen ;)


    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim intRx As Integer = 0
    3. Dim intRy As Integer = 0
    4. Dim intHoch As Integer = -300
    5. Dim intRunter As Integer = 300
    6. Dim intRechts As Integer = 120
    7. Dim intLinks As Integer = -120
    8. Dim springen As Boolean = False
    9. 'ps: Deutsche namen als Bezeichner sind blöd :p
    10. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    11. If (KeyCode = vbKeyUp) and (Not springen) Then
    12. hero.Top -= 800
    13. Timer2.Enabled = True
    14. springen = True
    15. End If
    16. If KeyCode = vbKeyDown Then
    17. intRx = intRunter
    18. End If
    19. If KeyCode = vbKeyLeft Then
    20. intRy = intLinks
    21. End If
    22. If KeyCode = vbKeyRight Then
    23. intRy = intRechts
    24. End If
    25. End Sub
    26. Private Sub Timer1_Timer()
    27. 'kann es sein, das x und y vertauscht wurden, oder bin ich einfach noch nicht wach genug ?^^
    28. ' und hier sollte eigentlich auch mal ne abfrage rein, obs überhaupt noch weiter runter geht^^
    29. 'bzw weiter nach rechts oder links. Ich kommentier mal nen Beispiel aus
    30. 'if hero.top < Max_Down then
    31. hero.Top += intRx
    32. 'end if
    33. hero.Left += intRy
    34. End Sub
    35. Private Sub Timer2_Timer()
    36. hero.Top += 800
    37. Timer2.Enabled = False
    38. springen = false
    39. End Sub
    40. Private Sub Form_Load()
    41. Me.KeyPreview = True
    42. Timer1.Enabled = True
    43. Timer2.Enabled = False
    44. End Sub
    45. Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    46. If KeyCode = vbKeyDown Then
    47. intRx = 0
    48. 'Bin mir nicht sicher, aber der soll ja auch wieder aufstehen oder ?
    49. hero.top += intHoch
    50. End If
    51. If KeyCode = vbKeyLeft Then
    52. intRy = 0
    53. End If
    54. If KeyCode = vbKeyRight Then
    55. intRy = 0
    56. End If
    57. End Sub


    Du könntest den hero aus "sanfter" fallen und springen lassen.
    Als anregung mal:

    Visual Basic-Quellcode

    1. Private Sub Timer2_Timer()
    2. if Hero.Top < BODEN_HOEHE then
    3. hero.top += 100
    4. else
    5. Timer2.Enabled = False
    6. springen = false
    7. end if
    8. End Sub


    Ich hoffe ich konnte ein kleines bisschen helfen, jetzt muss ich erstmal wieder an die Arbeit :*/

    Und wenn du noch iwi Hilfe brauchst bei deinem Projekt, dann Adde mich einfach mal bei icq, ich bin zwar nicht sehr oft online, aber ich helfe gern, wenn ich kann^^

    ICQ: 317518036
    e-Mail: bs-Hobbit@freenet.de
    MSN: hendrik.r@hotmail.de

    emails les ich eigentlich täglich

    Gruß Hobbit

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „bsHobbit“ ()

    Ich hab mal was in VB 2005 geschrieben xD

    nicht sehr liebevoll, und nicht grad modular, aber es sollte reichen xD

    du musst es nur auf vb6 syntax anpassen, aber das sollte nicht schwer sein ;)

    funktioniert einwandfrei

    man muss natürlich die werte noch anpassen und son krams, weil ich das eben hingeschlampt habe xD aber auch das sollte kein Problem sein das umzuschreiben ;) hab nur nich soviel zeit hier, das alles sauber zu programmieren...

    ok, wusste ich nicht, das vb6 die zwei operatoren nicht kennt.

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Private Enum eJumpStates
    3. None
    4. Up
    5. Down
    6. End Enum
    7. Private Enum eMove
    8. Left
    9. Right
    10. None
    11. End Enum
    12. Private Jump As eJumpStates = eJumpStates.None 'Player jumps or not
    13. Private CurrentMove As eMove = eMove.None 'CurrentMoveMent
    14. Private JumpHeight As Integer = 50 'Jump units
    15. Private DefaultHeight As Integer = 200 'default hero.top
    16. Private Duck As Integer = 10
    17. Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    18. Select Case e.KeyCode
    19. Case Keys.Up
    20. If Jump = eJumpStates.None Then
    21. Jump = eJumpStates.Up
    22. End If
    23. Case Keys.Left
    24. CurrentMove = eMove.Left
    25. Case Keys.Right
    26. CurrentMove = eMove.Right
    27. Case Keys.Down
    28. If Hero.Height = 22 Then
    29. Hero.Height -= Duck
    30. Hero.Top += Duck
    31. DefaultHeight += Duck
    32. End If
    33. End Select
    34. End Sub
    35. Private Sub tmrJump_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrJump.Tick
    36. Select Case Jump
    37. Case eJumpStates.Up
    38. If Hero.Top > (DefaultHeight - JumpHeight) Then
    39. Hero.Top -= 1
    40. Else
    41. Jump = eJumpStates.Down
    42. End If
    43. Case eJumpStates.Down
    44. If Hero.Top < (DefaultHeight) Then
    45. Hero.Top += 1
    46. Else
    47. Jump = eJumpStates.None
    48. End If
    49. End Select
    50. End Sub
    51. Private Sub tmrMove_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrMove.Tick
    52. Select Case CurrentMove
    53. Case eMove.Left
    54. Hero.Left -= 1
    55. Case eMove.Right
    56. Hero.Left += 1
    57. End Select
    58. End Sub
    59. Private Sub Form1_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
    60. Select Case e.KeyCode
    61. Case Keys.Down
    62. Hero.Height = 22
    63. Hero.Top -= Duck
    64. DefaultHeight = 200
    65. End Select
    66. End Sub
    67. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „bsHobbit“ ()

    Kann mir mal einer diese Zeile erklären bitte :


    Visual Basic-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown



    Ab der ersten Klammer, ich kenne die meisten Befehle wie ByVal / handles etc leider noch nicht.
    Halte mal den Mauszeiger auf die Wörter im VB-Tag...
    Aber um es nochmal zur zu Erläutern: ByVal übergibt den Wert, bei ByRef wird nur ein Zeiger (Verknüpfung) übergeben. Mit Handles kannst du angeben, bei welchem Ereignis diese Funktion aufgerufen wird, wobei MyBase die aktuelle Klasse ist.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()

    Wie gesagt es handelt sich dabei um die VB .NET (von der Version Visual Basic 8 ) .

    Ich gehe davon aus das du Visual Basic 6 benutzt, du musst den Code natürlich auf dein Visual Basic version anpassen.

    Bei dir bleibt es nach wie vor:

    Visual Basic-Quellcode

    1. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)


    und bei dir heisst es auch nicht

    Visual Basic-Quellcode

    1. e.keycode


    sonder du benutzt den Paramter "KeyCode as Integer"

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „bsHobbit“ ()