Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.01.2010, 16:37

[Allegro] [C / C++] Pixelgenaue Kollision

Guten Tag euch allen,
mein erster Beitrag im Forum und gleich eine Saftige Frage hehe :D
Ich nutze Allegro und fand in der Dokumentation via. Google einen guten Ansatz für die Pixelgenaue Kollision:
http://wiki.allegro.cc/index.php?title=P…rfect_Collision

Diese Funktioniert an sich auch ganz gut, sehr genau und schnell echt Klasse. Der Aufbau der Funktion ist wie folgt:

C-/C++-Quelltext

1
int collide_detect(int xmin1, int ymin1, BITMAP *sprite1, int xmin2, int ymin2, BITMAP *sprite2


Aus irrelevanten Gründen würde ich das ganze gerne anders lösen so das ich die x und y Koordinaten nicht angeben muss? Es geht einfach um folgendes:
Ich lade ein Bitmap und positioniere es unterschiedlich oft an unterschiedlichen Positionen rein zufällig aber immer dasselbe Bitmap, nun möchte ich das ganze gerne unabhängig von der Position prüfen nur wie? So das die Funktion so aussieht:

C-/C++-Quelltext

1
int collide_detect(BITMAP *sprite1, BITMAP *sprite2


Die Grundfunktion wie sie jetzt aussieht einmal hier:
http://pastebin.com/m42bd7e90

Hier in normaler Anwendung:
http://pastebin.com/d6581921a

Ich würde mich sehr sehr freuen wenn jemand die Funktion für mich umschreiben könnte!

Ich guter Hoffnung, viele Grüße,
crunzermicro

2

02.01.2010, 17:28

Mh ich versteh das nicht ganz. Wie willst du eine Kollission feststellen ohne die genaue Position - bestimmt durch die xmin, xmin2 usw.
Weil in den 2 Bitmaps steht ja nur die Information wie groß das Bild ist, welche Farben wo sind usw, aber nicht wie es positioniert wurde. (In deinem Fall ja zufällig)

Sorry wenn ich mich irre. Ich kenn Allgero nur vom sehen
:)

3

02.01.2010, 18:05

Mh das ist mist gut dann muss ich weiter ausholen ich bin nicht der beste Coder aber nagut ich möchte gerne ein Jump & Run machen und wie ich die Map lade habe ich mir schon ausgedacht:

C-/C++-Quelltext

1
2
    int map[]= {0,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,1,2,3,
                      0,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,1,2,3,};

usw. so das sich 25x25 Reihen ergeben.

0 = Eine Fläche Gras
1 = Eine Mauer

Nun habe ich eine Map von 400x400 und ein Bild in meinem Tileset hat eine Größe von 16x16 das bedeutet in der Wagenrechten 25 Bilder und in der Horizontalen ebenfalls 25 Bilder.

Um das ganze Anzeigen zu können gehe ich wie folgt vor:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int zaehler =0;
int x=0;
int y=0;

for(int i =0; i < 400; i++)
{


switch(map[zaehler])
{

  case 0:
  draw_sprite(buffer, gras, x, y);
  break;


  case 1:
  draw_sprite(buffer, mauer, x, y);
  break;

}

 x = x + 16;
 zaehler++;    // Für jeden Durchlauf logischerweise


 if(zaehler == 25)  //Wenn eine Reihe voll ist zur nächsten springen

 {
  zaehler = 0;
  y += 16;
 }


}


So würde ich das lösen damit die Map gezeichnet wird, ich denke das Prinzip ist klar, nun ist aber die Frage wie ich die Kollision prüfen soll? Mir fiel eben ein ich prüfe einfach ob der Spieler mit einem der beiden Bitmaps kollidiert mir das scheint ja so nicht möglich zu sein.
Seit gnädig mit mir ich glaube das Prinzip erst gestern verstanden zu haben also wenn jemand ne Lösung hat bitte nicht zu komplex was das erklären angeht hehe


:lol:

Lerikson

Alter Hase

Beiträge: 412

Wohnort: nördlich von Hamburg

Beruf: Schüler

  • Private Nachricht senden

4

02.01.2010, 18:06

also dein Vorhaben verstehe ich nun zwar nicht wirklich, aber du kannst ne Struktur für deine anlegen wo die Koordinaten + Breite, Höhe speicherst

C-/C++-Quelltext

1
2
3
4
5
6
7
struct BildStruktur
{
  int x-koordinate;
  int y-koordinate;
  int breite;
  int hoehe;
};


dann kannst deine Kollisionsfunktion mir den Beiden strukturen der Bilder beliefern und kannst dann per

C-/C++-Quelltext

1
NameDerStruktur.y;


auf die Y-Koordinate zugreifen.

War es das was du meintest?
Errare est humanum. -Windows ist menschlich ;-)

