Beweglichen Button nicht durch Picturebox lassen

  • VB.NET

Es gibt 55 Antworten in diesem Thema. Der letzte Beitrag () ist von TheoTechnic.

    Hallo Valerian Flamm,

    sowas macht man in jedem Fall ohne sich bewegende Button.

    Aber das hatte picoflop in seiner ersten Antwort schon angedeutet.

    Und im Zweifel macht man das ganze halt nicht mit CONTROLS!


    Gruss

    mikeb69
    Ja, ich mache die gegenstände selbstverständlich mit gdi+!
    äber kann man auch testen ob in dem feld, in das man kommt eine bestimmte farbe vorhanden ist?
    (wenn rect.contains(black) dann e.handled = true...)
    oder so...

    Edit: bei mir siehts im moment so aus: (C#)
    Spoiler anzeigen

    Quellcode

    1. namespace Strichn
    2. {
    3. public partial class GameForm : Form
    4. {
    5. bool left = false;
    6. bool jump = false;
    7. bool right = false;
    8. const int gexmax = 20;
    9. const int geymin = -20;
    10. int beschl = 2;
    11. int gescwx = 0;
    12. int gescwy = 0;
    13. int bremsk = 4;
    14. public GameForm()
    15. {
    16. InitializeComponent();
    17. this.KeyDown += new KeyEventHandler(GameForm_KeyDown);
    18. this.KeyUp += new KeyEventHandler(GameForm_KeyUp);
    19. this.Paint += new PaintEventHandler(GameForm_Paint);
    20. }
    21. void GameForm_Paint(object sender, PaintEventArgs e)
    22. {
    23. Graphics g = e.Graphics;
    24. g.DrawLine(new Pen(Color.Black), new Point(0, label1.Bottom), new Point(this.ClientRectangle.Width, label1.Bottom));
    25. }
    26. void GameForm_KeyUp(object sender, KeyEventArgs e)
    27. {
    28. if (e.KeyData == Keys.Left)
    29. {
    30. left = false;
    31. }
    32. else if (e.KeyData == Keys.Right)
    33. {
    34. right = false;
    35. }
    36. else if (e.KeyData == Keys.Space)
    37. {
    38. jump = false;
    39. }
    40. }
    41. void GameForm_KeyDown(object sender, KeyEventArgs e)
    42. {
    43. if (e.KeyData == Keys.Left)
    44. {
    45. left = true;
    46. }
    47. else if (e.KeyData == Keys.Right)
    48. {
    49. right = true;
    50. }
    51. else if (e.KeyData == Keys.Space)
    52. {
    53. jump = true;
    54. }
    55. }
    56. private void GameForm_Load(object sender, EventArgs e)
    57. {
    58. }
    59. private void GameTime_Tick(object sender, EventArgs e)
    60. {
    61. if (left == true && right == false)
    62. {
    63. if (gescwx >= 0)
    64. gescwx -= bremsk + beschl;
    65. else if(gescwx > geymin)
    66. gescwx -= beschl;
    67. }
    68. else if (left == false && right == true)
    69. {
    70. if (gescwx <= 0)
    71. gescwx += bremsk + beschl;
    72. else if (gescwx < gexmax)
    73. gescwx += beschl;
    74. }
    75. else if (left == false && right == false)
    76. {
    77. if (gescwx > 2)
    78. gescwx -= bremsk;
    79. else if (gescwx < -2)
    80. gescwx += bremsk;
    81. else
    82. gescwx = 0;
    83. }
    84. else
    85. {
    86. if (gescwx > 2)
    87. gescwx -= bremsk;
    88. else if (gescwx < -2)
    89. gescwx += bremsk;
    90. else
    91. gescwx = 0;
    92. }
    93. label1.Location = new Point(label1.Location.X + gescwx, label1.Location.Y + gescwy);
    94. }
    95. }
    96. }

    das zeichnen über GDI+ bringt dir vom Prinzip her rein gar nichts, wenn du für jedes objekt wiederum ein Control verwendest...

    evtl. setzt du mal Haltepunkte, um zu überprüfen ob geschwx/y überhaupt einen negativen Wert erhält...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    das zeichnen über GDI+ bringt dir vom Prinzip her rein gar nichts, wenn du für jedes objekt wiederum ein Control verwendest...

    Nein, das sollst du gerade nicht, sondern nur ein Control verwenden und zwar das Formular, auf diesem zeichnest du dann alles, ohne für jeden Gegenstand eine PictureBox oder ein Panel, oder sonst etwas zu verwenden, die Positionen speicherst du einfach nur in Variablen zwischen und zeichnest an diesen dann Bilder und sonstiges im Paint Event...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    aber was ist, wenn ich viel zu viele Gegenstände hätte?
    so z.B. 100, und die alle Variablen haben müssen... (siehe N_game!)
    wäre da nicht was anderes schlauer?
    aber danke schon mal :thumbsup:
    besser 100 Variablen, als 100 Controls, schließlich werden die Controls auch als Variablen definiert und nicht nur das...
    damit man keine 100 Variablen hat kommt jetzt ein sehr schönes Thema: OOP, also einfach einen Array, oder eine List(Of nehmen, in welcher entweder alle Objekte definiert sind, oder alle Objekte einer Art...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Irgendwie krieg ichs einfach nicht hin...
    Ich poste mal meinen code

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Const besch As Integer = 2
    3. Private Const stoss As Integer = 11
    4. Private gesch As Integer
    5. Private WithEvents tm As New Windows.Forms.Timer
    6. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    7. If e.KeyCode = Keys.Up Then
    8. If Not tm.Enabled Then
    9. tm.Enabled = True
    10. gesch = -25
    11. End If
    12. End If
    13. If e.KeyCode = Keys.Right Then
    14. Timer1.Start()
    15. End If
    16. If e.KeyCode = Keys.Left Then
    17. Timer2.Start()
    18. End If
    19. End Sub
    20. Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    21. Timer1.Stop()
    22. Timer2.Stop()
    23. End Sub
    24. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    25. tm.Interval = 30
    26. tm.Enabled = True
    27. End Sub
    28. Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
    29. Dim Ziel As Integer = Player.Top
    30. gesch += besch
    31. Ziel += gesch
    32. If Ziel + Player.Height > Panel1.ClientRectangle.Height Then
    33. Ziel = Panel1.ClientRectangle.Height - Player.Height
    34. If Math.Abs(gesch) - stoss < 0 Then
    35. gesch = 0
    36. Else : gesch = 0 - (gesch - stoss)
    37. End If
    38. End If
    39. Player.Top = Ziel
    40. If gesch = 0 AndAlso Player.Top = _
    41. (Panel1.ClientRectangle.Height - Player.Height) Then
    42. tm.Enabled = False
    43. Debug.Print("done")
    44. End If
    45. End Sub
    46. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    47. Player.Left += 2
    48. End Sub
    49. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    50. Player.Left -= 2
    51. End Sub
    52. End Class


    Ich möchte dass Player nicht durch Picturebox2 kann
    und dass er auf ihr stehen kann.
    Es funktioniert alles aber ich weiss eben nicht wie das

    mache dass



    Player nicht durch Picturebox2 kann

    und dass er auf ihr stehen kann
    Wie? Funktioniert es nun nicht oder Funktioniert es nicht, und du willst wissen, wie es Funktioniert (das fände ich einen löblichen Ansatz :thumbsup: ).
    Es funktioniert alles ,
    das einzige was nicht funktioniert ist dass

    Player nicht durch Picturebox2 kann
    und dass er auf ihr stehen kann

    das steht aber wiederum gar nicht im
    Code also funktioniert im Code alles

    Ich wüsste nun gern wie ich das am
    besten in den Code einbaue.

    Puuuh !