gpt4 book ai didi

c++ - 我将如何编写一个 for 循环来检查每个像素是否发生碰撞?

转载 作者:行者123 更新时间:2023-11-30 03:04:19 25 4
gpt4 key购买 nike

我正在尝试在我的敌人类中编写一个 for 循环来检查与玩家的碰撞......我想要具体做的是让它检查每一行中的每个像素,所以它应该检查所有内容行然后转到下一行。我无法弄清楚如何编写它,因此它会检查每一行......我该怎么做?这是我写的内容...我很确定我需要在其中有另一个 for 循环来遍历每一行,但我不确定如何实现它。

bool Enemy::checkCollision()
{
for(i = 0; i < postion.w; i++)
{
if(position.x + i == player.position.x)
{
return true;
}
else if(position.y + i == player.position.y)
{
return true;
}
else
{
return false;
}
}
}

最佳答案

太复杂了。有一个免费的功能,它接受两个位置和两个碰撞框,只使用一个简单的检查(底部的简洁版本,这个解释它是如何工作的):

// y ^
// |
// +----> x
struct SDL_Rect{
unsigned x, y;
int w, h;
};

bool collides(SDL_Rect const& o1, SDL_Rect const& o2){
/* y_max -> +------------+
* | |
* | |
* +------------+ <- x_max
* |-----^------|
* y_min, x_min
*/
unsigned o1_x_min = o1.x, o1_x_max = o1.x + o1.w;
unsigned o2_x_min = o2.x, o2_x_max = o2.x + o2.w;

/* Collision on X axis: o1_x_max > o2_x_min && o1_x_min < o2_x_max
* o1_x_min -> +-----------+ <- o1_x_max
* o2_x_min -> +-------------+ <- o2_x_max
*
* No collision 1: o1_x_max < o2_x_min
* o1_x_min -> +-----------+ <- o1_x_max
* o2_x_min -> +-------------+ <- o2_x_max
*
* No collision 2: o1_x_min > o2_x_max
* o1_x_min -> +-------------+ <- o1_x_max
* o2_x_min -> +-----------+ <- o2_x_max
*/
if(o1_x_max >= o2_x_min && o1_x_min <= o2_x_max)
{ // collision on X, check Y
/* Collision on Y axis: o1_y_max > o2_y_min && o1_y_min < o2_y_max
* o1_y_max -> +
* | + <- o2_y_max
* | |
* o1_y_min -> + |
* + <- o2_y_min
* No collision: o1_y_min > o2_y_max
* o1_y_max -> +
* |
* |
* o1_y_min -> +
* + <- o2_y_max
* |
* |
* + <- o2_y_min
*/
unsigned o1_y_min = o1.y, o1_y_max = o1.y + o1.h;
unsigned o2_y_min = o2.y, o2_y_max = o2.y + o2.h;
return o1_y_max >= o2_y_min && o1_y_min <= o2_y_max;
}
return false;
}

碰撞的简明版本:

bool collides(SDL_Rect const& o1, SDL_Rect const& o2){
unsigned o1_x_min = o1.x, o1_x_max = o1.x + o1.w;
unsigned o2_x_min = o2.x, o2_x_max = o2.x + o2.w;

if(o1_x_max >= o2_x_min && o1_x_min <= o2_x_max)
{ // collision on X, check Y
unsigned o1_y_min = o1.y, o1_y_max = o1.y + o1.h;
unsigned o2_y_min = o2.y, o2_y_max = o2.y + o2.h;
return o1_y_max >= o2_y_min && o1_y_min <= o2_y_max;
}
return false;
}

关于c++ - 我将如何编写一个 for 循环来检查每个像素是否发生碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8710021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com