Picturebox auf Objekten landen...Wie?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Tsuyo.

    Picturebox auf Objekten landen...Wie?

    Hey Leute,

    Ich bin grade dabei, ein Spiel zu Programmieren.

    Ich habe eine Picturebox erstellt und chara benannt.
    wenn ich die Pfeil nach oben Taste drücke,
    springt diese auch mit Hilfe dieses codes:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Const besch As Integer = 2 ' Beschleunigung
    3. Private Const stoss As Integer = 3 ' Stossabsorption am Boden
    4. Private gesch As Integer ' aktuelle Fall/Steiggeschwindigkeit
    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 = -30
    11. End If
    12. End If
    13. End Sub
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. tm.Interval = 30
    16. tm.Enabled = False
    17. chara.Top = Me.ClientRectangle.Height - chara.Height
    18. End Sub
    19. Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
    20. Dim ziel As Integer = chara.Top
    21. gesch += besch
    22. ziel += gesch
    23. If ziel + chara.Height > Me.ClientRectangle.Height Then
    24. ziel = Me.ClientRectangle.Height - chara.Height
    25. If Math.Abs(gesch) - stoss < 0 Then
    26. tm.Enabled = False
    27. Else
    28. tm.Enabled = False
    29. End If
    30. End If
    31. chara.Top = ziel
    32. If gesch = 0 AndAlso chara.Top = (Me.ClientRectangle.Height - chara.Height) Then
    33. tm.Enabled = False
    34. Debug.Print("done")
    35. End If
    36. End Sub
    37. End Class


    Nun habe ich noch eine Picturebox, Block1, die in der Luft hängt.

    und wenn ich mit dem Chara darauf springe, möchte ich, dass die figur darauf bleibt und wenn ich diese verlasse, soll die figur wieder runter fallen...

    Aber ich habe keinen Plan, wie ich das ganze anstellen soll...

    Kann mir da vllt. jemand helfen????

    Danke im Voraus MfG gtw2o11
    Mit PictureBoxen ein Spiel zu erstellen ist generell eine schlechte Sache. Dafür ist GDI+, XNA oder DirectX bzw. OpenGL gedacht.
    Du legst einen zweidimensionalen Array von z. B. Boolean ab und prüfst, ob sich die Person in einem False-Feld ist. Ist es unterhalb frei (False), fällt die Person solange, bis unterhalb True ist.
    Naja, in meinem Spiel Neon habe ich (bzw. EiPoot, der diese Technic in seinem Spiel bringitdown! verwendet und mir geholfen hat) das so gelöst, das ich in einem Array 5 Rectangels habe. Beim Zeichnen werden dann halt mit der Methode FillRectangle (oder DrawRectangle) die Rectangles visuell dargestellt. Wie die Kollision dann funktioniert, sollte glaube ich selbterklärend sein ;)

    Eistee schrieb:

    Wobei ich denke aber nicht genau wisse, das Rectangle mit IntersectWith am besten wäre.

    Muss mich auch bald wieder mit der Kollisionserkennung beschäftigen und habe nur Koordinaten.
    Keine Controls etc. mal schauen wie ich das mache.

    Ich hab noch ne XNA Klasse die genau das macht. Mal sehn ob ich die noch finde.
    Musst du dann aber halt umschreiben, ist ausserdem C# afaik.
    Spoiler anzeigen

    Quellcode

    1. public static Boolean hit_image_alpha(System.Drawing.Rectangle rect, Texture2D tex, int x, int y)
    2. {
    3. return hit_image_alpha(0, 0, tex, tex.Width * (x - rect.X) /
    4. rect.Width, tex.Height * (y - rect.Y) / rect.Height);
    5. }
    6. public static Boolean hit_image_alpha(float tx, float ty, Texture2D tex, int x, int y)
    7. {
    8. if (hit_image(tx, ty, tex, x, y))
    9. {
    10. uint[] data = new uint[tex.Width * tex.Height];
    11. tex.GetData<uint>(data);
    12. if ((x - (int)tx) + (y - (int)ty) *
    13. tex.Width < tex.Width * tex.Height)
    14. {
    15. return ((data[
    16. (x - (int)tx) + (y - (int)ty) * tex.Width
    17. ] &
    18. 0xFF000000) >> 24) > 20;
    19. }
    20. }
    21. return false;
    22. }
    23. public static Boolean hit_image(float tx, float ty, Texture2D tex, int x, int y)
    24. {
    25. return (x >= tx &&
    26. x <= tx + tex.Width &&
    27. y >= ty &&
    28. y <= ty + tex.Height);
    29. }


    Greetings