Aktion wird zu selten erkannt!

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Aktion wird zu selten erkannt!

    hallo!
    ich mache gerade ein kleines netzwerkspiel und habe gerade ein problem, ich frage in einem timer folgendes ab:

    VB.NET-Quellcode

    1. Dim obj As Control = Me.GetChildAtPoint(Me.PointToClient(( _
    2. Control.MousePosition)))
    3. If turn = 1 Then
    4. If Not obj Is Nothing Then
    5. If obj.Name.Split(CChar("_"))(0) = "field" Or obj.Name.Split(CChar("_"))(0) = "wall" Then
    6. If MouseButtons = Windows.Forms.MouseButtons.Left Then
    7. Label1.Text = obj.Name
    8. pBtnPLAYER(fieldCl1).BackgroundImage = Nothing
    9. clsclient.SendData(obj.Name.Split(CChar("_"))(0) + "_" + CStr(fieldCl1 - CInt(obj.Name.Split(CChar("_"))(1))))
    10. fieldCl1 = CInt(obj.Name.Split(CChar("_"))(1))
    11. pBtnPLAYER(fieldCl1).BackgroundImage = btnPlayer1Background.BackgroundImage
    12. pBtnPLAYER(fieldCl1).BackgroundImageLayout = ImageLayout.Stretch
    13. lblTurn.ForeColor = Color.Red
    14. lblTurn.Location = New Point(263, 3)
    15. lblTurn.Text = "Your oppenent's turn!"
    16. turn = 2
    17. End If
    18. End If
    19. End If
    20. Else
    21. If ....

    1. muss man am zug sein,
    2. darf das objekt über welchem die maus sich gerade befindet nicht nichts sein,
    3. muss der string, welchen der client vom server bekommt field_"irgendwas" oder wall_"irgendwas" (zb field_23) enthalten,
    4. wenn jetzt noch die linke maustaste gedrückt wird soll "ist egal was, dauert zu lange um es zu erklären" an den server geschickt werden.

    Es klappt auch soweit, bis auf die tatsache dass ich meistens 10-15mal auf das Control klicken muss, bis es erkannt wird. Ich befürche es ist zu viel an anweisungen und abfragen für den kurzen augenblick eines mausklicks, aber wie kann ich das umgehen oder verschnellern? der timer in dem der code steht ist bereits auf 10 ms.
    schonmal danke für die hilfe!

    Edit: Vielleicht könnte es klappen wenn ich das Mausklicken in einem extratimer die ganze zeit nebenbei abfrage sobald turn=1 ist oder so ähnlich..mal gucken..

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

    Weiß nicht, habe heute erst rausgefunden wie man controls dynamisch erstellt, es sind 120 buttons und ich hab nach ner zeit eingesehen, dass es einfach zu lange dauert jedes einzeln umzubenennen.
    Also zb die fields erstelle ich so:

    VB.NET-Quellcode

    1. For i = 0 To pBtnPLAYER.GetUpperBound(0)
    2. t = t + 1
    3. If i Mod 5 = 0 Then
    4. k = k + 80
    5. t = 1
    6. End If
    7. pBtnPLAYER(i) = New Button
    8. pBtnPLAYER(i).Name = "field_" & i.ToString
    9. pBtnPLAYER(i).Location = New Point(t * 80 - 60, k - 40)
    10. pBtnPLAYER(i).FlatStyle = FlatStyle.Popup
    11. pBtnPLAYER(i).Width = 50
    12. pBtnPLAYER(i).Height = 50
    13. pBtnPLAYER(i).Tag = i.ToString
    14. Controls.Add(pBtnPLAYER(i))
    15. Next i

    Hab keine vorstellung wie ich dabei events hinzufügen könnte.
    Was meinst du mit falscher aufbau? dass es mist ist, ist mir klar. ist aber n projekt mit paar richtlinien wofür es natürlich noten gibt.

    VB.NET-Quellcode

    1. AddHandler Me.pBtnPLAYER(i).Click, AddressOf MultiEvent

    Was bedeutet das AdressOf? MultiEvent gibts bei mir nicht.
    Ich versteht nicht, wie du das meinst. Könntest du ein beispiel dafür machen?
    Ich hätte auch irgendwie gedacht dass buttons Click events immer haben..immerhin ist es doch das was die auszeichnet.

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

    Quellcode

    1. AddHandler Me.pBtnPLAYER(i).Click, AddressOf MultiEvent
    2. ^ ^ ^ ^
    3. | | | |
    4. | | | +-- der name deiner sub, wenn du sie nicht
    5. | | | erstellt hast existiert sie natürlcih nich =)
    6. | | |
    7. | | +-- sagt, dass als nächstes eine "sub" kommt
    8. | |
    9. | +-- welches control.event ?
    10. |
    11. +-- binde einen handler an das control event. also eine sub, die reagiert, wenn das event des controls ausgelöst wird


    VB.NET-Quellcode

    1. ...
    2. addhandler myobj1.click, addressof myhandler
    3. addhandler myobj2.click, addressof myhandler
    4. addhandler myobj3.click, addressof myhandler
    5. ...
    6. public sub myhandler(sender as object, e as system.eventargs)
    7. ...
    8. end sub

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

    Ok, dann müsste ich nurnoch wissen welchen teil von pBtnPLAYER ich als myobj bei deinem beispiel benutzen kann denn:

    VB.NET-Quellcode

    1. pBtnPLAYER(i) = New System.Windows.Forms.Button
    2. AddHandler pBtnPLAYER(i).Click, AddressOf btnClick

    klappt leider nicht.

    Agita schrieb:

    AddHandler Me.pBtnPLAYER(i).Click, AddressOf MultiEvent

    Das praktische am Visual Studio (zumindest ab VS 2010) ist, dass wenn alles an der Zeile bereits definiert ist, nur die Methode "MultiEvent" noch nicht, dann wird es blau unterschlängelt und hat einen kleinen roten Kasten am Ende dieser Schlangenlinie. Wenn man da drauf klickt, kann man sich einen Methodenstub dafür automatisch vom Visual Studio erzeugen lassen und der hat dann sogar die korrekten Funktionsparameter um als Eventhandler für Click-Events herhalten zu können :thumbup:
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Alles klar!

    Meine lösung würde so aussehen aber ich werde das gleich mit dem methodenschub versuchen!

    VB.NET-Quellcode

    1. Dim a As Integer = 0
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. For Each c As Control In Me.Controls
    4. If c.Name.Split("_")(0) = "field" Then
    5. AddHandler c.Click, AddressOf btnClick
    6. End If
    7. Next
    8. End Sub
    9. Public Sub btnClick()
    10. Me.Text = a 'wasauchimmer
    11. End Sub
    ups, lag wohl an "system.windows.forms.mouseventargs"... habs on the fly geschrieben, sorry

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Dim pBtnPLAYER(10) As Button
    3. For i As Integer = 0 To 9
    4. pBtnPLAYER(i) = New System.Windows.Forms.Button
    5. AddHandler pBtnPLAYER(i).Click, AddressOf btnClick
    6. Next
    7. End Sub
    8. Public Sub btnClick(ByVal sender As Object, ByVal e As System.EventArgs)
    9. End Sub
    Ah es lag also daran wie ich die sub erstellt hab, hatte die klammer leer sonst genau wie du :)


    DANKE LEUTE JETZT KLAPPT ALLES! ..bis auf

    was ich grundsätzlich wollte ist beim klick auf das dymanische objekt soll der name verschickt werden.

    Ich benutze in der sub folgendes um denn jetzt an den namen des objekts zu kommen aber da gibt es doch sicherlich etwas feineres oder?

    VB.NET-Quellcode

    1. Public Sub btnClick(ByVal sender As Object, ByVal e As System.EventArgs)
    2. Dim obj As Control = Me.GetChildAtPoint(Me.PointToClient(( _
    3. Control.MousePosition)))
    4. If Not obj Is Nothing Then
    5. If obj.Name.Split(CChar("_"))(0) = "field" Or obj.Name.Split(CChar("_"))(0) = "wall" Then
    6. Label2.Text = obj.Name
    7. End If
    8. End If
    9. End Sub

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