Spiel grenze/Mauer Programmierung

01/05/2018 17:59 ProDielerNR(1)#1
schönen guten tag :)
Ich möchte anhand eines Tracking codes den ich Programmiert habe
der reagiert auf zusammen Stöße (wen eine picbox auf eine andere trift das etwas passiert)
ein zusätzlichen code hinzufügen der lauten soll;
das Die Picbox Location abgefragt wird und dann im gleichen Moment
auch als Position dieser Picbox bestimmt werden soll
Ich habe mir das so vorgestellt das
wen sie zusammen stoßen diese beiden Picboxen
das der eine davon quasi vor der anderen Picbox stehen bleibt
eine art "Mauer" das es eben hier nicht weiter geht.
(vorzustellen ist dies mit einem Computer rpg spiel das wen man nicht weiter gehen kann/soll wegen einer mauer)
wäre schön wen ihr mir da helfen könnt anhand eines Beispiels + Erklärung dazu bitte ich möchte daraus lernen und später es selbst Programmieren können :)

Vielen dank in voraus ! :3

Ahja bevor ich es vergesse ich mache das in VB.net (Visualbasic Comunity version)
01/05/2018 22:56 florian0#2
Ne Kollisionserkennung mit 4-Ecken ist kein Hexenwerk.

Das Youtube Video hier illustrierts ganz gut.

Damit hast du den Code, der sagt obs kollidiert oder nicht.
Nun hast du aber eine Bewegung. d.H. du willst überprüfen ob es kollidiert, musst aber aufgrund der Bewegung auch wissen in welcher Richtung du kollidiert bist. Auch dafür lassen sich Bedingungen aufstellen.

Am einfachsten ist es, das in deinen Code einzubauen, der die Box bewegt. Dort kannst du überprüfen ob sich "durch die bewegung in die geforderte Richtung" eine Kollision ergibt und dementsprechend diese Richtung sperren aka. nicht in die Richtung bewegen.
01/06/2018 00:10 ProDielerNR(1)#3
Okay ich verstehe was du meinst :?
Ich habe mal einer der codes nach gebildet nur erkennt er die seiten XY nicht :?
Ich schätze die muss ich Deklarieren als seiten Verhältnis der form ?
oder der Seiten Verhältnis der Picbox ?
Laut video die form :?
Tut mir wirklich leid aber ich kann nicht so gut english und hab daher versucht
an Hand seiner Zeichnungen schlau zu werden ^^"
Ich schaue mir dacher auch meistens deutsche Tutorials an
aber davon gibt es nun mal nicht so viele wie im englishen D:
ab und zu wen ich mal zeit habe versuche ich allerdings mein english zu verbessern
also ja ich lerne es bereits schon =)
01/06/2018 09:24 florian0#4
X und Y ist logischerweise die Position der Box. Bei .NET ist die nochmals in eine Struktur gekapselt. Position müsste die Eigenschaft heißen.
01/06/2018 12:04 Serraniel#5
Glaube die GUI Komponenten haben Left und Top Properties für die Position auf dem Formular (statt X und Y) sowie dann Width und Height für die Größe.

Allerdings solltest du die Datenstrukturen von der Oberfläche trennen, also Klassen schreiben für dein "Spielbrett" und deine "Objekte", die dann auch Positionen haben. Durch die Auftrennung wird dein Code sehr wahrscheinlich übersichtlicher werden. Zudem kannst du dann das Zeichnen des Spielbretts im gesamten nach einer "Runde" / einem "Tick" durchführen. So kannst du später auch das Rendering von Oberflächenkomponenten weg umstellen und direkt auf die Oberfläche zeichnen, wenn du soweit bist. Gehört aber natürlich auch ein wenig Fleißarbeit dazu.
01/06/2018 14:38 ProDielerNR(1)#6
hm :?
Ich hab das mal mit dem Left und Top Versucht
aber hier bei erziele ich das gleiche Ergebnis wie wen ich Widht und Height nehme
Durch den Reaktion code von mir Reagiert er sofort wen er die Picbox berühren tut und
dem nach auch den code durch den ich im video gesehen habe und von euch noch einmal
Erklärt bekommen habe (Ich weiß florian sagte ich solls in die Steuerung machen nachehr wen ich alle Richtungen abgleichen möchte) Aber ich wollte es erstmal mit nur einer Richtung aus Probieren was leider nicht wirklich geklappt hat.
Der reaktions code Springt an + mit der Programmierung aus dem Video
Nur Springt er in jeglicher hinsiecht auf jede Seite an was ja eigentlich nicht sein sollte
eine der seiten sollte ja eigentlich nicht durch querbar sein bzw sollte den Code aus dem Video nicht mehr reagieren da es ja nicht mehr um die Seite gilt die wir ansprechen wollen :?

