Hallo liebes Forum :),
Ich habe ein kleine PixelCollisions System gebaut womit man auch andere Tolles sachen machen kann
Sie liest Bilder ein und sucht nach nicht transparenten Farben diese werden dann zu Objecten und bilden eine Hülle
Hier ist erstmal die Grundklasse :
Spoiler anzeigen
In dieser Klasse wird die Hülle gebaut siehe hier :
Hier sind die verwendetet Bilder :
Und hier ist die Form
Spoiler anzeigen
Diese Klasse bietet Pixelgenaue Collision die wie oben im beispiel Quellcode gezeigt eignet sie sich auch für Buttons und co
würde mich über Kritik und co Freuen
PS das mit dem Getpixel tut mir echt leid aber ich habe das mit dem Lockbits nicht verstanden
Hier gibt es mittlerweile schon was besseres : [C#] [SourceCode] Pixelgenaue Kollisionserkennung mit Laufzeit O(1)
Ich habe ein kleine PixelCollisions System gebaut womit man auch andere Tolles sachen machen kann
Sie liest Bilder ein und sucht nach nicht transparenten Farben diese werden dann zu Objecten und bilden eine Hülle
Hier ist erstmal die Grundklasse :
VB.NET-Quellcode
- Public Class Collision_Object
- Public tcollisionlist As New List(Of Point)
- Public bmpsize As Size
- Public Location As Point
- Public bmp As Bitmap
- Public Sub New(ByVal file As String, ByVal location As Point)
- Me.Location = location
- Dim list As New List(Of Point)
- bmp = New Bitmap(file)
- bmpsize = bmp.Size
- For y = 0 To bmp.Height - 1
- For x = 0 To bmp.Width - 1
- If bmp.GetPixel(x, y).A >= 10 Then
- list.Add(New Point(x, y)) ' Wen der Pixel einen Höheren Transparents wert hat als 10 wird er der Liste Hinzugefügt.
- End If
- Next
- Next
- For i = 0 To list.Count - 1 ' ob eine leerstelle über,unter,links,rechts von im ist (es bildet eine Hülle).
- If list.Contains(New Point(list.Item(i).X + 1, list.Item(i).Y)) = False Then
- tcollisionlist.Add(list.Item(i))
- ElseIf list.Contains(New Point(list.Item(i).X - 1, list.Item(i).Y)) = False Then
- tcollisionlist.Add(list.Item(i))
- ElseIf list.Contains(New Point(list.Item(i).X, list.Item(i).Y + 1)) = False Then
- tcollisionlist.Add(list.Item(i))
- ElseIf list.Contains(New Point(list.Item(i).X, list.Item(i).Y - 1)) = False Then
- tcollisionlist.Add(list.Item(i))
- End If
- Next
- End Sub
- Public Function Collision(ByVal obj As Point) As Boolean
- obj.X -= Location.X 'Sie da obj auf der Form ist und die Locations unterschiedlich sind muss man die Länge/Höhe minus nehmen.
- obj.Y -= Location.Y
- Return Contains(obj)
- End Function
- Function Contains(ByVal p As Point) As Boolean
- If bmpsize.Width > p.X And bmpsize.Height > p.Y Then ' ob der Pixel ins Bitmap feld reinpasst
- For i = 0 To tcollisionlist.Count - 1
- If tcollisionlist.Item(i).Y > p.Y Then Return False
- If tcollisionlist.Item(i).Y = p.Y Then ' ob einer der Punke auf y passt.
- Dim last As Boolean = False
- Dim von As Integer = tcollisionlist.Item(i).X 'der anfang der Line.x
- Dim bis As Integer = 0
- For i2 = i To tcollisionlist.Count - 1
- If Not tcollisionlist.Item(i).Y = tcollisionlist.Item(i2).Y Then
- bis = tcollisionlist.Item(i2 - 1).X ' das ende der Linie
- Exit For
- End If
- Next
- If p.X >= von And p.X <= bis Then
- Dim de As Boolean = False
- For i2 = von To bis
- If tcollisionlist.Contains(New Point(i2, p.Y)) = True Then
- If tcollisionlist.Contains(New Point(i2 + 1, p.Y)) = False Then
- If de = False Then ' leerräume beachten
- de = True
- Else
- de = False
- End If
- End If
- End If
- If p.X = i2 Then
- Return de ' wen der Punkt gefunden wurde das ereigniss liefern
- End If
- Next
- Else
- Return False
- End If
- End If
- Next
- End If
- Return False
- End Function
- End Class
In dieser Klasse wird die Hülle gebaut siehe hier :
Hier sind die verwendetet Bilder :
Und hier ist die Form
VB.NET-Quellcode
- Public Class Form1
- Dim Button666 As Collision_Object
- Dim Hover As Boolean = False
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Button666 = New Collision_Object("...Pfad zum Bild...", New Point(100, 100))
- Me.DoubleBuffered = True
- End Sub
- Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
- If Button666.Collision(e.Location) = True Then
- Hover = True
- Else
- Hover = False
- End If
- Me.Invalidate()
- End Sub
- Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
- e.Graphics.DrawImage(Button666.bmp, Button666.Location.X, Button666.Location.Y)
- If Hover = True Then
- e.Graphics.DrawRectangle(Pens.Black, New Rectangle(Button666.Location, Button666.bmpsize))
- End If
- End Sub
- End Class
Diese Klasse bietet Pixelgenaue Collision die wie oben im beispiel Quellcode gezeigt eignet sie sich auch für Buttons und co
würde mich über Kritik und co Freuen
PS das mit dem Getpixel tut mir echt leid aber ich habe das mit dem Lockbits nicht verstanden
Hier gibt es mittlerweile schon was besseres : [C#] [SourceCode] Pixelgenaue Kollisionserkennung mit Laufzeit O(1)
MFG 0x426c61636b4e6574776f726b426974
InOffical VB-Paradise IRC-Server
webchat.freenode.net/
Channel : ##vbparadise
InOffical VB-Paradise IRC-Server
webchat.freenode.net/
Channel : ##vbparadise
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BlackNetworkBit“ ()