Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Thong
Anmeldungsdatum: 06.06.2005 Beiträge: 8 Wohnort: Basel
|
Verfasst am: 06.06.2005, 21:27 Titel: Zusammenprall von Objekten |
|
|
Hallo Leute ,
Ich habe ein Problem:
wie macht man,
dass wenn ein Objekt zum Beispiel auf ein Hinderniss trifft , dass es dann zum beispiel explodiert oder so. und wenn möglich sogar eine Kettenreaktion auslöst an den hintenstehenden Objekten.
(ich bin ein qbasic anfänger , wenn ihr euch fragt was dass für eine Frage sein soll)
 |
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.06.2005, 22:02 Titel: 2D-Kollisionen |
|
|
Es kommt immer darauf an, wie präzise die Kollisionsabfrage sein soll.
Die früheren Commodore-Rechner (C 64 und Amiga) hatten eine präzise Kollisionsabfrage in ihrer Video-Hardware implementiert, welche wirklich nur dann das Bit auf 1 setzte, wenn ein Pixel mit dem Hintergrund überlappte.
All dies fehlt natürlich beim PC, so dass man dies softwaremässig lösen muss. Für einfache Ansprüche genügt der Rechteckumriss-Koordinatenvergleich. Wenn es dagegen C 64-mässig ebenfalls präzise sein muss, so würde ich eine Art Kollisionsbitmap generieren: Unsichtbarer Bildbereich (z.B. nicht dargestellte Seite in SCREEN 7), wo jeder Pixel einem bestimmten relativen Abstand der beiden Sprites entspricht und entweder 0 oder 1 als Farbe besitzt => diese Bitmap als einmalige Initialisierung zu Beginn des Spiels berechnen. Tipp dazu: Sihouetten bilden, die eine Farbe 1 und die andere Farbe 2, beide jeweils mit XOR übereinanderPUTten und nach POINT(x,y)=3 im Überlappungsbereich suchen.
Im Spiel selber würde ich den Rechteckvergleich anwenden. Trifft dieser zu, so würde ich das zum relativen Abstand der beiden Sprites zugehörige Kollisionsbitmap-Pixel mit POINT() abfragen und entsprechend -1 (TRUE) oder 0 (FALSE) zurückgeben. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Distelpalme

Anmeldungsdatum: 15.10.2004 Beiträge: 34 Wohnort: Basel
|
Verfasst am: 08.06.2005, 16:05 Titel: hmm ja |
|
|
Öm...
Wenn ich jetzt aber z.B. ne Bowlingsimulation HÄTTE (!!!) und fragen will, ja, trifft denn der ball den kegel? Ich hab eine kollisionsabfrage geschrieben die abfragt ob die kreise punktgenau aufeinander treffen, also so: OO (bumm )
aber wenn die kugeln schräg aufeinander treffen klappts nicht
(ich hoffe das war verständlich formuliert... hab mit thonk über skype telefoniert
p.s. tönkis skypename: t.tran meiner: distelpalme )
Zuletzt bearbeitet von Distelpalme am 08.06.2005, 16:12, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 08.06.2005, 16:11 Titel: |
|
|
also eigentlich bei zwei runden Objekten ist der Abstand gleich der Wurzel der summe der quadrate der einzelnen Abstände, also
SQR(Dx^2 + Dy^2)
(D = groß-Delta, Differenz, Da = a2 - a1)
und wenn das was da rauskommt kleiner als radius1+radius2 ist stecken die Objekte ineinander. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Thong
Anmeldungsdatum: 06.06.2005 Beiträge: 8 Wohnort: Basel
|
Verfasst am: 08.06.2005, 16:22 Titel: BISSCHEN zu kompliziert -_-° |
|
|
Danke für die Erklährung , leider.......
ist das für einen kleinen 14 Jährigen wie mich zu kompliziert .......
und Distelpalme tscheckts auch nich
Bitte um eine Ausführung...... |
|
Nach oben |
|
 |
Distelpalme

Anmeldungsdatum: 15.10.2004 Beiträge: 34 Wohnort: Basel
|
Verfasst am: 08.06.2005, 16:25 Titel: dudidu... |
|
|
jo ich checks nich  |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 08.06.2005, 20:28 Titel: |
|
|
Vielleicht spart ihr euch mal die ganzen Smilies.
jb |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 08.06.2005, 20:30 Titel: |
|
|
ihr lol0rs xD
also, ihr habt den Kegel mit x1|y1 als Koordinaten und r1 als Radius und die Kugel mit x2|y2 als Kordinaten und r2 als Radius. dann prüfst du eine Kollision mit dem Vergleich
IF r1 + r2 <= SQR((x2 - x1) ^ 2 + (y2 - y1) ^ 2) THEN blablabla _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Distelpalme

