1

背景:在 LCD 屏幕上显示的微处理器上开发小型游戏。

我正在尝试修复此碰撞检测功能,它的作用是检测墙壁精灵(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 轴上,但它不是接近明智的,接触墙壁。什么是正确的尺寸参数?

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

4

2 回答 2

1

首先,您的代码似乎有点复杂 - 下面是检测碰撞的规范(或者我相信)方法。使用此功能,我们无需手动检查每个碰撞,而是可以检测碰撞器AB. 请记住,这里collider使用的结构必须包含有关每个对撞机上的topbottom和坐标的信息leftright然后,您可以将所有碰撞器存储在一个数组中,然后通过它们进行索引以检查碰撞。功能:

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      
}

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

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

于 2015-05-22T11:04:25.120 回答
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;
}

Left/Right/Top/Bottom 可以是值或函数,或者只是将它们替换为实际值。“left”和“top”将与精灵或墙的 x/y 值相同。“右”和“下”分别是精灵或墙的 x/y + 宽度/高度(以像素为单位)。

看看这个链接以获得更深入的简单碰撞检测教程:http: //lazyfoo.net/SDL_tutorials/lesson17/index.php

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

于 2015-05-22T10:37:52.233 回答