2009-05-14 7 views
0

Je suis nouveau à C++ et je pratique la collision dans un petit programme de jeu qui ne fait rien et je ne peux pas obtenir la collision droiteméthodes détection de collision en C++

J'utiliser des images chargées dans des variables

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); 

Bien qu'il existe des variables stockées comme

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;  
} 

Alors, quand je presse un bouton

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; 
} 
} 

je pensais à des choses comme

sprite->y = bushheight - 24; 

mais cela ne fonctionne pas

Toutes les suggestions?

+0

Ce qui, exactement, ne fonctionne pas? Aussi, vouliez-vous mélanger x et y dans l'expression sprite-> y = busy-> x-3? – Naaff

Répondre

1

Je pense que vous avez l'idée de base. Vérifie juste ton travail. Voici une version simple qui compile:

#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

Je suggère de faire une fonction uniquement dans le but de la détection de colision de boîte de délimitation. Il pourrait ressembler à

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

dans lequel vous effectuez la vérification s'il y a une collision entre l'image et de l'image 1 2. En ce qui concerne l'algorithme que vous essayez d'utiliser vérifier cette wikipedia par exemple AABB bounding box

Surtout cette partie:

dans le cas d'un AABB, cela permet de tester devient un simple ensemble de tests de chevauchement en fonction des axes unitaires. Pour un AABB défini par M, N contre un défini par O, P ils ne se croisent pas si (Mx> Px) ou (Ox> Nx) ou (My> Py) ou (Oy> Ny) ou (Mz > Pz) ou (Oz> Nz).

-1

Tout d'abord je suppose que vous voulez dire

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

seconde, je ne sais pas ce que vous utilisez la plate-forme, mais souvent les coordonnées y-sont inversées. c'est-à-dire que y = 0 correspond au haut de l'écran. Dans ce cas, vos comparaisons pourraient ne pas fonctionner.

La troisième vérification de collision peut rapidement devenir compliquée lorsque vous ajoutez des objets de rotation et non rectangulaires. Vous devriez envisager d'utiliser CGAL ou d'autres bibliothèques d'algorithmes de géométrie computationnelle, qui peuvent gérer l'intersection de polygones.

Questions connexes