使用由多个像素宽度和高度组成的精灵检测碰撞

时间:2015-05-22 10:17:12

标签: c microprocessors teensy

背景信息:在液晶显示屏上显示的微处理器上开发小游戏。

我试图修复此碰撞检测功能,它的作用是检测墙壁精灵(1 x 25像素)和玩家精灵(3x3像素)之间的碰撞。它返回1或0,如果1,玩家精灵的dx / dy改变则停止移动。所以基本上墙壁精灵被视为真正的墙壁。

int wall_collision(Sprite *w_sprite)
{

    if (((w_sprite->x >= wall_sprite.x) && ((w_sprite->x - wall_sprite.x) < 3)) && ((w_sprite->y >= wall_sprite.y) && ((w_sprite->y - wall_sprite.y) < 3)))
        return 1;

    if (((w_sprite->x <= wall_sprite.x) && ((w_sprite->x - wall_sprite.x) > -3)) && ((w_sprite->y >= wall_sprite.y) && ((w_sprite->y - wall_sprite.y) < 3)))
        return 1;

    if (((w_sprite->x >= wall_sprite.x) && ((w_sprite->x - wall_sprite.x) < 3)) && ((w_sprite->y <= wall_sprite.y) && ((w_sprite->y - wall_sprite.y) > -3)))
        return 1;

    if (((w_sprite->x <= wall_sprite.x) && ((w_sprite->x - wall_sprite.x) > -3)) && ((w_sprite->y <= wall_sprite.y) && ((w_sprite->y - wall_sprite.y) > -3)))
        return 1;

    return 0;
}

我的主要问题是指定精灵应该等于/大于/小于的精确数字,因此您可以在示例中看到它的3或-3。当我取出数字时,它返回1并停止精灵,无论在哪里,因为精灵在技术上仍然在与墙壁相同的x或y轴上,但它不接近,接触墙壁。这个的正确尺寸参数是什么?

案例问题:我的精灵应该只在它直接接触墙壁时停止,目前它要么穿过墙壁,要么在靠近墙壁时停止。

2 个答案:

答案 0 :(得分:1)

首先,你的代码似乎有点复杂 - 下面是规范(或者我相信)检测碰撞的方法。使用此功能,我们可以检测到碰撞器AB之间的任何碰撞,而不必手动检查每次碰撞。请注意,此处使用的collider结构必须包含每个对撞机上topbottomleftright坐标的信息。然后,您可以将所有碰撞器存储在一个数组中,然后通过它们进行索引以检查碰撞。功能:

int collisionFunction(collider * A, collider * B){

    //Check to see if the colliders are "lined up" on the X-axis 
    if( (A->right > B->left ) && (B->right > A->left) ){

        //Check to see if the colliders are also "lined up" on the Y-axis
        if( (A->top < B->bottom) && (B->top < A->bottom) ){
            return 1; // COLLISION DETECTED
        }
    }

    return 0;//NO COLLISION DETECTED      
}

函数/算法的解释:首先,我们检查AB是否在x轴上“排列”。通过“排队”,我的意思是说两个碰撞器可以基于它们在X轴上的位置发生碰撞。然后,我们检查每个对撞机是否在Y轴上排列。如果两个条件都满足,那么对撞机就会发生碰撞。 一开始可能有点难以理解,所以我建议您通过在纸上绘制形状(一些碰撞,其他不是)来追踪这个,看看算法是否说它们是否发生碰撞。此算法适用于坐标系,其中原点(即(0,0))位于屏幕的左上角,这是2D图形的惯例

请记住,在使用此算法时,您的播放器会部分穿过墙壁 - 这在2D游戏中非常常见。但是,考虑到你使用的像素数量,这显然是一个问题。因此,在实施此算法时应考虑到这一点。

答案 1 :(得分:0)

这个怎么样?

int wall_collision(Sprite *w_sprite)
{
  if(w_sprite->left >= wall_sprite->right) return 0;
  if(w_sprite->right <= wall_sprite->left) return 0;
  if(w_sprite->top >= wall_sprite->bottom) return 0;
  if(w_sprite->bottom <= wall_sprite->top) return 0;
  return 1;
}

左/右/上/下可以是值或函数,或者只是用实际值替换它们。 &#34;左边&#34; &#34; top&#34;将与精灵或墙的x / y值相同。 &#34;权利&#34;和&#34;底部&#34;将是精灵或墙壁的x / y +宽度/高度(以像素为单位)。

请查看此链接,获取有关简单碰撞检测的更深入的教程:http://lazyfoo.net/SDL_tutorials/lesson17/index.php

编辑:示例代码假设一个坐标系,其中x随着你的向右增加,y随着你的下降而增加。