none
Frage zu Timers in VS 2013 Community RRS feed

  • 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

    Sonntag, 26. April 2015 13:10

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 

    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

    Sonntag, 26. April 2015 13:25
  • 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??

    Sonntag, 26. April 2015 13:36
  • 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


    Sonntag, 26. April 2015 13:55
    Moderator
  • 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?

    Sonntag, 26. April 2015 14:00
  • 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

    Sonntag, 26. April 2015 14:04
  • ok hab eich anders gemacht. Was bringt denn das?

    ja ich habe dne hinweis befolg, weiß allerdings nicht wo das ausgabefenster zu sehen ist...

    Sonntag, 26. April 2015 14:07
  • 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

    Sonntag, 26. April 2015 14:15
    Moderator
  • 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

    Sonntag, 26. April 2015 16:33
  • 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


    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 

    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

    Sonntag, 26. April 2015 18:36
  • 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?

     
    Sonntag, 26. April 2015 18:41
  • 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

    Sonntag, 26. April 2015 18:47
    Moderator