- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个小游戏,但我陷入了这个错误。我在网上搜索了所有我能找到的就是使用
List<Entity> entity = Collections.synchronizedList(new LinkedList<Entity>());
不幸的是,这对我没有帮助,我尝试绕过 for 循环,但我仍然找不到解决办法。有人知道我怎样才能摆脱这个错误。
处理程序类
public List<Entity> entity = Collections.synchronizedList(new LinkedList<Entity>());
public List<Tile> tile = Collections.synchronizedList(new LinkedList<Tile>());
public void render(Graphics g){
for(Entity entity : entity){
entity.render(g);
}
for(Tile tile : tile){
tile.render(g);
}
}
public void update(){
for(Entity entity : entity){
entity.update();
}
for(Tile tile : tile){
tile.update();
}
}
public void addEntity(Entity entity){
this.entity.add(entity);
}
public void removeEntity(Entity entity){
this.entity.remove(entity);
}
public void addTile(Tile tile){
this.tile.add(tile);
}
public void removeTile(Tile tile){
this.tile.remove(tile);
}
抽象实体类(由每个实体扩展)
public int x,y,width,height;
public boolean solid;
public Id id;
public Handler handler;
public int velX,velY;
public boolean falling = true;
public boolean jumping = false;
public double gravity = 0.0;
public double health;
public boolean damageable = true;
public long damageTimer = System.currentTimeMillis();
public Entity(int x, int y, int width, int height, boolean solid, Id id,Handler handler){
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.solid = solid;
this.id = id;
this.handler = handler;
if(id==Id.Zombie) health=3.0;
if(id==Id.Player) health=5.0;
}
public abstract void render(Graphics g);
public abstract void update();
public void die(){
handler.removeEntity(this);
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean isSolid() {
return solid;
}
public Id getId() {
return id;
}
public int getVelX() {
return velX;
}
public void setVelX(int velX) {
this.velX = velX;
}
public int getVelY() {
return velY;
}
public void setVelY(int velY) {
this.velY = velY;
}
public Rectangle getBounds(){
return new Rectangle(x,y,width,height);
}
public Rectangle getBoundsTop(){
return new Rectangle(x,y-6,width,6);
}
public Rectangle getBoundsBottom(){
return new Rectangle(x,y+height,width,6);
}
public Rectangle getBoundsLeft(){
return new Rectangle(x-6,y,6,height);
}
public Rectangle getBoundsRight(){
return new Rectangle(x+width,y,6,height);
}
public double getHealth() {
return health;
}
public void setHealth(double health) {
this.health = health;
}
错误:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966)
at java.util.LinkedList$ListItr.next(LinkedList.java:888)
at Main.Handler.update(Handler.java:26)
at Main.GUI.update(GUI.java:100)
at Main.GUI.run(GUI.java:56)
at java.lang.Thread.run(Thread.java:745)
第 26 行是:
for(Entity entity : entity){
只有当有多个敌人的情况下有东西被杀死时,才会出现该错误。 (尤其是当有东西被杀死而另一个敌人非常非常接近时,这种情况就会发生)
添加:僵尸类(Entity.update();应该为使用此类创建的每个对象执行此类 update() 方法)
public Zombie(int x, int y, int width, int height, boolean solid, Id id, Handler handler) {
super(x, y, width, height, solid, id, handler);
}
@Override
public void render(Graphics g) {
g.setColor(Color.RED);
g.fillRect(x, y, width, height);
}
@Override
public void update() {
x+=velX;
y+=velY;
if(x<=0) x=0;
if(x+width >= GUI.WIDTH*GUI.SCALE+10) x = GUI.WIDTH*GUI.SCALE-width+10;
if(y+height >= GUI.HEIGHT*GUI.SCALE+10) y = GUI.HEIGHT*GUI.SCALE-height+10;
for(Tile tile: GUI.handler.tile){
if(tile.getId()==Id.Stone){
if(getBoundsTop().intersects(tile.getBounds())){
y = tile.getY()+tile.height;
}
if(getBoundsBottom().intersects(tile.getBounds())){
y = tile.getY()-height;
gravity=0.0;
falling=true;
jumping=false;
}
if(getBoundsLeft().intersects(tile.getBounds())){
x = tile.getX()+tile.width;
}
if(getBoundsRight().intersects(tile.getBounds())){
x = tile.getX()-width;
}
}
}
for(Entity entity: GUI.handler.entity){
if(entity.getId()==Id.Player){
if(System.currentTimeMillis()-damageTimer>1000){
damageable=true;
entity.damageable = true;
damageTimer+=1000;
}
if(new Rectangle(x-6,y-6,width+12,6).intersects(entity.getBounds())){
entity.damageable = false;
if(damageable){
if(entity.gravity>=0){
setHealth(getHealth()-1.0);
entity.falling = false;
entity.jumping = true;
entity.gravity = -10.0;
entity.setVelY((int) entity.gravity);
}
damageable=false;
}
}
if(getBoundsBottom().intersects(entity.getBounds())){
if(entity.damageable){
entity.setHealth(entity.getHealth()-1.0);
entity.damageable = false;
}
}
if(getBoundsLeft().intersects(entity.getBounds())){
if(entity.damageable){
entity.setHealth(entity.getHealth()-1.0);
entity.damageable = false;
}
}
if(getBoundsRight().intersects(entity.getBounds())){
if(entity.damageable){
entity.setHealth(entity.getHealth()-1.0);
entity.damageable = false;
}
}
}
}
if(jumping){
gravity+=0.2;
setVelY((int)gravity);
if(gravity>=0.5){
gravity+=0.1;
}
}
if(falling){
gravity+=0.3;
setVelY((int) gravity);
}
for(Entity entity : GUI.handler.entity){
if(entity.getId()==Id.Player){
if(entity.getY()<y&&!jumping&&getVelY()<=0){
if(entity.getY()<y-10){
if(entity.getX()<x){ velX = -3; }else{ velX = 3; }
gravity = -10.0;
jumping = true;
falling = false;
velY = (int)gravity;
} else {
if(entity.getX()<x){ velX = 3; }else{ velX = -3; }
}
}
}
}
if(health<=0) die();
}
最佳答案
你的问题出在你的die方法上。您正在尝试编辑当前正在迭代的列表实体。这会导致您的错误。
不要修改其中的列表,而是尝试有一个辅助列表来告诉您哪些实体已经死亡。完成所有更新后,您应该删除所有这些实体。
关于java - Eclipse, "Exception in thread "线程 - 2"java.util.ConcurrentModificationException",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45235587/
我想在文件系统上手动创建文件夹/文件,以便在 eclipse 的工作区中创建新项目,并在启动 eclipse 并选择工作区时显示在项目资源管理器中。 执行此操作需要创建哪些文件,它们需要位于何处? 请
我正在关注these instructions ,但在运行 mvn eclipse:eclipse 等命令时遇到问题。 我应该如何以及在哪里运行该命令? 我的设置: Windows 7 32 位 面向
是否有任何命令可以在不实际启动 eclipse 的情况下创建 eclipse 工作区?我希望该命令成为脚本的一部分。创建工作区后,将对其进行配置(例如文本编码),然后用于将项目导入到 RTC。我知道下
我想为 Eclipse 插件创建一个自动安装程序(即不通过“更新管理器”)。我的场景很简单:用户关闭 Eclipse,将下载的 JAR 放入 dropins 文件夹,启动 Eclipse,其余的过程是
每当我们想要使用现有源位置创建 Eclipse 项目时,我们将选择现有源位置(根)作为项目位置。 Eclipse 将在该源的根目录中创建所有项目特定文件。 现在,出于某种原因,如果我们想用不同的设置重
可能被问过多次; 有没有办法从控制台(Linux 或 Windows)刷新 Eclipse 工作区文件夹。 我知道有 Ant 任务可以做到这一点。但很想知道是否有命令行技巧。 最佳答案 不,您能做的最
我说的是工具栏上的小图标。 网络上似乎没有任何这样的问题,它们都指的是 android 或自定义应用程序,而不是与 eclipse 捆绑在一起的图标。 我想知道是否有人尝试过这个,或者可以告诉我它不值
如何使用 Eclipse 比较两个文件? (目前我正在使用 WinMerge 。) 最佳答案 要在 Eclipse 中比较两个文件,请首先在 Project Explorer/Package Expl
我正在尝试将我在一个带有数据库的 Eclipse JEE6 项目中所做的所有工作转移到另一个 Eclipse 程序。我知道我将不得不重新配置很多并重建很多库文件,但是尽可能多地传输的最简单方法是什么?
在 Eclipse 中加载我的工作台并启用 TFS 插件时,它挂起。与此类似: http://social.msdn.microsoft.com/Forums/vstudio/en-US/85c1d3
Eclipse 可以通过插件包含许多不同的功能集。您是否在一个 Eclipse 中安装所有插件?或者您是否从 spring 安装 STS,从 adobe 安装 Flex eclipse,甚至从 ecl
我错误地单击了“在 Eclipse 首选项中将目标运行标记为忽略在 Eclipse 构建中(实验)”: 在哪里/如何撤消此操作? 最佳答案 m2e 使用文件 YOUR_WORKSPACE/.metad
我是 Maven 新手。我尝试执行 >mvn eclipse:eclipse -Dwtpversion=2.0。但我收到以下错误: D:\test\CounterWebApp>mvn eclips
当我运行多个 Eclipse 实例时,操作系统不断请求上述权限。 我已经授予了该权限,并且我尝试了多次禁用和启用该权限。 我正在使用, macOS Catalina(版本:10.15.3 (19D76
我有一个 Maven 项目,其中我在项目构建期间使用 wsimport 作为目标来使用 Web 服务。 org.codehaus.mojo
当尝试使用 eclipse 新软件功能安装 eclipse 时,出现此错误: Cannot complete the install because one or more required item
我已经下载了整个 Eclipse Helios/Indigo 版本的源代码。现在我想对它进行一些修改等等。所以我导入了整个源代码,但现在我在编译时遇到了 n 个错误。此外,我正在尝试 RunAs> 插
我已经安装了 eclipse Oxygen 并且正在尝试连接到 Eclipse 市场,以安装插件,它给出了以下异常 - org.eclipse.equinox.p2.core.ProvisionExc
我的 IDE 中安装了来自 Sonatype 的 m2Eclipse 插件。它允许我通过右键单击 pom.xml 文件并导航到“运行方式”菜单来运行各种 Maven 命令(打包、安装等)。 但是,我还
我在 Windows7 64 位上运行 Maven 3 时遇到问题。当我执行maven eclipse:eclipse(我使用maven-eclipse-plugin 2.8)时,maven不会创建任
我是一名优秀的程序员,十分优秀!