我正在寻找以下问题的一些帮助。这不是我的原始代码,我对Java很新,所以我可能会遗漏一些明显的东西。
该代码在我拥有的游戏中产生了一些效果,但是生成的效果似乎没有任何上限。有什么办法可以将效果的上限值限制为某个整数值吗?说20?或者我可以将此值设为20到30之间的随机整数吗?
我一直试图限制列表大小的大小,但它似乎不起作用。
任何建议表示赞赏。
我也尝试将值for(int j = 0; j < i; j++)
调整为类似for(int j = 0; j < 20; j++)
的内容,但这似乎也没有效果,效果也像以前一样产生。
我还尝试删除int i = list.size();
和Actor actor = (Actor)list.get(j);
,以便代码只依赖于for
循环,但代码无法编译:它似乎需要代码{{1 }}。我收到以下 Actor actor = (Actor)list.get(j);
错误:
cannot resolve symbol
感谢您的帮助。就像我说的,如果我遗漏了一些明显的东西,我很抱歉。
答案 0 :(得分:1)
我无法确定所有代码的作用是什么,但是,看起来您的函数实际上会返回标记超过您粘贴的点数?似乎Actors列表的大小是可以产生多少烟雾效果的上限(受if语句传递的数量限制)。那说我会尝试这样的事情(为了保留其余的功能)
if(!flag && actor.pos.getAbsPoint().distance(point3d) < 10000D && (actor instanceof TypeBomber) && actor.getArmy() != myArmy)
{
if (renderedCount < 20)
{
Random random = new Random();
int k = random.nextInt(500);
int l = k - 250;
k = random.nextInt(500);
int i1 = k - 250;
Eff3DActor.New(this, null, new Loc(l, i1, 0.0D, 0.0F, 90F, 0.0F), 1.0F, "Effects/Smokes/CityFire.eff", 600F);
int j1 = random.nextInt(10);
wait = (float)(1.0D + (double)j1 * 0.10000000000000001D);
renderedCount += 1;
}
flag = true;
}
确保在for循环之前声明int renderedCount。
现在这应该限制每次调用时创建20个烟雾效果的功能。这使我们遇到了这种方法似乎不起作用的问题。既然你提到这是一款游戏,我愿意打赌这个功能每分钟被调用很多次(每次游戏时间超过一次&#39;)。如果是这种情况,限制该功能创建的烟雾效果的数量似乎不会对游戏中的任何事情做很多事情。为了完全限制数量,你需要做一些更复杂的事情,你要记录当前全球范围内的烟雾效果。这可能涉及跟踪自效果开始以来已经过了多长时间......(似乎等待可能是效果在启动后继续的时间)。
至于关于如何全局跟踪事物的建议我可能会建议在单例canCreate()和didCreate(float timeValue)上使用单例和一些方法,然后替换renderedCount&lt; 20使用canCreate()并使用didCreate替换renderedCount + = 1(等待)。
无论如何,我希望这可以帮助你。
P.S。限制这种情况的复杂性是一个很好的例子,说明为什么ModelViewController在设计这样的东西时如此重要......
编辑:粗略单身
public class SmokeCountSingleton {
private static SmokeCountSingleton instance = null;
private List<Long> smokeList = new ArrayList<Long>();
protected SmokeCountSingleton() {
}
public static SmokeCountSingleton getInstance() {
if(instance == null) {
instance = new SmokeCountSingleton();
}
return instance;
}
public boolean canCreate() {
cleanList()
return (smokeList.size() <= 20)
}
public void didCreate(float duration) {
//duration appears to be in seconds but we want it in milliseconds
smokeList.add(System.currentTimeMillis() + duration*1000)
}
private void cleanList(){
//remove items from list who have exceeded their duration
// have a value less than System.currentTimeMillis()
}
}
我没有时间完成它的充实,但希望这足以让你前进。 单例的意思是它只有一个实例,它有点像你的程序可以使用的数据库或其他外部服务器,但没有太多的开销。通过这种方式,您也不必再声明它,因此您不必担心需要声明它的位置,但它仍然会像您有一个全局列表一样。要访问单例实例(和方法),您只需:
SmokeCountSingleton.getInstance().canCreate()
SmokeCountSingleton.getInstance().didCreate(someDurationValue)
就像我之前说过的,我的Java有点生疏,我只是在编辑窗口中嘲笑它;如果它没有开箱即用,那就道歉了#39;
另外,作为旁注,您可能会有多个线程运行该调用函数,以便访问它。因此,您可能希望查看Java中的同步关键字...
答案 1 :(得分:0)
直接使用 list.size()
,而不是将其传递给i。它将返回列表所持有的对象数。
您还可以使用Iterator
或ListIterator
来遍历列表元素,因为它会更容易,如果您使用这些元素。
例如: -
Actor actor; //It would be better if you create variable here and use the same variable for different objects.
Iterator iter = list.iterator();
while(iter.hasNext()){
actor = (Actor)iter.next();
....//Rest of the code
}
答案 2 :(得分:0)
我将回答有关我们是否可以为列表设置最大值的问题。希望能帮助您更好地了解Java :))
通常,List的实现没有最大大小,您始终可以在其末尾添加更多元素。 为了解决这个问题,可以使用Actor的原始数组:
private static final int MAX_NUMBER_OF_ACTORS = 20
Actor[] actors = new Actor[MAX_NUMBER_OF_ACTORS];
也就是说,我鼓励您通过各种实现使用List接口为您提供的内容。例如,使用Arraylist和ovverride的add方法:
public class ActorList extends ArrayList<Actor> {
private static final int MAX_NUMBER_OF_ACTORS = 20
@Override
public boolean add(Store s) {
boolean result = false;
if (this.size() <= MAX_NUMBER_OF_ACTORS){
result = super.add(s);
}else{
// Notify number maximum of actors have been reached (logging, whatever processing you want here...)
}
return result;
}
}
这将使您能够控制Actor实例列表的最大大小。