Position am Start ca. 4000 auf der X-Achse...

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Position am Start ca. 4000 auf der X-Achse...

    Hallo liebes Forum,
    mein Problem ist im Moment, dass wenn ich dem Stack ein Rectangle zufügen, oder schon bevor ich dieses tue,
    die Position des Ellipses ca. 4000 auf der X-Achse liegt.

    Diesen Code verwende ich,

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Ellipse(300) As Rectangle
    3. Dim PosX(300) As Double
    4. Dim PosY(300) As Double
    5. Dim Loop_ As Boolean = True
    6. Dim Collision1 As Boolean
    7. Dim Collision2 As Boolean
    8. Dim Collision3 As Boolean
    9. Dim Collision4 As Boolean
    10. '---Multi_Pi's---
    11. Dim Stack_Ellipse As New Stack(Of Rectangle)
    12. Dim Arr As Integer = -1
    13. Private Sub Loop_Sub()
    14. Do While Loop_ = True
    15. Application.DoEvents()
    16. Collision()
    17. Loop
    18. End Sub
    19. Private Sub Collision()
    20. For i = 0 To 300
    21. If PosX(i) > 411 Then
    22. Collision1 = True
    23. ElseIf PosY(i) < 0 Then
    24. Collision1 = False
    25. Collision2 = True
    26. ElseIf PosX(i) < 0 Then
    27. Collision1 = False
    28. Collision2 = False
    29. Collision3 = True
    30. ElseIf PosY(i) > 240 Then
    31. Collision1 = False
    32. Collision2 = False
    33. Collision3 = False
    34. Collision4 = True
    35. End If
    36. If Collision1 = True Then
    37. PosX(i) -= 0.25
    38. PosY(i) -= 0.25
    39. ElseIf Collision2 = True Then
    40. PosX(i) -= 0.25
    41. PosY(i) += 0.25
    42. ElseIf Collision3 = True Then
    43. PosX(i) += 0.25
    44. PosY(i) += 0.25
    45. ElseIf Collision4 = True Then
    46. PosX(i) += 0.25
    47. PosY(i) -= 0.25
    48. Else
    49. PosX(i) += 0.25
    50. PosY(i) = 200
    51. End If
    52. Next
    53. Me.Invalidate()
    54. End Sub
    55. Private Sub Form1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    56. If Arr = 300 Then
    57. Else
    58. Arr += 1
    59. Stack_Ellipse.Push(Ellipse(Arr))
    60. End If
    61. End Sub
    62. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    63. DoubleBuffered = True
    64. For Each Rec As Rectangle In Stack_Ellipse
    65. Rec = New Rectangle(CInt(PosX(Arr)), CInt(PosY(Arr)), 30, 30)
    66. e.Graphics.FillEllipse(Brushes.Green, Rec)
    67. Next
    68. End Sub
    69. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    70. Me.Focus()
    71. Me.Show()
    72. Loop_Sub()
    73. End Sub
    74. End Class


    Mit einem Rectangle funktioniert es.
    Nur will ich 301-Rectangles gleichzeitig animieren.



    EDIT:
    Nun funktioniert es, nur mit einem.
    Ich hab die Doublewerte als Array definiert.
    Und jeden Click +1 Array.
    Nur animiert er trotzdem nur Einen .- ...

    Hoffe auf Antworten.


    Mfg.eniking1998

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

    Dann setze einen Haltepunkt rein und verfolge die Properties der Ellipse von ihrer "Geburt" an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du hast beliebig viele Bälle, aber sie sind alle identisch.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jop, habs grad entdecken können.
    Wie kann ich diese unterschiedlich, spricht zur unterschiedlichen Zeit, animieren?


    Die Rectangles werden zur selben Position animiert.
    Ist es möglich dieses asynchron oder ebend, voneinander getrennt auszuführen?

    Mfg,eniking1998

    enIking1998 schrieb:

    animieren?
    Mach Dir mal ein kleines Testprojekt mit genau 2 Bällen und probier, die gegeneinander laufen zu lassen.
    Gib ihnen zunächst 2 definierte Startpositionen, z.B. die Mausposition.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,
    hier:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Ellipse(1) As Rectangle
    3. Dim PosX1 As Double
    4. Dim PosY1 As Double
    5. Dim PosX2 As Double
    6. Dim PosY2 As Double
    7. Dim Loop_ As Boolean
    8. '---Collison---
    9. Dim Hit_1_Pi1 As Boolean
    10. Dim Hit_2_Pi2 As Boolean = True
    11. Dim Geschwindigkeit As Double
    12. Private Sub Animate()
    13. If PosY1 > 258 Then
    14. Hit_1_Pi1 = True
    15. ElseIf PosY1 < 0 Then
    16. Hit_1_Pi1 = False
    17. End If
    18. If Hit_1_Pi1 = True Then
    19. PosY1 -= 0.2
    20. Else
    21. PosY1 += 0.2
    22. End If
    23. If PosY2 > 258 Then
    24. Hit_2_Pi2 = True
    25. ElseIf PosY2 < 0 Then
    26. Hit_2_Pi2 = False
    27. End If
    28. If Hit_2_Pi2 = True Then
    29. PosY2 -= 0.2
    30. Else
    31. PosY2 += Geschwindigkeit
    32. End If
    33. Me.Invalidate()
    34. End Sub
    35. Private Sub Loop_Sub()
    36. Do While Loop_ = True
    37. Application.DoEvents()
    38. Animate()
    39. Loop
    40. End Sub
    41. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    42. Me.Show()
    43. Loop_ = True
    44. Loop_Sub()
    45. End Sub
    46. Private Sub Form1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    47. PosX1 = e.X
    48. PosX2 = e.X
    49. Geschwindigkeit = 0.2
    50. Me.Invalidate()
    51. End Sub
    52. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    53. DoubleBuffered = True
    54. Ellipse(0) = New Rectangle(CInt(PosX1), CInt(PosY1), 30, 30)
    55. Ellipse(1) = New Rectangle(CInt(PosX2), CInt(PosY2), 30, 30)
    56. e.Graphics.FillEllipse(Brushes.Black, Ellipse(0))
    57. e.Graphics.FillEllipse(Brushes.Green, Ellipse(1))
    58. End Sub
    59. End Class


    Problem hierbei,
    wenn ich die Angaben bezüglich der Geschwindigkeit, nahezu identisch setze,
    überdecken sich die Ellipsen .- ...

    EDIT:
    Der Trick war, den zweiten Ball etwas später zu gravieren.
    Nun, im Projekt aber, werden die Bälle sowieso unterschiedlich freigegeben.
    Trotzdem überdecken sie sich...

    Mfg.eniking1998

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

    @enIking1998:
    Häng mal an alle Double-Werte einen rund-machenden Faktor dran (5) und mach dann aus den Double-Werten Integer-Werte.
    Nicht
    Dim PosX1 As Double; Dim PosY1 As Double
    sondern
    Dim Pos1 As Point; Dim Pos2 As Point
    und
    Pos1 = e.Location
    und Dim rc = New Rectangle(PosA, new Size(30, 30))
    ---
    Probier mal, für sich bewegende Punkte eine Klasse zu erstellen
    und
    für jeden einzelnen Punkt eine Instanz davon.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja...
    Ich werd wohl eine Klasse schreiben müssen, indessen ich dann im Main,die Instanzen nacheinander aufrufe...
    Scheint mir OOP ...

    Mfg.eniking1998

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

    enIking1998 schrieb:

    Scheint mir OOP ...
    Dein Problem schreit nach OOP.
    Fangen wir es an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,
    ist es die Tatsache, unsauber zu sein, wenn ein Array von Instanzen vorliegt?
    Also,

    VB.NET-Quellcode

    1. Dim AddPI(300) As ClassName.Klasse
    ...

    Hoffe auf Antworten...

    EDIT: Ja ist es, meiner Meinung nach.
    Ich hab ein Array von Integern.
    Trotzdem selbiges Problem .- ...
    Sie überdecken sich bäh ...

    Mfg.eniking1998

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

    Warum sollte das unsauber sein?
    Du kannst auch eine List(Of ...) davon anlegen, da bist Du weniger limitiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    .- ...
    Hier mein Code,
    Spoiler anzeigen
    Klasse:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Class1
    3. Public PosX As Integer
    4. Public PosY As Integer
    5. Dim Collision1 As Boolean
    6. Dim Collision2 As Boolean
    7. Dim Collision3 As Boolean
    8. Dim Collision4 As Boolean
    9. Dim Geschwindigkeit As Double = 1.0
    10. Public Sub AddPI()
    11. If PosX > 411 Then
    12. Collision1 = True
    13. ElseIf PosY < 0 Then
    14. Collision1 = False
    15. Collision2 = True
    16. ElseIf PosX < 0 Then
    17. Collision1 = False
    18. Collision2 = False
    19. Collision3 = True
    20. ElseIf PosY > 240 Then
    21. Collision1 = False
    22. Collision2 = False
    23. Collision3 = False
    24. Collision4 = True
    25. End If
    26. If Collision1 = True Then
    27. PosX -= CInt(Geschwindigkeit)
    28. PosY -= CInt(Geschwindigkeit)
    29. ElseIf Collision2 = True Then
    30. PosX -= CInt(Geschwindigkeit)
    31. PosY += CInt(Geschwindigkeit)
    32. ElseIf Collision3 = True Then
    33. PosX += CInt(Geschwindigkeit)
    34. PosY += CInt(Geschwindigkeit)
    35. ElseIf Collision4 = True Then
    36. PosX += CInt(Geschwindigkeit)
    37. PosY -= CInt(Geschwindigkeit)
    38. Else
    39. PosX += CInt(Geschwindigkeit)
    40. PosY = 200
    41. End If
    42. End Sub
    43. End Class


    Aufruf:

    VB.NET-Quellcode

    1. Imports PhysikPi
    2. Public Class Form1
    3. Dim Add As New PhysikPi.Class1
    4. Dim Rec(1) As Rectangle
    5. Dim PosX As Integer
    6. Dim PosY As Integer
    7. Dim Arr As Integer = -1
    8. Dim bool_ As Boolean
    9. Private Sub Loop_()
    10. Do While True
    11. Application.DoEvents()
    12. Add.AddPi()
    13. PosX = Add.PosX
    14. PosY = Add.PosY
    15. Me.Invalidate()
    16. Loop
    17. End Sub
    18. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    19. Me.Show()
    20. Loop_()
    21. End Sub
    22. Private Sub Form1_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    23. Arr += 1
    24. bool_ = True
    25. End Sub
    26. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    27. DoubleBuffered = True
    28. If bool_ = True Then
    29. Rec(Arr) = New Rectangle(PosX, PosY, 30, 30)
    30. e.Graphics.FillEllipse(Brushes.Black, Rec(Arr))
    31. End If
    32. End Sub
    33. End Class


    Wird nicht animiert...

    Hoffe auf Antworten...

    Mfg.eniking1998

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

    enIking1998 schrieb:

    Wird nicht animiert...
    Bei mir schon.
    Mach mal Dim Geschwindigkeit As Integer = 1
    und
    CInt(Geschwindigkeit) ==> Geschwindigkeit
    "Geschwindigkeit" ist keine Geschwindigkeit, sondern ein DeltaPosition.
    Überleg mal, Dein Delta abhängig von der Position zu machen, also mach eine Reflexion.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    In einer Endlosschleife .Invalidate aufrufen und .DoEvents verwenden ist schon dünnes Eis. Ein Timer wäre hier eher angebracht. Der Grund ist einfach, dass es hier sehr schnell zu einem Verhalten des Programms kommt, das nichtmehr vorhersehbar ist. Eine eigene Klasse zu schreiben war jedenfalls der erste Schritt in die richtige Richtung^^

    Collison1 bis 4 ist auch nicht so leicht zu handhaben, schau dir mal Enums an:

    VB.NET-Quellcode

    1. Dim trefferRichtung As eTrefferRichtung = eTrefferRichtung.Links
    2. if trefferRichtung = eTrefferRichtung.Rechts then
    3. '....
    4. end if
    5. Public Enum eTrefferRichtung
    6. Oben
    7. Unten
    8. Rechts
    9. Links
    10. End Enum

    FreakJNS schrieb:

    ist schon dünnes Eis.
    Besonders dann, wenn er rechts oben auf das Kreuz klickt. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hey Leute,
    Es will einfach nicht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports PhysikPi
    3. Public Class Form1
    4. Dim Physik_ As New PhysikPi.Class1
    5. Dim Rec(300) As Rectangle
    6. Dim Clicked As Boolean = False
    7. Dim Array_ As Integer
    8. Dim BufferX(300) As Integer
    9. Dim BufferY(300) As Integer
    10. Dim bool As Boolean = True
    11. Private Sub loop_()
    12. Do While bool = True
    13. Application.DoEvents()
    14. Physik_.AddPI()
    15. BufferX(Array_) = Physik_.PosX
    16. BufferY(Array_) = Physik_.PosY
    17. Me.Invalidate()
    18. Loop
    19. End Sub
    20. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    21. Array_ += 1
    22. End Sub
    23. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    24. Me.Show()
    25. loop_()
    26. End Sub
    27. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    28. DoubleBuffered = True
    29. Rec(Array_) = New Rectangle(BufferX(Array_), BufferY(Array_), 30, 30)
    30. e.Graphics.FillEllipse(Brushes.Red, Rec(Array_))
    31. End Sub
    32. End Class


    Das Problem scheint mir, die Instanziierung der Klasse zu sein.
    Hab's versucht einen Array an Instanzen zu Erzeugen, leider war dieses nicht möglich => Die Schleife wurde nach dem ersten Mal abgebrochen.

    Hoffe auf Antworten.

    EDIT:
    Neuer Versuch:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports PhysikPi
    3. Public Class Form1
    4. Dim x1_ As New Class1
    5. Dim x2_ As New Class1
    6. Dim Rec(300) As Rectangle
    7. Dim Clicked As Boolean = False
    8. Dim Array_ As Integer
    9. Dim BufferX1 As Integer
    10. Dim BufferY1 As Integer
    11. Dim BufferX2 As Integer
    12. Dim BufferY2 As Integer
    13. Dim bool As Boolean = True
    14. Dim Counter As Integer
    15. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    16. Clicked = True
    17. BufferX1 = 0
    18. End Sub
    19. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    20. Me.Show()
    21. End Sub
    22. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    23. DoubleBuffered = True
    24. Rec(0) = New Rectangle(BufferX1, BufferY1, 30, 30)
    25. e.Graphics.FillEllipse(Brushes.Green, Rec(0))
    26. If Clicked = True Then
    27. Rec(1) = New Rectangle(BufferX2, BufferY2, 30, 30)
    28. e.Graphics.FillEllipse(Brushes.Red, Rec(1))
    29. Else
    30. End If
    31. End Sub
    32. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    33. x1_.AddPI()
    34. x2_.AddPI()
    35. BufferX1 = x1_.PosX
    36. BufferY1 = x1_.PosY
    37. BufferX2 = x2_.PosX
    38. BufferY2 = x2_.PosY
    39. Counter += 1
    40. Me.Invalidate()
    41. End Sub
    42. End Class

    KLAPPPT NICHT...
    Die Werte werden synchronisiert.
    Obwohl ich 2 verschiedene Instanzen deklariert habe.

    Mfg.eniking1998

    Lösung:
    Die Lösung ist simpel...
    Eine If-Abfrage tat's:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports PhysikPi
    3. Public Class Form1
    4. Dim x1_ As New Class1
    5. Dim x2_ As New Class1
    6. Dim Rec(300) As Rectangle
    7. Dim Clicked As Boolean = False
    8. Dim Array_ As Integer
    9. Dim BufferX1 As Integer
    10. Dim BufferY1 As Integer
    11. Dim BufferX2 As Integer
    12. Dim BufferY2 As Integer
    13. Dim bool As Boolean = True
    14. Dim Counter As Integer
    15. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    16. Clicked = True
    17. BufferX1 = 0
    18. End Sub
    19. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    20. Me.Show()
    21. End Sub
    22. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    23. DoubleBuffered = True
    24. Rec(0) = New Rectangle(BufferX1, BufferY1, 30, 30)
    25. e.Graphics.FillEllipse(Brushes.Green, Rec(0))
    26. If Clicked = True Then
    27. Rec(1) = New Rectangle(BufferX2, BufferY2, 30, 30)
    28. e.Graphics.FillEllipse(Brushes.Red, Rec(1))
    29. Else
    30. End If
    31. End Sub
    32. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    33. x1_.AddPI()
    34. BufferX1 = x1_.PosX
    35. BufferY1 = x1_.PosY
    36. If Clicked = True Then
    37. x2_.AddPI()
    38. BufferX2 = x2_.PosX
    39. BufferY2 = x2_.PosY
    40. Else
    41. End If
    42. Me.Invalidate()
    43. End Sub
    44. End Class


    Mfg.eniking1998


    Mfg.eniking1998

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

    Ich möchte noch etwas anmerken.

    Eine Vergleich prüft immer, ob das verglichene True oder False (In C: 0 oder != 0) ist.
    Deshalb ist es nicht nötig

    VB.NET-Quellcode

    1. if Clicked = True Then

    zu schreiben

    Ein einfaches

    VB.NET-Quellcode

    1. if Clicked Then



    reicht aus.

    enIking1998 schrieb:

    Die Lösung ist simpel...
    Fein.
    Wenn Dein Problem nun gelöst ist, klick doch bitte auf den Erledigt-Button. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!