java - 使用 ACM 图形在 Pacman 中进行碰撞检测 (java)
问题描述
我有一个游戏循环:
private void gameLoop() {
boolean done = false;
while (!done) {
if(pacmanState == "right") {
pac.move(20, 0);
pause(100);
}
if(pacmanState == "left") {
pac.move(-20, 0);
pause(100);
}
if(pacmanState == "down") {
pac.move(0, 20);
pause(100);
}
if(pacmanState == "up") {
pac.move(0, -20);
pause(100);
}
if(pac.getBounds().intersects(b2.getBounds())) {
if(pac.getY() <= b2.getY() - (b2.getHeight()/2)) { //Hit was from below the brick
pac.move(0, 0);
}
if(pac.getY() >= b2.getY()+ (b2.getHeight()/2)) { //Hit was from above the brick
pac.move(0, 0);
}
if(pac.getX() < b2.getX()) { //Hit was on left
pac.move(0, 0);
}
if(pac.getX() > b2.getX()){ //Hit was on right
pac.move(0, 0);
}
}
但是吃豆子直接穿过砖块。我看不出这个逻辑有什么问题。
在我之前的尝试中,我使用了 switch 语句,将 pacman 的移动和碰撞检测合并,如下所示:
switch (pacmanState) {
case "left":
pac.move(-20, 0);
pause(100);
if (pac.getBounds().intersects(b2.getBounds())) {
if (pac.getX() > b2.getX()) {
pac.move(0, 0);
} else {
pac.move(-20, 0);
pause(100);
}
}
break;
解决方案
在您的顶级代码片段中,看起来您在移动pacman 之后正在测试碰撞。然后,如果发生碰撞,则将 pacman 移动零距离,但在下一个循环中,碰撞检查上方的部分将再次移动 pacman。
为了进行正确的碰撞检查,您需要测试 pacman移动时将占据的位置,然后仅在没有发生碰撞时才执行移动。一般来说,如果你在移动后进行测试,已经为时已晚。
推荐阅读
- r - 单个闪亮应用程序中不同变量的散点图
- google-cloud-platform - 使用 Cloud Scheduler 在每个月的第一个星期六安排
- python - pydrive如何将电子表格结果提取到json中
- amazon-web-services - 如何在 Amazon RDS Aurora 上创建多个数据库?
- vue.js - 我们如何使用 vue/nuxt 在浏览器上显示来自 s3 的图像?
- python - 随着时间的推移,使用熊猫计算滚动窗口中唯一 id 的特定条件事件的数量
- c# - 通过 companyName 过滤 MS Graph 不起作用
- arrays - 如何删除元素字段为NULL的数组元素
- python - 获取用户输入,然后将输入写入特定区域的 python 文件
- python - 创建一个 for 循环以使用 beautifulsoup 从多个 URL 抓取多个页面