golang中的矩形碰撞(像素模块)

golang中的矩形碰撞(像素模块),go,collision-detection,pixel,rectangles,Go,Collision Detection,Pixel,Rectangles,我正在努力理解在基于网格的游戏中碰撞检测代码的错误。 我试图检测“平铺”矩形和“玩家”矩形之间的碰撞(交点) 平铺矩形在和x,y坐标处绘制,但矩形的角(左下角和右上角)为(x-16,y-16)(x+48,y+48) 播放器矩形取决于播放器位置,但其角应位于(播放器_x-16,播放器_y-16)(播放器_x+16,播放器_y+16) 我曾尝试使用像素模块中的内置“(r Rect)Intersects(r Rect)”功能,但仅检测到tie矩形和当前播放器位置之间的冲突(偏移量为16像素) “til

我正在努力理解在基于网格的游戏中碰撞检测代码的错误。 我试图检测“平铺”矩形和“玩家”矩形之间的碰撞(交点)

平铺矩形在和x,y坐标处绘制,但矩形的角(左下角和右上角)为(x-16,y-16)(x+48,y+48)

播放器矩形取决于播放器位置,但其角应位于(播放器_x-16,播放器_y-16)(播放器_x+16,播放器_y+16)

我曾尝试使用像素模块中的内置“(r Rect)Intersects(r Rect)”功能,但仅检测到tie矩形和当前播放器位置之间的冲突(偏移量为16像素)

“tiles”2D数组保存了我的地图,因此我可以检查播放器所在的tile类型

我还尝试编写了自己的矩形碰撞检测“算法”,因为没有更好的词可以得到同样的结果

我的角色在每次按键后向任意方向移动4个像素,如果玩家在界外(与墙碰撞或墙内),我下棋,如果他在界外,则将角色向后移动4个像素

下面是使用内置函数的代码的相关部分(我现在有这个):

简言之:

预期行为:检测设置边界(播放器x/y-/+16和平铺矩形边界)之间的冲突

当前行为:检测播放器x/y和平铺矩形边界之间的冲突

这是它现在的样子,红色是我想要它检测碰撞的地方,绿色是它实际检测碰撞的地方:


编辑:添加了一张图片以更好地说明我的问题,并更新了我的问题

好了,希望您理解算法,如果不理解,请阅读有关空间哈希的内容

//IntersectTiles返回播放器与之相交的所有平铺,如果位置为左下角,则平铺偏移
//平铺贴图中第一个平铺的角。没有夹紧,所以你必须自己检查边界。
func IntersectTiles(player、tilesize、tileOffset pixel.Vec、playerSize float64)(coll[][2]int){
边界:=像素.R(player.X-playerSize,player.Y-playerSize,player.X+playerSize,player.Y+playerSize)
player=player.Sub(tileOffset)
//Pos根据磁贴大小查找磁贴索引
pos:=func(pos pixel.Vec)[2]int{
返回[…]int{int(pos.X/tilesize.X),int(pos.Y/tilesize.Y)}
}
min:=位置(bounds.min)
max:=位置(bounds.max)
对于y:=min[1];y
什么是
x
y
?@NickyLogan x和y代表坐标,(0,0)是程序创建的窗口的左下角。将1添加到x意味着向右移动一个像素,将1添加到y意味着向上移动一个像素。也许这会有所帮助:@NickyLogan感谢链接,我检查了,这似乎是我在第二次代码提取中实现的(使用&&而不是| |)。但是,它不会改变行为。当存在重叠时,Check_collision是否应该返回
true
?在看到您的答案之前,我用我的工作编辑了我的问题,但我仍会尝试
func (player Player) IsOutOfBounds(tiles [][]*world.Tile) bool {
    x, y, _, _ := NormalizeCoordinates(player.Pos.X, player.Pos.Y)
    //So now no need to loop through every cell since I know which one the player is touching   
    if strings.Contains(tiles[x][y].Type, "wall") || tiles[x][y].Type == "pillar" {
        return true
    }
    return false
}

// I use this function to find the closest multiple of 32 from the player position which is going to be the index of the tile the player is in
func NormalizeCoordinates(player_x, player_y float64) (int, int, int, int) {
    x := int(player_x + 32/2)
    x -= x % 32

    y := int(player_y + 32/2)
    y -= y % 32

    x2 := x + 32

    y2 := y + 32

    return x, y, x2, y2
}