5

02.01.2010, 18:30

Könnte nochmal jemand auf meinen 2. Post eingehen? Wie würdet ihr das lösen?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

02.01.2010, 19:09

du solltest die null für nichts reservieren und einen schönen hintergrund anzeigen^^

die kollision mit tiles ist recht einfach und sehr schnell. du überprüfst die 4 tiles in den der spieler sich im nächsten frame befindet und wenn eines davon eine mauer oder der boden ist reagierst du dementsprechend.

hast du schon andere spiele wie pong, snake oder tetris geschrieben? das ist nicht ganz soo schwierig wie ein jump'n'run
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

7

02.01.2010, 19:34

@NachoMan:

Zitat

du überprüfst die 4 tiles in den der spieler sich im nächsten frame befindet und wenn eines davon eine mauer oder der boden ist reagierst du dementsprechend

Ja genau da liegt mein Problem, meine Funktion erfordert X und Y Koordinaten zur Abfrage der Kollision. Soll ich nun die X und Y Kordinate des Spielers nehmen (die ja dynamisch ist) und dann prüfen ob bei x+16 und x-16 und y+16 und y-16 sich ein Bild befindet? Dann würde ich aber nur die 4 Grafiken um ihn herum prüfen mh ich müsste das aber irgendwie mit allen 8 machen weil wenn er springt Bewegt er sich ja irgendwie nich gerade mh und außerdem wie soll ich das dann prüfen ich gehe ja nicht immer exakt ein Tile nach dem anderen ab argggh ich bin so verwirrt :(

8

02.01.2010, 19:41

Wie gesagt kenn ich mich nicht mit Allegro aus. Aber ich denke das funktioniert so ähnlich wie bei SDL oder SFML. Ich hab mir mal in der SFML eine Funktion zur Pixelgenauen Kollission geschrieben. Dabei bin ich so vorgegangen das ich die 2 Sprites einer Funktion übergeben habe. Dann hab ich Pixel für Pixel vergleichen ob eine Kolission stattfindet. Fertig.

Ich denke so hast du es ja auch schon. Ich verstehe nur nicht, warum du die Positionsvariablen x und y da rausnehmen willst.

// edit: Hab dein letzten Post erst jetzt gelesen und ich denke ich versteh dein Problem. Du willst es so hinbekommen das alle Mauerteile auf Kollsiion geprüft werden mit dem Spieler?! (ist ja ausch logisch)
Dazu schiebst du alle Kollissionstgegenstände bzw Informationen in eine Liste die du dann später einfach in einer Schleife alle nacheinander mit dem Spieler vergleichst.

9

02.01.2010, 19:46

ich verstehe garnichts mehr was die Kollision angeht :D :p :lol:

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

02.01.2010, 20:00

Zitat von »"raXor"«

Dazu schiebst du alle Kollissionstgegenstände bzw Informationen in eine Liste die du dann später einfach in einer Schleife alle nacheinander mit dem Spieler vergleichst.


das ist doch viel langsamer. er kann über die koordinaten seiner spielfigur direkt die 4 tiles ansprechen in den sie sich befindet(ich gehe davon aus dass die figur so groß ist wie eine kachel).


sagen wir deine figur ist an position(obere linke ecke) 363, 258 und die figur/kacheln sind jeweils 10pixel groß.
dann teilst du die koordinaten durch die größe der kacheln(36, 25) und kontrollierst die tiles 36, 25; 36, 26; 37, 26 und 37, 25.

edit: ich lad dir mal das stück papier hoch mit dem ichs meiner freundin erklärt hab^^
fertig:


(Link)


das spielfeld speicherst du übrigens am besten in nem 2dimensionalen array.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige