- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个简单的视频游戏,我很快就遇到了一个我无法解决的问题......我的游戏中有很多敌人,所以他们当然都继承自一个类 Enemy
。但是当玩家和敌人发生碰撞时,敌人并没有被移除......这是我的Entity
、BlueEnemy
、Controller
和敌人
。我假设我的 Player
类没问题,因为我的玩家在碰撞时消失了。
实体.java
package com.darksunproductions.ld47.Entities;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import com.darksunproductions.ld47.Game.Game;
public class Entity {
private int x;
private int y;
private Point pos;
private double velX;
private double velY;
private BufferedImage icon;
private boolean dead = false;
private int updatesSinceDeath = -1;
protected Game game;
protected Entity(int x, int y, double velX, double velY, Game game, BufferedImage icon){
this.x = x;
this.y = y;
this.velX = velX;
this.velY = velY;
this.game = game;
this.icon = icon;
}
public void setUpdatesSinceDeath(int i){
updatesSinceDeath = i;
}
public int getUpdatesSinceDeath(){
return updatesSinceDeath;
}
public boolean isDead(){
return dead;
}
public void kill(){
dead = true;
updatesSinceDeath = 0;
try{
icon = ImageIO.read(new File("Explosion.png"));
}catch(Exception e){
e.printStackTrace();
}
}
public Point topLeft(){
return new Point(x, y);
}
public Point topRight(){
return new Point(x+icon.getWidth(), y);
}
public Point bottomLeft(){
return new Point(x, y+icon.getHeight());
}
public Point bottomRight(){
return new Point(x+icon.getWidth(), y+icon.getHeight());
}
public void setX(int x){
this.x = x;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setY(int y){
this.y = y;
}
public double getVelX() {
return velX;
}
public void setVelX(double velX) {
this.velX = velX;
}
public double getVelY() {
return velY;
}
public void setVelY(double velY) {
this.velY = velY;
}
public BufferedImage getIcon() {
return icon;
}
public void setIcon(BufferedImage icon) {
this.icon = icon;
}
}
蓝色敌人.java
package com.darksunproductions.ld47.Entities;
import java.io.File;
import javax.imageio.ImageIO;
import com.darksunproductions.ld47.Game.Drawable;
import com.darksunproductions.ld47.Game.Game;
public class BlueEnemy extends Enemy implements Drawable{
public BlueEnemy(int x, int y, double velX, double velY, Game game){
super(x, y, velX, velY, game, null, Type.BLUE);
try{
setIcon(ImageIO.read(new File("Blue_Enemy.png")));
}catch(Exception e){
setIcon(null);
}
}
}
Controller .java
package com.darksunproductions.ld47.Game;
import java.awt.Graphics;
import java.awt.Point;
import java.util.LinkedList;
import com.darksunproductions.ld47.Entities.Enemy;
import com.darksunproductions.ld47.Entities.Entity;
import com.darksunproductions.ld47.Entities.Player;
public class Controller {
LinkedList<Drawable> entities = new LinkedList<Drawable>();
Game game;
public Controller(Game g){
game = g;
}
public void testCollision(int startID){
if(entities.size() > 0){
Entity e1 = (Entity) entities.get(startID);
Point corner[] = new Point[4];
corner[0] = e1.topLeft();
corner[1] = e1.topRight();
corner[2] = e1.bottomLeft();
corner[3] = e1.bottomRight();
for (int e = startID + 1; e < entities.size(); e++) {
Entity e2 = (Entity) entities.get(e);
for (int c = 0; c < 4; c++) {
if (corner[c].x > e2.topLeft().x && corner[c].x < e2.topRight().x) {
if (corner[c].y > e2.topLeft().y && corner[c].y < e2.bottomLeft().y) {
collide(e1, e2);
}
}
}
}
}
}
public void collide(Entity e1, Entity e2){
if(e1 instanceof Player && !e1.isDead()){
if(e2 instanceof Enemy && !e2.isDead()){
e1.kill();
e2.kill();
}
}
}
public void update(){
if(entities.size() > 0){
for(Drawable d : entities)
d.update();
}
}
public void render(Graphics g){
if(entities.size() > 0){
for(Drawable d : entities)
d.render(g);
}
}
public void add(Drawable d){
entities.add(d);
}
public void remove(Drawable d){
entities.remove(d);
}
public void remove(int i){
entities.remove(i);
}
public int size(){
return entities.size();
}
public int getIdOf(Entity e){
for(int i = 0; i < entities.size(); i++){
if(e == (Entity)entities.get(i))
return i;
}
return -1;
}
public int getIdOf(Drawable d){
Entity e = (Entity)d;
for(int i = 0; i < entities.size(); i++){
if(e == (Entity)entities.get(i))
return i;
}
return -1;
}
}
敌人.java
package com.darksunproductions.ld47.Entities;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import com.darksunproductions.ld47.Game.Drawable;
import com.darksunproductions.ld47.Game.Game;
public class Enemy extends Entity implements Drawable{
public enum Type{
BLUE
}
private Type type;
public Enemy(int x, int y, double velX, double velY, Game game, BufferedImage icon, Type type){
super(x, y, velX, velY, game, icon);
this.type = type;
}
public void render(Graphics g){
if(getIcon() != null)
g.drawImage(getIcon(), getX(), getY(), null);
}
public void update(){
if(getUpdatesSinceDeath() < 0){
setY(getY() + (int)getVelY());
if(getY() > 550){
setY(-50);
setX((int)(Math.random()*468));
}
}else if(getUpdatesSinceDeath() >= 0){
setUpdatesSinceDeath(getUpdatesSinceDeath() + 1);
if(getUpdatesSinceDeath() > 60){
game.c.remove(this);
}
}
}
}
这是他们碰撞时我遇到的问题:
Exception in thread "Thread-1" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:778)
at java.util.LinkedList$ListItr.next(LinkedList.java:713)
at com.darksunproductions.ld47.Game.Controller.update(Controller.java:52)
at com.darksunproductions.ld47.Game.Game.update(Game.java:58)
at com.darksunproductions.ld47.Game.Game.run(Game.java:78)
at java.lang.Thread.run(Thread.java:701)
除了一个小问题...当我点击 LinkedList.java:778
时,Eclipse 说 LinkedList 没有第 778 行...
预先感谢您提供的任何帮助...
最佳答案
game.c.remove(this);
是糟糕设计的一个很好的指标,实体没有责任决定何时删除它,只是向 提供信息>它可以使用的 Controller
主要问题是增强循环涉及 List
的 Iterator
,这会阻止底层 List
在您修改时被修改正在对其进行迭代。
相反,您自己使用 List
的 Iterator
并且当 Controller
确定实体已失效(死亡或任何其他情况)时,使用 Iterator
的 remove
方法来移除它,例如
public void update(){
if(entities.size() > 0){
LinkedList<Drawable> entities = new LinkedList<>();
while (it.hasNext()) {
Drawable d = it.next();
d.update();
// Or what ever flag you want to use
if (d.isRemovable()) {
it.remove(d);
}
}
}
}
关于未从 LinkedList 中删除 Java 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31106303/
我想添加 LinkedList (我们称之为列表 A)到 LinkedList> (称之为列表 B)。执行此操作后,我需要更改列表 A 的值并将其再次添加到列表 B,但不更改已存储在列表 B 中的值。
更新:感谢所有的回答。我发现的最干净的解决方案是这个: if ( k(Arrays.asList(new LinkedList<>())); 我有一个递归方法,可以从列表中生成所有“n 选 k”组合。
在我的 Java 应用程序中,以下两个都将编译和运行,并产生所需的结果。 //"Rotate" the list items one place to the left. myLinkedList.a
我写了一个LinkedList接受 Nodes 的类存储 Integers . 然后我创建了一个 LinkedList stack = new LinkedList() ,并添加了 Node s 如果
这个问题在这里已经有了答案: What does it mean to "program to an interface"? (33 个答案) 关闭 9 年前。 新手 Java 问题: 谁能解释一下
我有一个问题。我无法并排输出我的 LinkedList。我问了这个问题,但遗憾的是我的老师告诉我不要更改方法头或使用 java 库(如日历)。我得到了很多关于使用它或更改方法头的建议。我是根据年级而定
这里有什么问题?。我正在尝试使用邻接列表,通过利用 util 包中的集合来实现图形数据结构。这里 LinkedList array which holds some integer. Each ele
这个问题已经有答案了: Reversing a linked list in Java, recursively (33 个回答) 已关闭10 年前。 如何使用 linkedList 类中的方法以相反
我需要实现一个 LinkedList,到目前为止,我已经编写了在列表中按顺序插入值的方法。我有我的节点 front 作为我的类的实例数据,当创建我的第一个值并尝试将 front 的 next 值设置为
目前,我的 LinkedList(不是 Java 的)类中有一个方法,可以将单个节点添加到 LinkedList 中,如下所示: public void add(int index, T v) {
我正在编写一个读取 XML 文件的类,该 XML 使用“sax”类进行解析。在我的 XML 文件中,我创建了“for”标签和“宏”,使 for 循环能够写入 XML,例如: Th
我正在处理一个 C++ 作业,我将在一个链表的链表上创建一个搜索引擎。根据要求,我不能使用其他库和 STL。 基本上它会是这样的(我从小列表中删除了变量,因为它们是不相关的): 我的结构是这些: st
老实说,我现在真的很困惑这个问题,并且真的不知道如何解决这个问题。我需要编写一个方法,其中给定一个字符链接列表(例如:{'a','A','d','X'})并返回仅包含大写字符的列表(返回:{'A','
我正在尝试获取可执行文件中的两个链表,并在交替位置将它们合并到一起。前任。 ListOne 1,2,3 和 ListTwo 4,5 新的 ListOne 应该是 1,4,2,5,3。 链表.h文件:
这个问题在这里已经有了答案: Is List a subclass of List? Why are Java generics not implicitly polymorphic? (19 个回答
在尝试了解如何将哈希表插入LinkedLists时,我遇到了麻烦。我失去了尝试过的不同事物的数量。我知道我可以使用ArrayList或其他东西,但是我想使它与LinkedLists一起工作,以便可以对
我一直在尝试编写一种方法,不仅可以从 LinkedList(allUsers) 中删除对象(User),还可以从所有用户拥有的单个 LinkedList 中删除。谁能向我解释为什么这是错误的?我已经包
我有一个列表结构和一个名为树的递归函数。在下面的代码中,它永远不会到达 current == null 语句,因此它将永远运行。 如果我无法使用null,解决方案是什么? private void t
这个问题在这里已经有了答案: How does one add a LinkedList to a LinkedList in C#? (3 个答案) 关闭 9 年前。 假设我有以下内容: Link
我正在尝试为 LinkedList 创建一个反向 ListIterator,并且打算将其实现为 linkedList.listIterator(linkedList. size()) 交换了 next
我是一名优秀的程序员,十分优秀!