我正在用scene2d创建一个游戏(Java)。
我编写了碰撞检测功能,但我觉得它功能不好。它看起来很糟糕。
我该如何优化它?让自己变得更快更漂亮。
private void deleteEnemies()
{
for(int i = 0; i < getActors().size - 1; i++)
{
if(getActors().get(i) != null && getActors().get(i) instanceof Enemy)
{
////////////////
for (int j = 0; j < getActors().size - 1; j++)
{
if(getActors().get(j) != null && getActors().get(j) instanceof Ball)
{
if (actorsIntersecting(getActors().get(i), getActors().get(j)))
{
getActors().get(i).remove();
getActors().get(j).remove();
}
}
}
//////////////
}
}
}
答案 0 :(得分:1)
getActors().get(i)
放入变量中,不要在外部if getActors().get(j)
相同
.size
函数答案 1 :(得分:1)
2.第二个 - 请检查您的情况并逐个检查 - 现在您总是检查2个条件。如果以后尝试放“重”,例如:
从:
if(getActors().get(i) != null && getActors().get(i) instanceof Enemy)
到:
if(getActors().get(i) != null) {
if(getActors().get(i) instanceof Enemy) {
.....
}
}
3.调用你的getActors()。get(i)一次 - 保存到变量。
4.我在想为什么有必要检查一个actor是否为null,可能只是从列表中删除空值或将未初始化的actor保留在另一个列表中。也可以尝试使用Balls and Enemies,请不要将每个演员都放在一个列表中。
答案 2 :(得分:1)
由于你经常这样做,考虑将敌人和球存放在他们自己的结构中(列表或集合或其他任何工作)。这可以防止你循环通过你不需要的演员,并避免支票的实例。
答案 3 :(得分:0)
不要使用size(),定义变量 尽量不要施放。尽量不要使用例子。 也许,通过zsort或类似的方式对列表进行排序,这样你有时可以更快地启动和/或停止循环?
答案 4 :(得分:0)
增加其他参与者的(非常好的)建议:将敌人和射弹缓存在不同的结构中,这样你就不必检查它们到底是什么了。
尽可能多地使用时间与空间的权衡:正如Tomek所暗示的那样,标准方法是在这种情况下通过修剪不能使用的敌人和射弹来减少检查次数(=迭代次数)可能在当前帧内发生碰撞(它们是远的)。
无论如何,提出建议:继续游戏,尽可能多地完成游戏,以便它能正常运行(如果速度慢),只有然后才能进行优化。
那是因为
答案 5 :(得分:0)
我会稍微改写模型,所以他们可以测试交集本身,然后像那样删除(可能它仍然可以改进)
private void deleteEnemies () {
List<Actor> actors = getActors();
List<Actor> toRemove = new ArrayList<Actor>();
int actorsSize = actors.size();
Actor first = null, second = null;
for(int i = 0; i < actorsSize; ++i) {
first = actors.get(i);
for(int j = 0; j < actorsSize; ++j) {
if(i == j) continue;
second = actors.get(j);
if(first.intersects(second)) {
toRemove.add(first);
toRemove.add(second);
}
}
}
actors.removeAll(toRemove);
}
答案 6 :(得分:0)
正如其他人所说,对速度的真正改进将是两个集合,一个带球,另一个带有敌人。至于使它看起来更好,你可以这样:
for (Actor enemy : getActors()) {
if (enemy != null && enemy instanceof Enemy) {
for (Actor ball : getActors()) {
if (ball != null && ball instanceof Ball && actorsIntersecting(enemy, ball)) {
ball.remove();
enemy.remove();
}
}
}
}