重启时游戏有时会崩溃
Games crashes sometimes during restart
你好 Whosebug 社区,
我需要一些帮助。这个 ConcurrentModificationException 错误让我抓狂!我最近刚开始 android 游戏开发和编程。
当我玩我的游戏时,它完美无缺,但有时如果我试图开始一个新游戏,它会崩溃。 Logcat 在我的代码中显示这两行,但我不知道如何修复它,因为它们在我看来是正确的:/
public void run() {
while (playing) {
update();
draw(); //the draw-method is marked
control(); } }
在我的绘制方法中:
// I draw the SpaceDust from an ArrayList
paint.setColor(Color.argb(255, 255, 255, 255));
for (SpaceDust sd : dustList) {
canvas.drawPoint(sd.getX(), sd.getY(), paint); }
有什么想法吗?
谢谢尼克拉斯
编辑:LogCat 输出
FATAL EXCEPTION: Thread-146798
Process: niclas.spacegame, PID: 7983
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
at niclas.spacegame.GameActivity$TDView.update(GameActivity.java:285)
at niclas.spacegame.GameActivity$TDView.run(GameActivity.java:206)
at java.lang.Thread.run(Thread.java:818)
编辑:更新方法
私人无效更新(){
布尔 hitDetected = false;
如果(Rect.intersects(player.getHitbox(), enemy1.getHitbox())){
hitDetected = true;
enemy1.setX(-100);
}
如果(Rect.intersects(player.getHitbox(), enemy2.getHitbox())){
hitDetected = true;
enemy2.setX(-100);
}
如果(Rect.intersects(player.getHitbox(), enemy3.getHitbox())){
hitDetected = true;
enemy3.setX(-100);
}
如果(屏幕 X > 1000){
如果(Rect.intersects(player.getHitbox(), enemy4.getHitbox())){
hitDetected = true;
enemy4.setX(-100);
}
}
如果(屏幕 X > 1200){
如果(Rect.intersects(player.getHitbox(), enemy3.getHitbox())){
hitDetected = true;
enemy5.setX(-100);
}
}
如果(命中检测){
soundPool.play(颠簸, 1, 1, 0, 0, 1);
player.reduceShieldStrength();
如果 (player.getShieldStrength() < 0) {
soundPool.play(摧毁, 1, 1, 0, 0, 1);
游戏结束=真;
}
}
player.update();
enemy1.update(player.getSpeed());
enemy2.update(player.getSpeed());
enemy3.update(player.getSpeed());
if(screenX > 1000) {
enemy4.update(player.getSpeed());
}
if(screenX > 1200) {
enemy5.update(player.getSpeed());
}
for (SpaceDust sd : dustList) {
sd.update(player.getSpeed());
}
if(!gameEnded) {
distanceRemaining -= player.getSpeed();
timeTaken = System.currentTimeMillis() - timeStarted;
}
if(distanceRemaining < 0){
soundPool.play(win, 1, 1, 0, 0, 1);
if(timeTaken < fastestTime) {
editor.putLong("fastestTime", timeTaken);
editor.commit();
fastestTime = timeTaken;
}
distanceRemaining = 0;
gameEnded = true;
}
}
您可能正在从列表中删除一个元素,同时在其他地方使用 "for each" 循环访问它。
首先,改用迭代器,但还将对数组列表的访问包装在同步块中:
替换:
for (SpaceDust sd : dustList) {
sd.update(player.getSpeed());
}
与:
synchronized(dustList){
Iterator<SpaceDust> it = dustList.iterator();
while (it.hasNext() {
SpaceDust sd = it.next();
sd.update(player.getSpeed());
}
}
并将列表修饰符包装在同步块中:
synchronized(dustList){
int numSpecs = 400;
for (int i = 0; i < numSpecs; i++) {
SpaceDust spec = new SpaceDust(screenX, screenY);
dustList.add(spec);
}
}
这种方法效率很低,但应该可以解决您的问题。这会锁定数组列表,因此在您读取或写入时无法修改它。
你好 Whosebug 社区, 我需要一些帮助。这个 ConcurrentModificationException 错误让我抓狂!我最近刚开始 android 游戏开发和编程。
当我玩我的游戏时,它完美无缺,但有时如果我试图开始一个新游戏,它会崩溃。 Logcat 在我的代码中显示这两行,但我不知道如何修复它,因为它们在我看来是正确的:/
public void run() {
while (playing) {
update();
draw(); //the draw-method is marked
control(); } }
在我的绘制方法中:
// I draw the SpaceDust from an ArrayList
paint.setColor(Color.argb(255, 255, 255, 255));
for (SpaceDust sd : dustList) {
canvas.drawPoint(sd.getX(), sd.getY(), paint); }
有什么想法吗? 谢谢尼克拉斯
编辑:LogCat 输出
FATAL EXCEPTION: Thread-146798
Process: niclas.spacegame, PID: 7983
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
at niclas.spacegame.GameActivity$TDView.update(GameActivity.java:285)
at niclas.spacegame.GameActivity$TDView.run(GameActivity.java:206)
at java.lang.Thread.run(Thread.java:818)
编辑:更新方法 私人无效更新(){ 布尔 hitDetected = false; 如果(Rect.intersects(player.getHitbox(), enemy1.getHitbox())){ hitDetected = true; enemy1.setX(-100); } 如果(Rect.intersects(player.getHitbox(), enemy2.getHitbox())){ hitDetected = true; enemy2.setX(-100); } 如果(Rect.intersects(player.getHitbox(), enemy3.getHitbox())){ hitDetected = true; enemy3.setX(-100); } 如果(屏幕 X > 1000){ 如果(Rect.intersects(player.getHitbox(), enemy4.getHitbox())){ hitDetected = true; enemy4.setX(-100); } } 如果(屏幕 X > 1200){ 如果(Rect.intersects(player.getHitbox(), enemy3.getHitbox())){ hitDetected = true; enemy5.setX(-100); } } 如果(命中检测){ soundPool.play(颠簸, 1, 1, 0, 0, 1); player.reduceShieldStrength(); 如果 (player.getShieldStrength() < 0) { soundPool.play(摧毁, 1, 1, 0, 0, 1); 游戏结束=真; } }
player.update();
enemy1.update(player.getSpeed());
enemy2.update(player.getSpeed());
enemy3.update(player.getSpeed());
if(screenX > 1000) {
enemy4.update(player.getSpeed());
}
if(screenX > 1200) {
enemy5.update(player.getSpeed());
}
for (SpaceDust sd : dustList) {
sd.update(player.getSpeed());
}
if(!gameEnded) {
distanceRemaining -= player.getSpeed();
timeTaken = System.currentTimeMillis() - timeStarted;
}
if(distanceRemaining < 0){
soundPool.play(win, 1, 1, 0, 0, 1);
if(timeTaken < fastestTime) {
editor.putLong("fastestTime", timeTaken);
editor.commit();
fastestTime = timeTaken;
}
distanceRemaining = 0;
gameEnded = true;
}
}
您可能正在从列表中删除一个元素,同时在其他地方使用 "for each" 循环访问它。
首先,改用迭代器,但还将对数组列表的访问包装在同步块中:
替换:
for (SpaceDust sd : dustList) {
sd.update(player.getSpeed());
}
与:
synchronized(dustList){
Iterator<SpaceDust> it = dustList.iterator();
while (it.hasNext() {
SpaceDust sd = it.next();
sd.update(player.getSpeed());
}
}
并将列表修饰符包装在同步块中:
synchronized(dustList){
int numSpecs = 400;
for (int i = 0; i < numSpecs; i++) {
SpaceDust spec = new SpaceDust(screenX, screenY);
dustList.add(spec);
}
}
这种方法效率很低,但应该可以解决您的问题。这会锁定数组列表,因此在您读取或写入时无法修改它。