Anmeldungsdatum: 15.10.2004 Beiträge: 34 Wohnort: Basel
|
Verfasst am: 08.06.2005, 21:34 Titel: aha |
|
|
Jo ich lass die smileys weg, wie man sieht xD
Ok, aber was ist SQR?
und öm, habs ausprobiert und da funzt was nicht. hier der code:
Code: |
cls
screen 9
x1=0
y1=0
x2=600
y2=300
r1=100
r2=200
do while r1+r2 <= SQR((x2-x1)^2+(y2-y1)^2)
'hmm... do until funzt nicht... :D
circle (x1, y1), r1
circle (x2, y2), r2
circle (x1+1, y1), r1
circle (x2-1, y2), r2
circle (x1, y1), r1, 0
circle (x2, y2), r2, 0
x1=x1+1
x2=x2-1
loop
|
und wenn die beiden bälle genau übereinander sind, sich aber NICHT berühren, springt er aus der DO-LOOP-SCHLEIFE...
Viel spaß beim erklähren wünschen euch 2 noobs
Disti & Tönk
Zuletzt bearbeitet von Distelpalme am 08.06.2005, 21:50, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Devilkevin aka Kerstin

Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
Verfasst am: 08.06.2005, 22:04 Titel: |
|
|
Sebastian hat Folgendes geschrieben: | Mit SQR ziehst du die Quadratwurzel aus einer Zahl. Bei 256 wäre das z.B. 16, oder bei 123 wäre das 11,090536506... Genaueres in der MonFAQ. |
Oder anders: Wurzeln ziehen ist die Gegenoperation zu x² (x*x also eine Zahl mal sich selbst aber was ², ³ etc. weist du bestimmt.) .
Beispiel:
2² (2*2) = 4
Die Wurzel aus 4 wäre dann 2! Also Wurzeln ziehen ist sozusagen fragen "Welche Zahl gibt mal sich selbst genommen die Zahl x ?"  _________________ www.piratenpartei.de |
|
Nach oben |
|
 |
Distelpalme

Anmeldungsdatum: 15.10.2004 Beiträge: 34 Wohnort: Basel
|
Verfasst am: 08.06.2005, 22:07 Titel: |
|
|
[quote="Devilkevin"] Sebastian hat Folgendes geschrieben: | Also Wurzeln ziehen ist sozusagen fragen "Welche Zahl gibt mal sich selbst genommen die Zahl x ?"  |
Hu, ja danke, aber was wurzeln ziehen ist weiss ich  |
|
Nach oben |
|
 |
Thong
Anmeldungsdatum: 06.06.2005 Beiträge: 8 Wohnort: Basel
|
Verfasst am: 09.06.2005, 21:51 Titel: mmmmmm..-_-° -_-° -_-° -_-° -_-° |
|
|
Danke für die Erlklärung , was Wurzel ziehen ist, aber dass weiss jeder .Warum aber der Code von Distelpalme nicht funktioniert weiss ich immer noch nicht
Weiss dass überhaupt JEMAND ?????????????  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 09.06.2005, 22:09 Titel: |
|
|
dann halt hier:
dreh mal die Bedingung in der DO WHILE um:
Code: | do while r1+r2 >= SQR((x2-x1)^2+(y2-y1)^2) |
Habs nicht getestet, aber ich denke das isses. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
Distelpalme

Anmeldungsdatum: 15.10.2004 Beiträge: 34 Wohnort: Basel
|
Verfasst am: 09.06.2005, 22:10 Titel: nochmal |
|
|
Man tönk, hör doch mal mit den smileys auf
Also, ich poste hier nochmal den "defekten" Code: | cls
screen 9
x1=0
y1=0
x2=600
y2=300
r1=100
r2=200
do while r1+r2 <= SQR((x2-x1)^2+(y2-y1)^2)
'hmm... do until funzt nicht... :D
circle (x1, y1), r1
circle (x2, y2), r2
circle (x1+1, y1), r1
circle (x2-1, y2), r2
circle (x1, y1), r1, 0
circle (x2, y2), r2, 0
x1=x1+1
x2=x2-1
loop |
Und wie gesagt, die kugeln flattern meilenweit aneinander vorbei und trotzdem meint qb, ja, das war ne kollision
Viel spaß beim beantworten  |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 09.06.2005, 22:47 Titel: |
|
|
http://phpfi.com/65272
das is die kleinere Version, da funktioniert die Kollisionsabfrage mit genau der Formel die ich euch gegeben hab..
Die Kollision an sich müsst ihr dann aber selbst machen Da bewegen die Kugeln sich nur vertikal in die entgegengesetzte richtung weiter, egal von wo sie kommen.. Oder ihr nehmt einfach dreaels programm, da is kollision auch schon drin. weiß nicht, welche ihr versteht. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Distelpalme

Anmeldungsdatum: 15.10.2004 Beiträge: 34 Wohnort: Basel
|
Verfasst am: 10.06.2005, 14:28 Titel: ... |
|
|
Hey, D
Du hast da in dem code
DIM kugel(1) AS ball
Wozu ist das "AS ball" gut? Oo  |
|
Nach oben |
|
 |
|