000
01.09.2015, 15:29 Uhr
~PadMad
Gast
|
Hey,
Ich habe auch schon in ein anderes Forum gepostet. Dort vernehme ich leider nur Grillenzirpen. Daher hier mein nächster Versuch:
Ich arbeite momentan an einer Kollisionserkennung. Ich lege für die Models Kollisionsbereiche fest. Die fixen Kollisionsbereiche liegen im Array ppCol_rect und werden zum Verändern an ppCol_rect_copy übergeben. Momentan arbeite ich nur am "nach rechts rotieren". Beim rotieren wird zwar nach rechts rotiert aber die Kollisionsbereiche werden dabei immer wieder zusammengeschrumpft.
Gut erkennbar im Video:
http://youtu.be/_acQHu9-HDE
ppCol_rect und die Kopie davon sind Zeiger auf eine eigene Rechteck Struktur. Diese Strucktur hat einfach nur 4 Vektoren a, b, c, d, die das Rechteck beschreiben. ppCopy_rect[0]->p_a ist daher zum Beispiel der Vektor "a" der Struktur.
Methoden:
set_stuetz(): setzt den Stützvektor ^^ set_direction(): setzt den Richtungsvektor get_stuetz_x(): gibt die x-Komponente zurück usw. ect.
Hier der Code:
C++: |
void CModel_2D::move_col_areas() { int mid_x = 0; int mid_y = 0; double radiant = 0; d_point punkt_a; d_point punkt_b; d_point punkt_c; d_point punkt_d; // Kollisionsbereiche einfach auf der x-y-Achse verschieben for(int i = 0 ; i < col_area_number ; i++) { // auslesen und an buffer übergeben und verändern! ppCol_rect_copy[i]->p_a->set_stuetz((ppCol_rect[i]->p_a->get_stuetz_x() + pos_x), (ppCol_rect[i]->p_a->get_stuetz_y() + pos_y)); ppCol_rect_copy[i]->p_a->set_direction(ppCol_rect[i]->p_a->get_dir_x(), ppCol_rect[i]->p_a->get_dir_y()); ppCol_rect_copy[i]->p_b->set_stuetz((ppCol_rect[i]->p_b->get_stuetz_x() + pos_x), (ppCol_rect[i]->p_b->get_stuetz_y() + pos_y)); ppCol_rect_copy[i]->p_b->set_direction(ppCol_rect[i]->p_b->get_dir_x(), ppCol_rect[i]->p_b->get_dir_y()); ppCol_rect_copy[i]->p_c->set_stuetz((ppCol_rect[i]->p_c->get_stuetz_x() + pos_x), (ppCol_rect[i]->p_c->get_stuetz_y() + pos_y)); ppCol_rect_copy[i]->p_c->set_direction(ppCol_rect[i]->p_c->get_dir_x(), ppCol_rect[i]->p_c->get_dir_y()); ppCol_rect_copy[i]->p_d->set_stuetz((ppCol_rect[i]->p_d->get_stuetz_x() + pos_x), (ppCol_rect[i]->p_d->get_stuetz_y() + pos_y)); ppCol_rect_copy[i]->p_d->set_direction(ppCol_rect[i]->p_d->get_dir_x(), ppCol_rect[i]->p_d->get_dir_y()); } if(current_angle != 0) { // Mit Rotation // aktueller Mittelpunkt des Models mid_x = (pos_x + (((double) pImage->getWidth()) / 2)); mid_y = (pos_y + (((double) pImage->getHeight()) / 2)); for(int i = 0 ; i < col_area_number ; i++) { punkt_a.x = ppCol_rect_copy[i]->p_a->get_stuetz_x(); punkt_a.y = ppCol_rect_copy[i]->p_a->get_stuetz_y(); punkt_b.x = ppCol_rect_copy[i]->p_b->get_stuetz_x(); punkt_b.y = ppCol_rect_copy[i]->p_b->get_stuetz_y(); punkt_c.x = ppCol_rect_copy[i]->p_c->get_stuetz_x(); punkt_c.y = ppCol_rect_copy[i]->p_c->get_stuetz_y(); punkt_d.x = ppCol_rect_copy[i]->p_d->get_stuetz_x(); punkt_d.y = ppCol_rect_copy[i]->p_d->get_stuetz_y(); radiant = current_angle * (PI / 180); if(rot_dir == CMODEL_2D_ROTATE_RIGHT) { punkt_a.x = mid_x + (punkt_a.x - mid_x) * cos(radiant) - (punkt_a.y - mid_y) * sin(radiant); punkt_a.y = mid_y + (punkt_a.x - mid_x) * sin(radiant) + (punkt_a.y - mid_y) * cos(radiant); punkt_b.x = mid_x + (punkt_b.x - mid_x) * cos(radiant) - (punkt_b.y - mid_y) * sin(radiant); punkt_b.y = mid_y + (punkt_b.x - mid_x) * sin(radiant) + (punkt_b.y - mid_y) * cos(radiant); punkt_c.x = mid_x + (punkt_c.x - mid_x) * cos(radiant) - (punkt_c.y - mid_y) * sin(radiant); punkt_c.y = mid_y + (punkt_c.x - mid_x) * sin(radiant) + (punkt_c.y - mid_y) * cos(radiant); punkt_d.x = mid_x + (punkt_d.x - mid_x) * cos(radiant) - (punkt_d.y - mid_y) * sin(radiant); punkt_d.y = mid_y + (punkt_d.x - mid_x) * sin(radiant) + (punkt_d.y - mid_y) * cos(radiant); } ppCol_rect_copy[i]->p_a->set_stuetz(punkt_a.x, punkt_a.y); ppCol_rect_copy[i]->p_b->set_stuetz(punkt_b.x, punkt_b.y); ppCol_rect_copy[i]->p_c->set_stuetz(punkt_c.x, punkt_c.y); ppCol_rect_copy[i]->p_d->set_stuetz(punkt_d.x, punkt_d.y); ppCol_rect_copy[i]->p_a->set_direction((punkt_b.x - punkt_a.x), (punkt_b.y - punkt_a.y)); ppCol_rect_copy[i]->p_b->set_direction((punkt_c.x - punkt_b.x), (punkt_c.y - punkt_b.y)); ppCol_rect_copy[i]->p_c->set_direction((punkt_d.x - punkt_c.x), (punkt_d.y - punkt_c.y)); ppCol_rect_copy[i]->p_d->set_direction((punkt_a.x - punkt_d.x), (punkt_a.y - punkt_d.y)); } } }
|
Momentan verstehe ich nicht, warum es nicht geht. Den selben Rotationsalgorithmus habe ich im Hauptmenü und da funktioniert er augenscheinlich.
Jede Hilfe wäre hier super.
Gruß, Patrick Dieser Post wurde am 01.09.2015 um 21:03 Uhr von FloSoft editiert. |