Code:
'Versuch 1
 If ((picbox1.Width + picbox1.Height)) >= (picbox2.Width) Then


End If
'Versuch 2

If ((picbox1.Left + picbox1.Top)) >= (picbox2.Left) Then


End If
Ich hab auch versucht mit

If ((picbox1.Left+ picbox1.height)) >= (picbox2.Left) Then


End If

oder anderes herum was auch nicht funktioniert hatte :)

Code:
Dim Mindex As Integer
Dim pbxmyEnemies(9) As PictureBox
Public WithEvents Mauer As New Timer
Public WithEvents Picbox1 As New PictureBox
Public WithEvents Picbox2 As New PictureBox

Private Sub Mauer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Mauer.Tick

        'Mauer Abfrage
        pbxmyEnemies(0) = Me.Picbox2
     

        For Me.Mindex = 0 To 9 'Es sind mehre Abfragen die ich mache nur habe ich hier jetzt nur den einen raus gesucht der eben nun für unser code zuständig ist
            Mindex = 0
            If Me.Picbox1.Bounds.IntersectsWith(pbxmyEnemies(Mindex).Bounds) Then
                If ((Picbox1.Width + Picbox1.Height)) >= (Picbox2.Width) Then


                End If
            End If
        Next
    End Sub
Das ist Übrigens der code der eben auf Reaktion achtet wen 2 Picboxen
Kollidieren
01/06/2018 19:53 Serraniel#7
Hab mal die API durchstöbert, alles kenn ich ja auch nicht auswendig, wie wäre es hiermit?

PHP Code:
if (picture1.Bounds.IntersectsWith(picture2.Bounds) {
  
// Collision detected

[Only registered and activated users can see links. Click Here To Register...]
01/06/2018 20:09 ProDielerNR(1)#8
Code:
If (Picbox1.Bounds.IntersectsWith(Picbox2.Bounds)) Then

End If
Ich musste deinen Code etwas umschreiben damit der den Aczeptierte
Aber auch hier ist das selbe Problem
das Jede Seite reagiert :?

Die seite die du mir aber verlinkt hast sieht sehr interessant aus :)
Ich werde mich mal durch stöbern :3

Okay die seite scheint mir bei diesem Problem nicht wirklich mir weiter zu helfen aber es ist dennoch interessant zb habe ich gelesen (Falls es stimmt und ich nicht etwas falschen raus gelesen habe)
das ich mit dem unteren codes quasi auf der form selbst mahlen kann
ohne Picboxen und das alles mit dem Draw event :?
01/06/2018 20:24 Serraniel#9
Das ist korrekt. Das selbst zeichnen war das was ich in meinem ersten Beitrag auch andeuten wollte ;)

Soll die Kollision nicht von allen Seiten erkannt werden? Wenn ja dann kannst du den Collision Check ja einfach in den Szenarien skippen, wo er erlaubt sein soll.
01/06/2018 20:32 ProDielerNR(1)#10
Der Kollision check soll schon in erster linie auf alles reagieren (Jegliche Seite)
da ich den auch nutze um zb neue Lvls zu Generieren und das Alte zu Removen
aber ich dachte mir das könnte man sicher doch auch für Wände gebrauchen
und diese spalte dann neu zu Definieren in dem sinne das der Tracking code als erstes
genommen wird damit er erkennt okay ich werde angesprochen aber im nächsten Moment direct der zweite befehl ausgelöst wird wo noch mal abgefragt wird wo der Kollidiert also welche Seite genau
Sprich wenn Bild A auf Bild B Trift
soll dann der nächste code abgefragt werden dieser lauten soll
Wenn A auf bild B Rechte seite zb Trift Soll A stoppen oder zumindest sich nicht mehr bewegen können (Wie eine art mauer eben)
Hoffe man kann es soweit verstehen was ich meine :'D

