diff --git a/utils/g2d/physics.go b/utils/g2d/physics.go index ab81172..b5da3d8 100644 --- a/utils/g2d/physics.go +++ b/utils/g2d/physics.go @@ -1,12 +1,13 @@ package g2d // SlideDropXY 侧滑掉落特定位置成员 -func SlideDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) bool) (dropX, dropY int) { +func SlideDropXY[T any](matrix [][]T, x, y int, isStop func(start T, x, y int, data T) bool) (dropX, dropY int) { width, height := len(matrix), len(matrix[0]) + start := matrix[x][y] var offsetX, offsetY = -1, 1 for { targetX, targetY := x+offsetX, y+offsetY - if targetX < 0 || targetY == height || isStop(targetX, targetY, matrix[targetX][targetY]) { + if targetX < 0 || targetY == height || isStop(start, targetX, targetY, matrix[targetX][targetY]) { dropX, dropY = targetX+1, targetY-1 break } @@ -16,7 +17,7 @@ func SlideDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) bo offsetX, offsetY = 1, 1 for dropX != x && dropY != y { targetX, targetY := x+offsetX, y+offsetY - if targetX == width || targetY == height || isStop(targetX, targetY, matrix[targetX][targetY]) { + if targetX == width || targetY == height || isStop(start, targetX, targetY, matrix[targetX][targetY]) { dropX, dropY = targetX-1, targetY-1 break } @@ -28,7 +29,7 @@ func SlideDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) bo // SlideDropX 侧滑掉落一整列 // - 返回每一个成员的y轴新坐标 -func SlideDropX[T any](matrix [][]T, x int, isStop func(x, y int, data T) bool) (result []int, change bool) { +func SlideDropX[T any](matrix [][]T, x int, isStop func(start T, x, y int, data T) bool) (result []int, change bool) { result = make([]int, len(matrix[x])) for y := len(matrix[x]) - 1; y >= 0; y-- { _, dropY := SlideDropXY(matrix, x, y, isStop) @@ -42,7 +43,7 @@ func SlideDropX[T any](matrix [][]T, x int, isStop func(x, y int, data T) bool) // SlideDropY 侧滑掉落一整行 // - 返回每一个成员的x轴新坐标 -func SlideDropY[T any](matrix [][]T, y int, isStop func(x, y int, data T) bool) (result []int, change bool) { +func SlideDropY[T any](matrix [][]T, y int, isStop func(start T, x, y int, data T) bool) (result []int, change bool) { result = make([]int, len(matrix)) for x := 0; x < len(matrix); x++ { dropX, _ := SlideDropXY(matrix, x, y, isStop) @@ -55,7 +56,7 @@ func SlideDropY[T any](matrix [][]T, y int, isStop func(x, y int, data T) bool) } // SlideDrop 侧滑掉落整个矩阵 -func SlideDrop[T any](matrix [][]T, isStop func(x, y int, data T) bool) (result [][][2]int, change bool) { +func SlideDrop[T any](matrix [][]T, isStop func(start T, x, y int, data T) bool) (result [][][2]int, change bool) { result = make([][][2]int, len(matrix)) for x := 0; x < len(matrix); x++ { ys := make([][2]int, len(matrix[x])) @@ -70,12 +71,13 @@ func SlideDrop[T any](matrix [][]T, isStop func(x, y int, data T) bool) (result } // VerticalDropXY 垂直掉落特定位置成员 -func VerticalDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) bool) (dropX, dropY int) { +func VerticalDropXY[T any](matrix [][]T, x, y int, isStop func(start T, x, y int, data T) bool) (dropX, dropY int) { height := len(matrix[0]) + start := matrix[x][y] var offsetY = 1 for { testY := y + offsetY - if testY == height || isStop(x, testY, matrix[x][testY]) { + if testY == height || isStop(start, x, testY, matrix[x][testY]) { return x, testY - 1 } offsetY++ @@ -84,7 +86,7 @@ func VerticalDropXY[T any](matrix [][]T, x, y int, isStop func(x, y int, data T) // VerticalDropX 垂直掉落一整列 // - 返回每一个成员的y轴新坐标 -func VerticalDropX[T any](matrix [][]T, x int, isStop func(x, y int, data T) bool) (result []int, change bool) { +func VerticalDropX[T any](matrix [][]T, x int, isStop func(start T, x, y int, data T) bool) (result []int, change bool) { result = make([]int, len(matrix[x])) for y := len(matrix[x]) - 1; y >= 0; y-- { _, dropY := VerticalDropXY(matrix, x, y, isStop) @@ -98,7 +100,7 @@ func VerticalDropX[T any](matrix [][]T, x int, isStop func(x, y int, data T) boo // VerticalDropY 垂直掉落一整行 // - 返回每一个成员的x轴新坐标 -func VerticalDropY[T any](matrix [][]T, y int, isStop func(x, y int, data T) bool) (result []int, change bool) { +func VerticalDropY[T any](matrix [][]T, y int, isStop func(start T, x, y int, data T) bool) (result []int, change bool) { result = make([]int, len(matrix)) for x := 0; x < len(matrix); x++ { dropX, _ := VerticalDropXY(matrix, x, y, isStop) @@ -111,7 +113,7 @@ func VerticalDropY[T any](matrix [][]T, y int, isStop func(x, y int, data T) boo } // VerticalDrop 垂直掉落整个矩阵 -func VerticalDrop[T any](matrix [][]T, isStop func(x, y int, data T) bool) (result [][][2]int, change bool) { +func VerticalDrop[T any](matrix [][]T, isStop func(start T, x, y int, data T) bool) (result [][][2]int, change bool) { result = make([][][2]int, len(matrix)) for x := 0; x < len(matrix); x++ { ys := make([][2]int, len(matrix[x]))