2016-05-08 5 views
-1

Ich versuche, einen Charakter so aussehen zu lassen, als würde er direkt in die Luft springen und dann wieder runterkommen und auf dasselbe Niveau zurückkehren, auf dem er begonnen hat. (y = 100) Der folgende Code scheint das Programm selbst kämpfen zu lassen und ihn gleichzeitig auf und ab zu bewegen.Visual Basic: Das Bild bewegt sich nach oben und dann nach einem Klick wieder zurück

Ich habe unzählige Methoden ausprobiert und alle von ihnen führten dazu, dass der Typ entweder nach oben ging und nicht zurückkam oder von der Seite flog.

Private Sub btnJump_Click(sender As Object, e As EventArgs) Handles btnJump.Click 
    tmrJump.Start() 
End Sub 
Private Sub tmrJump_Tick(sender As Object, e As EventArgs) Handles tmrJump.Tick 
    For intCounterUp As Integer = 100 To 15 
     picSpaceRunner.Location = New Point(intCounterX, intCounterY) 
     intCounterY = intCounterUp 
    Next intCounterUp 
    For intCounterDown As Integer = 15 To 100 
     picSpaceRunner.Location = New Point(intCounterX, intCounterY) 
     intCounterY = intCounterDown 
    Next intCounterDown 
End Sub 
End Class 
+0

Dies ist VB.NET, nicht C++ –

+0

ja, ja ist es. – yotacoman

Antwort

0

Der Code läuft ohne Verzögerung, so dass Sie der Maschine ausgeliefert sind.

Ich bin kein professioneller Spielecoder, also konnte ich die Feinheiten moderner Game Engines nicht erklären. Eine der grundlegenden Ideen, die ich vor langer Zeit gelernt habe, ist jedoch, deinen Spiel/Animations-Loop zu kontrollieren. Betrachten Sie die Bilder pro Sekunde.

In Ihrem Code könnte es so einfach sein wie das Hinzufügen einer Verzögerung innerhalb jeder Schleifeniteration. Wenn Sie möchten, dass der Charakter seinen Sprung in 2 Sekunden beendet (1 Sekunde nach oben, 1 Sekunde nach unten), dann teilen Sie 1000 (1 Sek. = 1000 ms) durch die Anzahl der Iterationen in jeder Schleife und verzögern Sie um diesen Betrag. Zum Beispiel haben Sie 85 Iterationen, so dass jede Iteration ungefähr 12 ms dauern würde.

Wenn es Ihnen nichts ausmacht, einen Thread zu blockieren, können Sie dies sehr einfach mit Threading.Thread.Sleep (12) tun. Wenn das Blockieren ein Problem darstellt, möchten Sie wahrscheinlich einen externen Timer verwenden.

Ich habe diesen Link während einer Google-Suche gefunden. Er erklärt, wie man eine gemanagte Spielschleife in VB.Net aufbaut.

http://www.vbforums.com/showthread.php?737805-Vb-Net-Managed-Game-Loop

UPDATE: Pro Kommentar des OP ...

dies mit Timer zu tun, werden Sie den Charakter Objekt direkt innerhalb der Timer-Ereignishandler (Tick) manipulieren wollen. Sie würden überhaupt keine Schleifen verwenden.

Setzen Sie das Intervall des Timers auf den zuvor besprochenen Wert - die Anzahl der ms, die der Zeit entspricht, die zum Verschieben von 1 Pixel benötigt wird. Stellen Sie dann im Tick-Handler des Timers die Position des Zeichenobjekts auf einen neuen Punkt mit dem neuen Wert ein. Überprüfen Sie auch im Tick-Handler Ihre obere Grenze (15) und kehren Sie den Prozess dann um, bis er die untere Grenze (100) erreicht.

Zum Beispiel

Private Sub tmrJump_Tick(sender As Object, e As EventArgs) Handles tmrJump.Tick 
    If (intCounterY > 15 And blnGoingUp == True) Then 
     picSpaceRunner.Location = new Point(intCounterX, intCounterY - 1); 
    End If 

    ... Remaining Code Goes Here ... 

End Sub 
+0

Ich mache das als eine Aufgabe für die Schule, ich bin gezwungen, Timer zu verwenden, um den Unterricht zu beenden, nicht Verzögerungen. Gibt es eine andere Möglichkeit, den gleichen Effekt zu erzielen? – yotacoman

+0

Da es für die Schule ist, möchte ich Ihnen nicht einfach den vollständigen Code als Antwort geben. Mein Update sollte Sie jedoch auf den richtigen Weg bringen. – WonderGrub

+0

Dadurch bewegt sich der Charakter nur um einen Pixel nach oben, und zwar sofort, anstatt in einer Sprungbewegung zu gleiten. Auch das eigentliche Problem, ihn wieder runter zu kommen, wurde in Ihrem vorgeschlagenen Code nicht behandelt. Irgendwelche anderen Ideen? – yotacoman

0

Legen Sie die Schleife nicht in der timer_tick. Erhöhen oder verringern Sie stattdessen die Höhe um das festgelegte Intervall und prüfen Sie dann, ob das Bild die maximale oder minimale Höhe erreicht hat.

Verwandte Themen