背景信息:在液晶显示屏上显示的微处理器上开发小游戏。
我试图修复此碰撞检测功能,它的作用是检测墙壁精灵(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轴上,但它不接近,接触墙壁。这个的正确尺寸参数是什么?
案例问题:我的精灵应该只在它直接接触墙壁时停止,目前它要么穿过墙壁,要么在靠近墙壁时停止。
答案 0 :(得分:1)
首先,你的代码似乎有点复杂 - 下面是规范(或者我相信)检测碰撞的方法。使用此功能,我们可以检测到碰撞器A
和B
之间的任何碰撞,而不必手动检查每次碰撞。请注意,此处使用的collider
结构必须包含每个对撞机上top
,bottom
,left
和right
坐标的信息。然后,您可以将所有碰撞器存储在一个数组中,然后通过它们进行索引以检查碰撞。功能:
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
}
函数/算法的解释:首先,我们检查A
和B
是否在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随着你的下降而增加。