2009-05-14 8 views
0

Ich bin neu in C++ und ich habe in einem kleinen Spielprogramm zu üben Kollision, die nichts tut und ich kann einfach nicht die Kollision richtig machenKollisionsnachweismethoden in C++

So in Variablen geladen ich Bilder verwenden

background = oslLoadImageFile("background.png", OSL_IN_RAM, OSL_PF_5551); 
sprite = oslLoadImageFile("sprite.png", OSL_IN_RAM, OSL_PF_5551); 
bush = oslLoadImageFile("bush.png", OSL_IN_RAM, OSL_PF_5551); 

Zwar gibt es Variablen wie

sprite->x = 3; 

if ((sprite->x + spritewidth > bush->x) && (sprite->x < bush->x + bushwidth) && (sprite->y + spriteheight > bush->y) && (sprite->y < bush->y + bushheight)) 
{ 
     bushcol = 1;    
} 
else 
{ 
     bushcol = 0;  
} 

So gespeichert sind, wenn ich eine Taste drücken

if (osl_keys->held.down) 
{ 
if (bushcol == 1) 
{ 
sprite->y = bush->y + 38; 
} 
else 
{ 
sprite->y += 3; 
} 
} 
if (osl_keys->held.up) 
{ 
if (bushcol == 1) 
{ 
sprite->y = bush->y - 23; 
} 
else 
{ 
sprite->y -= 3; 
} 
} 
if (osl_keys->held.right) 
{ 
if (bushcol == 1) 
{ 
sprite->x = bush->x - 28; 
} 
else 
{ 
sprite->x += 3; 
} 
} 
if (osl_keys->held.left) 
{ 
if (bushcol == 1) 
{ 
sprite->x = bush->x + 28; 
} 
else 
{ 
sprite->x -= 3; 
} 
} 

Ich dachte an Dinge wie

sprite->y = bushheight - 24; 

aber es tut

Irgendwelche Vorschläge arbeiten?

+0

Was, genau, funktioniert nicht? Wollten Sie auch x und y im Ausdruck sprite-> y = busy-> x-3 mischen? – Naaff

Antwort

1

Ich denke, Sie haben die Grundidee. Überprüfe einfach deine Arbeit. Hier ist eine einfache Version, die kompiliert:

#import <stdlib.h> 

typedef struct { 
    // I'm going to say x, y, is in the center 
    int x; 
    int y; 
    int width; 
    int height; 
} Rect; 

Rect newRect(int x, int y, int w, int h) { 
    Rect r = {x, y, w, h}; 
    return r; 
} 

int rectsCollide(Rect *r1, Rect *r2) { 
    if (r1->x + r1->width/2 < r2->x - r2->width/2) return 0; 
    if (r1->x - r1->width/2 > r2->x + r2->width/2) return 0; 
    if (r1->y + r1->height/2 < r2->y - r2->height/2) return 0; 
    if (r1->y - r1->height/2 > r2->y + r2->height/2) return 0; 
    return 1; 
} 

int main() { 
    Rect r1 = newRect(100,200,40,40); 
    Rect r2 = newRect(110,210,40,40); 
    Rect r3 = newRect(150,250,40,40); 

    if (rectsCollide(&r1, &r2)) 
     printf("r1 collides with r2\n"); 
    else 
     printf("r1 doesnt collide with r2\n"); 

    if (rectsCollide(&r1, &r3)) 
     printf("r1 collides with r3\n"); 
    else 
     printf("r1 doesnt collide with r3\n"); 

} 
2

Ich würde vorschlagen, eine Funktion nur für den Zweck der Bounding Box Kolisionserkennung. Es könnte wie folgt aussehen

IsColiding(oslImage item1, oslImage item2) 
{ 
    /* Perform check */ 
} 

, in dem Sie die Prüfung durchführen, wenn es zu einer Kollision zwischen Bild 1 und Bild 2 Wie für den Algorithmus versucht man, diese wikipedia überprüfen zu verwenden, zum Beispiel AABB bounding box

Gerade dieser Teil:

im Falle einer AABB dieses Tests wird einen einfachen Satz von Überlappungstests in Bezug auf die Achsen-Einheit. Für eine AABB definiert durch M, N gegen eine durch definierte O, P schneiden sie sich nicht wenn (Mx> Px) oder (Ox> Nx) oder (My> Py) oder (Oy> Ny) oder (Mz > Pz) oder (Oz> Nz).

-1

Zunächst einmal ich nehme an, Sie bedeuten

sprite->y = bush->**y** - 3;

zweiten I weiß nicht, welche Plattform Sie verwenden, aber oft sind die y-Koordinaten werden invertiert. d.h. y = 0 entspricht dem oberen Teil des Bildschirms. In diesem Fall funktionieren Ihre Vergleiche möglicherweise nicht.

Die dritte Kollisionsprüfung kann schnell kompliziert werden, wenn Sie ihr Rotation und nicht rechteckige Objekte hinzufügen. Sie sollten die Verwendung von CGAL oder einer anderen Berechnungsalgorithmen-Bibliothek in Betracht ziehen, die Polygonschnittpunkte verarbeiten kann.