行业资讯
HarmonyOS应用开发实战:猫猫大作战-碰撞检测与重力下落
前言在「猫猫大作战」中猫咪从棋盘顶部落下碰到已停落的猫咪或棋盘底部时停止。碰撞检测决定了猫咪的下落路径和最终位置是物理模拟的核心。一、重力下落private readonly GRAVITY_SPEED 1; // 每帧下落 1 行 updateCatPosition(cat: Cat): void { if (!cat.falling) return; const targetY this.findLandingY(cat.x, cat.y); if (cat.y targetY) { cat.y this.GRAVITY_SPEED; // 下落 } else { cat.falling false; // 着陆 } }二、碰撞检测算法private findLandingY(x: number, startY: number): number { // 从 startY 开始向下查找第一个空位 for (let y startY; y GameConfig.BOARD_HEIGHT; y) { if (this.board[y][x] ! null) { return y - 1; // 被挡住停在上一行 } } return GameConfig.BOARD_HEIGHT - 1; // 到底部 } // 水平碰撞合并检测 private findSameLevelNeighbors(x: number, y: number, level: CatLevel): { x: number; y: number }[] { const neighbors: { x: number; y: number }[] []; const directions [[-1,0], [1,0], [0,-1], [0,1]]; // 上下左右 for (const [dx, dy] of directions) { const nx x dx; const ny y dy; if (nx 0 nx 5 ny 0 ny 8) { const cat this.board[ny][nx]; if (cat cat.level level) { neighbors.push({ x: nx, y: ny }); } } } return neighbors; }三、配置参数参数值说明GRAVITY_SPEED1每 100ms 下落 1 行BOARD_WIDTH5棋盘宽度列BOARD_HEIGHT8棋盘高度行CELL_SIZE60vp每格像素大小UPDATE_INTERVAL100ms物理更新周期四、四种碰撞场景场景检测结果行为底部空y HEIGHT-1停在底部下方有猫board[y1][x] ! null停在当前行左右同级邻居 level 相同触发合并已在行内board[y][x] ! null游戏结束五、优化建议从下往上扫描碰撞检测从下往上更快缓存落点同一列多次计算落点时缓存结果只更新移动中的猫咪已着陆的猫跳过物理计算总结碰撞检测通过从当前位置向下查找空位确定猫咪的最终着陆位置。核心要点findLandingY查找落点、GRAVITY_SPEED1逐行下落、 四方向邻居检测合并、 着陆后fallingfalse。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源GameEngine 源码第 121 篇gravity第 124 篇forEach update第 125 篇merge detect
郑州网站建设
网页设计
企业官网