Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 21.11.2004, 22:56 Titel: Bitmaps Kollisionserkennung kollidieren mal und mal nicht... |
|
|
Hallo,
ich habe ein kleines Progrämmchen gebastelt in dem zwei Bitmaps kollidieren sollen. Mal kollidieren diese und mal nicht.
Die Bitmap bewegt sich, die andere nicht. Wenn die sich Bewegende z.B. von links auf die andere trifft, kollidieren sie. Kommt sie nochmal gegen dann vielleicht nicht oder vielleicht doch. Das ist jedesmal anders.
Wenn sie von rechts kommt, genauso. Mal wird kollidiert und mal nicht. So wie sie gerade lustig sind.
Woran kann soetwas liegen??
Btw. Ich habe keine Werte o.ä. mit Zufallsgeneratoren versehen.
Das ist jedenfalls ziemlich ärgerlich!!!
Gruß JkerryZ |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 21.11.2004, 22:58 Titel: |
|
|
Am besten, du zeigst uns den wichtigen Code
Sonst kann man so gut wie nix sagen. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 22.11.2004, 14:17 Titel: |
|
|
Ok:
Code: | if (Collision_BMP(&ball, &mbl)) // mbl ist der linke Balken
{
vx = 0;
vx = -8;
}
if (Collision_BMP(&ball, &mbr)) // mbr ist der rechte Balken
{
vx = 0;
vx = 8;
} |
vx ist die x-Koordinate des Balles. Der y Wert des Balles bleibt immer gleich. vx wird ganz oben im Quellcode mit 8 initialisiert.
Wenn dann der Ball gegen den Balken stößt, soll die x-Koordinate umgedreht werden.
Achso und der Ball fliegt Hauptsächlich an den unteren Enden der Balken durch. Seltener and den oberen Enden.  |
|
Nach oben |
|
 |
Beni5 Super JLI'ler
Alter: 37 Anmeldedatum: 12.11.2003 Beiträge: 310 Wohnort: Switzerland Medaillen: Keine
|
Verfasst am: 22.11.2004, 19:05 Titel: |
|
|
Beachte dass du immer gleich nach dem Verschieben die Kollision prüfst. Wenn das wirklich so immer Zufällig ist könnte da auch was mit der Framerate sein, also wenn du mal was mit der Framerate verrechnet hast.
Was übergibst du für Variablen? 2D Vektoren oder Rect Strukturen? Beachte dass die Kollision mit dem Balken von rechts mit Balken.x+BalkenBreite berrechnet werden muss. |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 22.11.2004, 19:20 Titel: |
|
|
Falls Du Ahnung von Linearen Funktionen und Parabeln hast, kannst Du eine Kreis <-> Rechteck kollision bewerkstelligen, dann kommt etwas mehr Realismus rüber. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 22.11.2004, 19:31 Titel: |
|
|
Der gepostete Code nütz irgendwie reichlich wenig. Die Collision_BMP sollte da schon aufschlussreicher aein, denn wenn der if Zweig manchmal aufgerfuen wird, ist er ja ok, aber die Funktion nicht, da sie manchmal eben nicht funktioniert.
Ich bin auch dafür, das es an der Framerate liegt, das also deine Kollisionsfunktion nicht mit allen bzw. verschiedene Frameraten zurechtkommt. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 22.11.2004, 21:27 Titel: |
|
|
Also die Funktion Collision_BMP ist eine Funktion der Grafik-Engine. Man gibt die größe der beiden Bitmaps an (das wird beim Laden der Bitmaps eingestellt) und wenn sie sich dann überschneiden, kann irgendwas durch eine if-Abfrage in Gang gesetzt werden.
Eine Überlegung, die ich angestellt habe, war dass wenn der Ball von x = 0 kommt ja -8 gerechnet werden muss. Wenn er allerdings von x = Screen-width kommt, und es -8 gerechnet wird, der Ball einfach wie bisher weiter fliegt. Aus diesem Grunde habe ich einen zweiten Balken davorgesetzt. Jedoch fliegt der Ball auch da hindurch... |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 22.11.2004, 21:53 Titel: |
|
|
Ist die bfrage Pixelgenau oder bloß auf Rechteckbasis? Evtl. könnte man nach gründlicher Recherche auch mal den Hersteller dieser Funktion befragen, da ich deinem Text irgendwie entnehmen, das du sie nicht selber gecodet hast. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 22.11.2004, 22:35 Titel: |
|
|
Nein, ich habe die Engine nicht selber programmiert. Und die Kollisionserkennung ist wohl auf Rechtecksbasis. So siehts jedenfalls aus
Ich habe einfach mal die Funktion aus der Engine rausgesucht. hier ist sie:
Code: | int Collision_BMPS(BMP_PTR bmp1, BMP_PTR bmp2)
{
// are these a valid bmps
if (!bmp1 || !bmp2)
return(0);
// get the radi of each rect
int width1 = (bmp1->width>>1) - (bmp1->width>>3);
int height1 = (bmp1->height>>1) - (bmp1->height>>3);
int width2 = (bmp2->width>>1) - (bmp2->width>>3);
int height2 = (bmp2->height>>1) - (bmp2->height>>3);
// compute center of each rect
int cx1 = bmp1->x + width1;
int cy1 = bbmp1->y + height1;
int cx2 = bmp2->x + width2;
int cy2 = bmp2->y + height2;
// compute deltas
int dx = abs(cx2 - cx1);
int dy = abs(cy2 - cy1);
// test if rects overlap
if (dx < (width1+width2) && dy < (height1+height2))
return(1);
else
// else no collision
return(0);
} // end Collision_BMPS |
Vielleicht könnt ihr mir so besser helfen
mfg JkerryZ |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.11.2004, 22:54 Titel: |
|
|
JkerryZ hat Folgendes geschrieben: | Code: | int Collision_BMPS(BMP_PTR bmp1, BMP_PTR bmp2)
{
//[...]
// get the radi of each rect
int width1 = (bmp1->width>>1) - (bmp1->width>>3);
int height1 = (bmp1->height>>1) - (bmp1->height>>3);
int width2 = (bmp2->width>>1) - (bmp2->width>>3);
int height2 = (bmp2->height>>1) - (bmp2->height>>3);
//[...]
} // end Collision_BMPS |
|
Bist du dir sicher, dass das das gewünschte Ergebnis liefert? Wenn nicht, würde ich einfach mal ein bisschen debuggen. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 23.11.2004, 14:01 Titel: |
|
|
also ansonsten hab ich mir mal ne kleine Funktion zum prüfen von Rehcteckkollisionen geschrieben. Die ist nicht perfekt, weil sie nur prüft, ob ein Eckpunkt im anderem Viereck liegt, aber meistens genau genug. Wenn du Lust hast könnt ich dir die ja mal übermitteln, du müstest ja an die Rechtecke der Bilder herankommen können. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 24.11.2004, 19:44 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | also ansonsten hab ich mir mal ne kleine Funktion zum prüfen von Rehcteckkollisionen geschrieben. Die ist nicht perfekt, weil sie nur prüft, ob ein Eckpunkt im anderem Viereck liegt, aber meistens genau genug. Wenn du Lust hast könnt ich dir die ja mal übermitteln, du müstest ja an die Rechtecke der Bilder herankommen können. |
Das wäre sehr freundlich, vielleicht helfen sie mir ja... |
|
Nach oben |
|
 |
|