java - Java 对象转义窗口框架
问题描述
所以我做了一个游戏,我希望敌人以随机的 x 和 y 速度击中时从墙上反弹。然而,不知何故,这些小虫子仍然在窗外。大多数时候它可以工作,但每隔 10 次左右它就会偷偷溜出边界,我不知道怎么做。
@Override
public void tick()
{
x += speedX;
y += speedY;
Random r = new Random();
//BUGS
if(y <= 0 || y >= Game.HEIGHT - 48) //This is correct size of the window edges
{
if(speedY <= 0)
speedY = (r.nextInt(8) + 1);
else
speedY = -(r.nextInt(8) + 1);
}
if(x <= 0 || x >= Game.WIDTH - 32) //This is correct size of the window edges
{
if(speedX <= 0)
speedX = (r.nextInt(8) + 1);
else
speedX = -(r.nextInt(8) + 1);
}
解决方案
问题:
- 不要重新创建 Random,因为它很浪费,有时还很危险。最好创建一个 Random 对象并将其分配给类的实例字段,并在整个过程中使用它。
- 避免“幻数”。所以代替
y >= Game.HEIGHT - 48
, doy >= Game.HEIGHT - WINDOW_EDGES
(或类似的东西) - 不要像你正在做的那样交换速度,而是检查
y <= 0
或y >= Game.HEIGHT -SOME_CONSTANT
单独检查,并根据这一发现调整结果,以避免陷入速度“陷阱”。这实际上是您的主要问题。
例如,
if (y <= 0) {
speedY = r.nextInt(8) + 1; // change 8 to a constant
} else if (y >= Game.HEIGHT - SOME_CONSTANT) {
speedY = -(r.nextInt(8) + 1);
}
x 和 speedX 相同
关于:
2)我想这样做,但由于我有多个对象大小,我必须改变边缘。
然后每个对象都应该有一个返回其边缘大小(或任何需要的属性)的方法,并且您应该再次使用它,而不是幻数
3)我尝试交换,他们刚刚从屏幕上射出。
我不知道你的意思是什么,或者你可能做了哪些具体的代码更改。
如果仍然卡住,请考虑创建并发布一个有效的Minimal Reproducible Example
推荐阅读
- paraview - 如何处理标志/异常值
- eclipse - Windows 和 Ubuntu 中 mpiexec 的不同行为
- django - 如何将 ManyToManyField 的选择数量限制为特定数量的选择
- c - 数组中的错误值
- android - ZIP 运算符不适用于 PublishSubject,我做错了什么?
- php - 在项目中仅包含一次 php 文件
- python - 如何为其中一列包含标点符号、空格的数据集编写代码并删除相应的行?
- powerbi - PowerBI M:如何在 IF 语句的排除项中编码
- javascript - 只获取昨天和明天的日期而不是日期日期和时间
- reactjs - 以后如何使用 Passport JS 提供的访问令牌?