Mal wieder kollision -.-
Übersicht

![]() |
NeoxitBetreff: Mal wieder kollision -.- |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe schon gesucht bevor hier irgendwelche "Warum hast du die suchfunktion nicht benutzt" antworten kommen. Habe für mich nämlich leider nichts passendes gefunden.
Die meisten dinge wurden über das beispiel "Pong" erklärt. Was mir klar ist, ausfallswinkel = ausfallswinkel. sprich den speed von x oder y ändern. Nun zu meinem Problem: ich habe 1 Bild als feld (ein kasten). Dann habe ich weitere kästen in diesem feld. Einen schläger. Und ein Bällchen ![]() da die kleineren Kästchen sowieso in einem Type und über Data (wie eine Tileengine) kreeirt werden, kann ich nicht für jeden einzelnen einen ausfall und einfallswinkel definieren. Hier mal ein bild zur veranschaulichung: Nach wie vor, ich habe nur 1 Bild als Rahmen genommen. Ich habe jeweils nur 1 Bild als "Steine" im Bild. Genau so wie nur 1 Bild als Ball und als Schläger. Woran erkennt er nun, welchen einfall / ausfallwinkel er nehmen soll, bei entsprechender aufprall seite? Kann ja nicht überall xspeed = -xspeed und yspeed = -yspeed eintragen. geht nicht weil er mir sonst logischerweise den gleichen weg zurück nimmt ^^ und wenn ich bei dem "hud" / "spielfeld" bspw nur die xspeed "negativiere" (xD) dann passiert logischerweise auch bei einer anderen kollisionsstelle wo die yspeed eig. verändert werden soll nix. Schwer zu erklären aber ihc hoffe ihr wisst was ich will xD Wäre sehr nett von euch zu hören =D Achja Blitz3D (BlitzBasic)! |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du Position und Breite/Höhe der Kästen kennst, kannst du doch auf die Aufprallseite Rückschließen? | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja die kenn ich und die hat der jeweilige type auch, allerdings ist für eine solche abfrage mein BB wissen wohl noch nicht ausgereift genug. Denke mal es gibt nen befehl den ich in dem sinne noch nicht kenne.
Da ich mir noch nicht ausmalen kann, wie das ganze nachher im code aussehen soll. EDIT: zu sagen ist auch, das ich mit imagescollide() arbeite ^^ |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erst stellst du fest, ob eine Kollision stattfindet z.B. ImageRectOverlap![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Asouuuuuu ![]() Glaub ich habs verstanden werde mich da mal ransetzen. d.h. dann quasi ich müsste rein scripttechnisch, das bild in 4 - 5 weitere "areas" unterteilen x_start - x_ende (genau so für die y) einmal für die linke und rechte seite einmal für oben und unten das kann ich dann logischerweise in den type schreiben da die kästchen ja zum glück gleich groß sind. hab ich das so richtig verstanden? ^^ |
||
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich habe das mal gemacht allerdings tieeeeeeeeeeerisch umständlich.
Da mit der ImageRectOverlap ja nicht überprüft wird ob er mit einem bestimmten objekt, sondern mit irgend einem objekt collided, ist das für mich irgendwie sinnlos. Ich habe nun diesen ganzen bildern RectsOverlap() zugefügt für jede seite das sieht dann im Type nachher auch so aus: Der Type: Code: [AUSKLAPPEN] For i = 1 To reihe For j = 1 To blocks Read block If block <> 0 Then s.stein = New stein s\x = block_aktual_x s\y = block_aktual_y s\x1 = s\x s\y1 = s\y s\x1end = (s\x+71) s\y1end = (s\y+2) s\x2 = s\x s\y2 = s\y s\x2end = (s\x+2) s\y2end = (s\y+31) s\x3 = s\x s\y3 = (s\y+29) s\x3end = (s\x+71) s\y3end = (s\y+2) s\x4 = (s\x+69) s\y4 = s\y s\x4end = (s\x+71) s\y4end = (s\y+31) ;Blockindex mit Steinstärke und Imagedatei If block = 1 Then s\live = 1 : s\img = block_01 If block = 2 Then s\live = 2 : s\img = block_02 If block = 3 Then s\live = 3 : s\img = block_03 s\dead = 0 EndIf block_aktual_x = block_aktual_x + block_lenght Next block_aktual_y = block_aktual_y + block_height block_aktual_x = block_start_x Next Und in der Abfrage selber dann: Code: [AUSKLAPPEN] ;Das Level Zeichnen For s.stein = Each stein DrawImage s\img,s\x,s\y ;Oben und Unten If RectsOverlap(s\x1,s\y1,s\x1end,s\y1end,ball_x#,ball_y#,22,24) Or RectsOverlap(s\x3,s\y3,s\x3end,s\y3end,ball_x#,ball_y#,22,24) ball_speed_y# = -ball_speed_y# Delete s EndIf ;Rechts und Links If RectsOverlap(s\x2,s\y2,s\x2end,s\y2end,ball_x#,ball_y#,22,24) Or RectsOverlap(s\x4,s\y4,s\x4end,s\y4end,ball_x#,ball_y#,22,24) ball_speed_x# = -ball_speed_x# Delete s EndIf Next So ich nehme nun mal an, das das eine tierisch SCHWACHSINNIGE lösung ist, und zu dem noch bestimmt tierisch langsam. Zu dem kommt noch, dass wenn der ball sich einem block nährt, eine MAV erscheint. (Obwohl der noch ca. 30 pixel entfernt liegt) ich bin hier am verzweifeln, hat denn niemand eine relativ gescheite lösung für mich =& Danke im vorraus |
||
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du brauchst die Blöcke nicht in Teile unterteilen, und wenn bräuchstest du sie nicht zu speichern da du sie ja jederzeit ausrechnen kannst. Wie Xeres schon gesagt hat, prüfe ersteinmal ob Ball und Block kollidieren. Dann vergleichst du die Koordinaten so miteinander, dass du herausfindest an welcher der 4 seiten der Ball den Klotz berührt hat und invertierst demenstrechent entweder x oder y speed. Versuch das ersmal selber hinzukriegen, am besten du machst dir ein paar skizzen, so hab ich das damals auch hingekriegt als ich Anfänger war und das selbe programmieren wollte wie du gerade. | ||
1 ist ungefähr 3 |
![]() |
Neoxit |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke dir =D Hast es denn hinbekommen? ![]() Also ich muss quasi über ImageCollide erstmal überprüfen, OB er mit dem entsprechenden block kollidiert und danach per if/then eine berechnung machen, an welcher seite des blockes er kollidiert. Und wenn das dann positiv ist, den speed der entsprechenden seite invertieren? Wenn das so ist, habe ich es denke ich mal richtig verstanden. Achja und blatt papier und stift sind meiner meinung sowieso unabdingbar für viele "projekte" ^^ |
||
![]() |
das wurgel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau. Nur würde ich kein ImagesCollide nehmen, sondern RectsOverlap oder ImageRectsOverlap. ImagCollide ist 1. langsam und 2. solls angeblich verbuggt sein. Bei dem Ball würde ich intern erstmal so tun als ob es ein Klotz wäre, weil du sonst auchnoch diverse Winkelberechnungen durchführen müsstest, wenn der Ball mit einer Ecke des Blocks kollidiert, was auch ein weiterer Grund ist, auf ImagesCollide zu verzichten. Falls dus nicht hinkriegst schreibe ich dir auch gern nen Beispielcode, aber wenn du es selber hingkriegst lernst du 1. mehr und 2. ist dein Erfolgsgefühl höher. | ||
1 ist ungefähr 3 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group