Mal wieder kollision -.-

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Neoxit

Betreff: Mal wieder kollision -.-

BeitragDo, Apr 08, 2010 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

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:

user posted image


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)!

Xeres

Moderator

BeitragDo, Apr 08, 2010 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neoxit

BeitragDo, Apr 08, 2010 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ^^

Xeres

Moderator

BeitragDo, Apr 08, 2010 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst stellst du fest, ob eine Kollision stattfindet z.B. ImageRectOverlap. Dann vergleichst du die Koordinaten von Kasten und Ball und weißt von welcher Seite der Ball kommt und wie dann reagiert werden sollte.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neoxit

BeitragDo, Apr 08, 2010 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Asouuuuuu Very Happy

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

BeitragFr, Apr 09, 2010 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 09, 2010 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 09, 2010 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir =D Hast es denn hinbekommen? Smile

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

BeitragFr, Apr 09, 2010 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group