Benutzer mit den meisten Antworten
Frage zu Timers in VS 2013 Community

Frage
-
Ich habe in meinem Programm zwei Timer. Einer der einfach nur zählt und die Zeit in ein Label schriebt und einer der bei jedem Tick 3 PictureBoxes nach oben bewegt. Außerdem habe ich noch eine Picturebox, die man mit den Pfeiltatsen bewegen kann.
Wenn ich allerdings eine der Pfeiltasten gedrückt halte (also die eine Box bewege) stoppen beide Timer...
Warum?
Quelltext:
Public Class Spiel Dim last As String = Nothing Dim lastsize As String = Nothing Dim upsize As Size = New Size(77, 77) Dim leftsize As Size = New Size(77, 77) Dim downsize As Size = New Size(77, 77) Dim rightsize As Size = New Size(77, 77) Dim zeit As Integer = 0 Private Sub Spiel_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown If e.KeyCode = Keys.Escape Then Me.WindowState = FormWindowState.Normal Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable End If If e.KeyCode = Keys.Down Then Timer1.Enabled = True If Not lastsize = "down" Then Me.PictureBox1.Size = downsize Me.PictureBox1.BackgroundImage = My.Resources.runter2 Me.PictureBox1.BackColor = Color.Transparent last = "down" lastsize = "down" End If Dim auto As Point = New Point(PictureBox1.Location.X, PictureBox1.Location.Y + 9) Me.PictureBox1.Location = auto Timer1.Enabled = True End If If e.KeyCode = Keys.Up Then If Not lastsize = "up" Then Me.PictureBox1.Size = upsize Me.PictureBox1.BackgroundImage = My.Resources.hoch2 Me.PictureBox1.BackColor = Color.Transparent last = "up" lastsize = "up" End If Dim auto As Point = New Point(PictureBox1.Location.X, PictureBox1.Location.Y - 9) Me.PictureBox1.Location = auto End If If e.KeyCode = Keys.Left Then If Not lastsize = "left" Then Me.PictureBox1.Size = leftsize Me.PictureBox1.BackgroundImage = My.Resources.links2 Me.PictureBox1.BackColor = Color.Transparent last = "left" lastsize = "left" End If Dim auto As Point = New Point(PictureBox1.Location.X - 9, PictureBox1.Location.Y) Me.PictureBox1.Location = auto End If If e.KeyCode = Keys.Right Then If Not lastsize = "right" Then Me.PictureBox1.Size = rightsize Me.PictureBox1.BackgroundImage = My.Resources.rechts2 Me.PictureBox1.BackColor = Color.Transparent last = "right" lastsize = "right" End If Dim auto As Point = New Point(PictureBox1.Location.X + 9, PictureBox1.Location.Y) Me.PictureBox1.Location = auto End If End Sub Private Sub Spiel_Load(sender As Object, e As EventArgs) Handles MyBase.Load Timer2.Start() Dim score As Integer = "0" Me.DoubleBuffered = True Timer1.Start() End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick If Not PictureBox2.Bounds.IntersectsWith(PictureBox5.Bounds) Then PictureBox2.Location = New Point(PictureBox2.Location.X, PictureBox2.Location.Y - 6) End If If Not PictureBox3.Bounds.IntersectsWith(PictureBox5.Bounds) Then PictureBox3.Location = New Point(PictureBox3.Location.X, PictureBox2.Location.Y - 6) End If If Not PictureBox4.Bounds.IntersectsWith(PictureBox5.Bounds) Then PictureBox4.Location = New Point(PictureBox4.Location.X, PictureBox2.Location.Y - 6) End If If PictureBox2.Bounds.IntersectsWith(PictureBox1.Bounds) Or PictureBox3.Bounds.IntersectsWith(PictureBox1.Bounds) Or PictureBox4.Bounds.IntersectsWith(PictureBox1.Bounds) Then Timer1.Enabled = False PictureBox1.BackgroundImage = My.Resources.nrno1 PictureBox2.BackgroundImage = My.Resources.lion PictureBox2.BackColor = Color.Transparent PictureBox3.BackgroundImage = My.Resources.lion PictureBox3.BackColor = Color.Transparent PictureBox4.BackgroundImage = My.Resources.lion PictureBox4.BackColor = Color.Transparent End If If PictureBox7.Bounds.IntersectsWith(PictureBox1.Bounds) Then won.Show() Me.Hide() Timer1.Enabled = False won.Label2.Text = "Benötigte Zeit:" & zeit & "s" End If End Sub Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick zeit = zeit + 1 label1.text = zeit End Sub End Class
- Verschoben Tom Lambert (Koopakiller)Moderator Sonntag, 26. April 2015 13:55
Antworten
-
Es war leicht....
Mein Laptop war nicht gut genug für die Bilder. Nachdem ich sie alle auf 16x16 gemacht hatte funktionierte alles..
Trotzdem Danke an alle
- Als Antwort markiert Jonas Märtens Sonntag, 26. April 2015 17:59
Alle Antworten
-
Das die Timer stoppen bezweifele ich, denn nirgedswo ruft du diese zum Stoppen auf.
Was ich nicht verstehe ist, wieso deine Software so... umständlich... arbeitet.
Du kannst doch einfach die Picturebox dann initialiseren (Bild festlegen), wenn die Spiel_Load-Funtion aufgerufen wurde.
Dann beim drücken der Pfeiltasten einfach die Position anpassen.
Beispiel:
Dim __lastPoint As Point = New Point(0, 0) ' Standartpsotion: 0|0 ' ------------------------------ ' ' Anpassen der Position des Bildes ' - Funktion (_KeyDown) ' ' Taste prüfen If .... Then 'Auf "UP"-Taste prüfen __lastPoint.Y -= 8 ' 8 Pixel nach oben End If ' Bei den anderen Tasten ähnlich: ' DOWN: .Y += 8 ' RIGHT: .X += 8 ' LEFT: .X -= 8 ' neuen Punkt festlegen / wird neugezeichnet PictureBox1.Location = __lastPoint
© 2015 Thomas Roskop
Germany // Deutschland
-
Ich weiß nicht genau was du meinst aber falls du meinst das immer beim Tastendruck ein neues Bild kommt liegt daran, dass es eine Maus ist, die wenn sie in eine andere Richtung läuft anders aussieht...
Die Timer machen aber wirklich pause. Wenn ich einen stop befehl eingebaut hätte hätte ich den entfernt...
Kann da system vlt. nicht gleichzeitig bewegen und zählen??
-
Hallo Jonas,
ich habe gerade mal deinen Code getestet und konnte keine Probleme feststellen. Auch wenn ich eine der Pfeiltastendrücke bzw. gedrückt halte laufen die Timer weiter. Es kommt allerdings zu einigen Hängern, sodass die PictureBoxen teilweise kurz stehen bleiben o.ä.
An sich kann das System mit mehreren Threads zu gleich umgehen, die müssen beim Zugriff auf die GUI nur synchronisiert werden. Das könnte hier natürlich Probleme machen. Ich kann mir nur nicht vorstellen, dass das System mit den wenigen Dingen schon so überfordert ist.
Setze daher bitte folgende Anweisung in die Timer.Tick-Eventhandler um zu gucken ob die Ticks ausgelöst werden:
Debug.WriteLine("Timer1_Tick") 'bzw.' Debug.WriteLine("Timer2_Tick")
Die Meldungen erscheinen dann im Ausgabefenster von Visual Studio.
Auf welchem Intervall stehen denn die Timer?
PS: Stelle bitte Option Strict auf On.
PPS: Das ist die selbe Frage wie diese hier, oder? Wenn ja, dann lösche ich die andere bevor jemand antwortet bzw. würde die Fragen dann zusammen führen.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Bearbeitet Tom Lambert (Koopakiller)Moderator Sonntag, 26. April 2015 13:57 PPS
-
bei mir ist es so, dass wenn ich eine pfeiltaste drücke, die zeit nicht weiterläuft. Ich habe probiert ein label ins programm zu machen welches die zeit anzeigt. das bleibt allerdings auf einer zahl wenn ich eine pfeiltaste drücke
wie stelle ich diese option strict auf on?
ja das ist die selbe frage
wo sehe ich das ausgabefenster von visual studio?
- Bearbeitet Jonas Märtens Sonntag, 26. April 2015 14:03
-
Hallo Jonas,
wenn dein Code von oben korrekt kopiert ist, steht in deinem Code folgendes:
label1.text = zeit
- Wäre nicht folgendes evtl. besser:
lable1.Text = zeit.ToString()
Hast du denn schon den Tipp von Kopakiller angenommen und Console.WriteLine eingefügt?
© 2015 Thomas Roskop
Germany // Deutschland
-
Option Strict On musst du einfach in die erste Zeile deiner Code-Datei schrieben bzw. in den Einstellungen des Projekts setzen. Siehe den oben geposteten Link.
So etwas wie
label1.text = zeit
quittiert dir der Compiler dann mit einem Fehler. Damit kannst du besser Fehler vermeiden - auch wenn es manchmal etwas mehr Aufwand bedeutet.
Das Ausgabefenster findest du im Menü Ansicht unter dem Menüpunkt Ausgabefenster. (mgl. Tastenkombination: Strg+Alt+O)
PS: Ich habe die andere Frage gelöscht.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Ich habe den Code noch einmal vereinfacht aber es funktioniert immer noch nicht. Wenn ich eine Pfeiltatse gedrückt halte bewegen sich die Katzen nicht mehr....Außer dem wird in C:\Users\Jonas\Documents\Visual Studio 2013\Projects\jajaja\jajaja\obj\x86 kein Release ordner mehr erstellt wenn ich das projekt erstelle. Es werden aber keine errors angezeigt undda steht erfolgreich erstellt....
Neuer Code:
Public Class CatRace Dim direction1 As Boolean = True Dim direction2 As Boolean = True Dim direction3 As Boolean = True Dim letztes As String = "nothing" Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick If direction1 Then PictureBox1.Top += 10 If (PictureBox1.Top > 800) Then direction1 = False End If Else PictureBox1.Top -= 10 If (PictureBox1.Top < 200) Then direction1 = True End If End If If direction2 Then PictureBox2.Top += 10 If (PictureBox2.Top > 800) Then direction2 = False End If Else PictureBox2.Top -= 10 If (PictureBox2.Top < 200) Then direction2 = True End If End If If direction3 Then PictureBox3.Top += 10 If (PictureBox3.Top > 800) Then direction3 = False End If Else PictureBox3.Top -= 10 If (PictureBox3.Top < 200) Then direction3 = True End If End If End Sub Private Sub CatRace_Load(sender As Object, e As EventArgs) Handles MyBase.Load Timer1.Start() End Sub Private Sub CatRace_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown If e.KeyCode = Keys.Escape Then Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable Me.WindowState = FormWindowState.Normal End If If e.KeyCode = Keys.Left Then PictureBox4.Location = New Point(PictureBox4.Location.X - 8, PictureBox4.Location.Y) End If If e.KeyCode = Keys.Right Then PictureBox4.Location = New Point(PictureBox4.Location.X + 8, PictureBox4.Location.Y) End If If e.KeyCode = Keys.Up Then PictureBox4.Location = New Point(PictureBox4.Location.X, PictureBox4.Location.Y - 8) End If If e.KeyCode = Keys.Down Then PictureBox4.Location = New Point(PictureBox4.Location.X, PictureBox4.Location.Y + 8) End If End Sub End Class
-
Oben in VS (unter der Titelleiste) ist irgendwo ein Drop-Down-Menu wo Debug bzw. Release stehen sollte.
Damit gibt du an, ob du die App zum Debuggen entwirft (größere Datei, aber mehr Fehlerinformationen) oder den Release-Modus verwendest.
Abhängig davon wird dann die Datei entweder im DEBUG oder RELEASE ordner erstellt.
© 2015 Thomas Roskop
Germany // Deutschland
- Bearbeitet Thomas Roskop Sonntag, 26. April 2015 17:09
-
Es war leicht....
Mein Laptop war nicht gut genug für die Bilder. Nachdem ich sie alle auf 16x16 gemacht hatte funktionierte alles..
Trotzdem Danke an alle
- Als Antwort markiert Jonas Märtens Sonntag, 26. April 2015 17:59
-
Hallo Jonas,
schön, dass dein Problem gelöst werden konnte.
Nur wundert es mich jetzt doch, wieso ein Laptop nicht stark genug sein sollte, um soetwas anzeigen zu können. Vorallem wenn sogar VS 2013 laufen kann, dann muss die Leistung des Laptops ja wohl besser sein.
Solche Problem sollten eigentlich nur bei riesigen Bildern (tausende * tausende größe) eintraten...
© 2015 Thomas Roskop
Germany // Deutschland
-
Erstens ist mein Laptop wirklich nicht besonders stark und zweitens waren die Bilder
in Formaten wie das angehängte...3200x3200....und davon 4 Stück und so weiter...
braucht man denn für VS2013 wirklich einen leistungsstärkeren PC? Sollte ich dann lieber wieder
2010 benutzen?
-
VS 2013 und VS 2010 nehmen sich da so gut wie nichts. Und die Mindestanforderungen müssen auch nicht zwingend erfüllt werden (eigene Erfahrung*) - solange alles funktioniert kannst du VS problemlos nutzen.
* 2*1,3GHz mit 4 GB RAM reichen auch problemlos aus um VS 2013 Ultimate auszuführen. Ist halt nur manchmal etwas langsamer.
Ich denke die großen Bilder könnten durchaus an den Leistungseinbußen schuld sein.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets