1

我是 C++ 的新手,我一直在一个什么都不做的小游戏程序中练习碰撞,我就是无法正确地碰撞

所以我使用加载到变量中的图像

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

虽然有变量存储,如

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

所以当我按下一个按钮

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

我在想像这样的事情

sprite->y = bushheight - 24;

但它不起作用

有什么建议么?

4

3 回答 3

4

我建议仅出于边界框碰撞检测的目的制作一个函数。它可能看起来像

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

您在其中执行检查图像 1 和图像 2 之间是否存在冲突。至于您尝试使用的算法,请查看此维基百科,例如AABB 边界框

特别是这部分:

在 AABB 的情况下,该测试就单位轴而言成为一组简单的重叠测试。对于由 M,N 定义的 AABB 与由 O,P 定义的 AABB,如果 (Mx>Px) 或 (Ox>Nx) 或 (My>Py) 或 (Oy>Ny) 或 (Mz>Pz) 或(Oz>Nz)。

于 2009-05-14T19:12:59.267 回答
3

我想你有基本的想法。只是检查你的工作。这是一个编译的简单版本:

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

}
于 2009-05-14T19:42:25.953 回答
0

首先我想你的意思是

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

其次,我不知道您使用的是什么平台,但通常 y 坐标是倒置的。即,y=0 对应于屏幕顶部。在这种情况下,您的比较可能不起作用。

当您向其中添加旋转和非矩形对象时,第三次碰撞检查会很快变得复杂。您应该考虑使用 CGAL 或其他一些可以处理多边形相交的计算几何算法库。

于 2009-05-14T19:31:43.390 回答