In wie fern Skippen ? :?
das verstehe ich noch nicht so ganz ^^"
bin leider sehr leicht zu verwirren °^°
01/07/2018 18:21 Shadow992#11
Quote:
Originally Posted by ProDielerNR(1) View Post
Der Kollision check soll schon in erster linie auf alles reagieren (Jegliche Seite)
da ich den auch nutze um zb neue Lvls zu Generieren und das Alte zu Removen
aber ich dachte mir das könnte man sicher doch auch für Wände gebrauchen
und diese spalte dann neu zu Definieren in dem sinne das der Tracking code als erstes
genommen wird damit er erkennt okay ich werde angesprochen aber im nächsten Moment direct der zweite befehl ausgelöst wird wo noch mal abgefragt wird wo der Kollidiert also welche Seite genau
Sprich wenn Bild A auf Bild B Trift
soll dann der nächste code abgefragt werden dieser lauten soll
Wenn A auf bild B Rechte seite zb Trift Soll A stoppen oder zumindest sich nicht mehr bewegen können (Wie eine art mauer eben)
Hoffe man kann es soweit verstehen was ich meine :'D

In wie fern Skippen ? :?
das verstehe ich noch nicht so ganz ^^"
bin leider sehr leicht zu verwirren °^°
Wenn du exaktere Kolisionspunkte haben willst, solltest du es machen wie es jeder macht:

Große Objekte in kleinere Kolisionsobjekte zerlegen. Das heißt aus einem großen Rechteck werden dann halt 9 kleine Kolisionsrechtecke o.ä.

Oder wenn du es extrem genau haben willst berechnest du die überlappenden Pixel. Also wirklich pixelweise. Am besten eignen sich zwei Hashmap dafür, die dann gemerged werden bzw. verglichen. Aber das kostet wirklich enorm viel Zeit und so genau braucht man es eigentlich nur bei Simulationen.

Das heißt ein großes Objekt in kleinere Kolisionsobjekte zu zerlegen ist wohl die einfachste und gleichzeitig effizienteste Methode, die mir bekannt ist. Das ist wirklich kein Hexenwerk.

Edit:
Wenn alle deine Objekte einfache geometrische Formen haben, kannst du natürlich auch direkt den eintreffenden Winkel berechnen, ist nur bisschen Vektor und Trigonometrie-Funktionen rumschubsen. Winkel lässt sich relativ einfach berechnen, indem du die zwei Mittelpunkte der Rechtecke miteinander verbindest und dann den Winkel zwischen Ebene und dieser entstehenden Strecke berechnest.

Siehe auch hier für Details: [Only registered and activated users can see links. Click Here To Register...]
01/08/2018 04:28 ProDielerNR(1)#12
Quote:
Wenn alle deine Objekte einfache geometrische Formen haben, kannst du natürlich auch direkt den eintreffenden Winkel berechnen.

Große Objekte in kleinere Kolisionsobjekte zerlegen. Das heißt aus einem großen Rechteck werden dann halt 9 kleine Kolisionsrechtecke o.ä.
Wird Wohl darauf hinaus laufen müssen :)
01/09/2018 06:18 ProDielerNR(1)#13
Code:
If (Picbox1.Bounds.IntersectsWith(Picbox2.Bounds)) Then
Picbox1.Location = New Point(Picbox1.Location.X, 279)
End If
Nach etwas Fummel arbeit habe ich meine Lösung gefunden
und in die Steuerung selbst mit eingebaut
Funktioniert super :)

Closed Quest