我指的是以下开源Android pong游戏: https://github.com/Grarak/Pong-Android/tree/master/app/src/main/java/com/grarak/pong
我可以通过调试代码并根据屏幕上发生的情况查看哪种方法和哪种条件触发来了解所有方法及其工作方式。但是整个项目中有一种方法我无法弄清楚它的用途,尽管只要球碰到屏幕的边缘就会大量使用它。我只是无法弄清楚为什么计算它的方式,它的算法的逻辑是什么。
有问题的方法名为“getVelocityY”,它位于此页面的底部: https://github.com/Grarak/Pong-Android/blob/master/app/src/main/java/com/grarak/pong/Ball.java
非常感谢您在解决这一部分时可以提供的任何帮助。我很乐意回答您的任何问题,如果您愿意我用简单的英语记录项目的其他方法,以防您需要。
答案 0 :(得分:0)
以下是该方法的细分,尽管这对于SO来说并不是一个合适的问题....
private double getVelocityY(Paddle paddle, float radius) {
设置5个命中箱以确定球击中桨的区域
Float[][] hitboxes = new Float[5][2];
for (int i = 0; i < hitboxes.length; i++) {
计算此hitbox的最小和最大位置
hitboxes[i][0] = (paddle.getLength() / hitboxes.length) * i + paddle.getHeight();
hitboxes[i][1] = (paddle.getLength() / hitboxes.length) * (i + 1) + paddle.getHeight();
延伸边缘处的击球盒以确保球的边缘(具有给定半径)仍将击中球拍。注意:此代码可能已移出迭代。
if (i == 0) hitboxes[i][0] -= radius;
else if (i == hitboxes.length - 1) hitboxes[i][1] += radius;
}
根据球击中球拍的位置确定速度的变化。如果它击中中心,速度不变。
for (int i = 0; i < hitboxes.length; i++) {
if (position.y > hitboxes[i][0] && position.y < hitboxes[i][1])
switch (i) {
case 0:
return -4;
case 4:
return 4;
case 1:
return -2;
case 3:
return 2;
}
}
return 0;
}