Hallo liebes Forum :),
Ich habe ein kleine PixelCollisions System gebaut womit man auch andere Tolles sachen machen kann![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
Sie liest Bilder ein und sucht nach nicht transparenten Farben diese werden dann zu Objecten und bilden eine Hülle![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
Hier ist erstmal die Grundklasse :
Spoiler anzeigen
In dieser Klasse wird die Hülle gebaut siehe hier :
![](/img-proxy-lite.php?url=http://file1.npage.de/009164/86/bilder/bild1.png)
Hier sind die verwendetet Bilder :
![](/img-proxy-lite.php?url=http://file1.npage.de/009164/86/bilder/baum6.png)
![](/img-proxy-lite.php?url=http://file1.npage.de/009164/86/bilder/baum5.png)
Und hier ist die Form![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
Spoiler anzeigen
Diese Klasse bietet Pixelgenaue Collision die wie oben im beispiel Quellcode gezeigt eignet sie sich auch für Buttons und co![:D](https://www.vb-paradise.de/wcf/images/smilies/biggrin.png)
würde mich über Kritik und co Freuen![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
PS das mit dem Getpixel tut mir echt leid aber ich habe das mit dem Lockbits nicht verstanden![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
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
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
Sie liest Bilder ein und sucht nach nicht transparenten Farben diese werden dann zu Objecten und bilden eine Hülle
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
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 :
![](/img-proxy-lite.php?url=http://file1.npage.de/009164/86/bilder/bild1.png)
Hier sind die verwendetet Bilder :
![](/img-proxy-lite.php?url=http://file1.npage.de/009164/86/bilder/baum6.png)
![](/img-proxy-lite.php?url=http://file1.npage.de/009164/86/bilder/baum5.png)
Und hier ist die Form
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
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
![:D](https://www.vb-paradise.de/wcf/images/smilies/biggrin.png)
würde mich über Kritik und co Freuen
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
PS das mit dem Getpixel tut mir echt leid aber ich habe das mit dem Lockbits nicht verstanden
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
Hier gibt es mittlerweile schon was besseres
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
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“ ()