如何在 java 中删除(并重生)一个项目(硬币)。 (使用控制器 class 进行生成)
How to delete (and respawn) an item (coin) in java. (Using Controller class for spawning)
我是使用 Java 的初级程序员。我正在制作我的第一个简单游戏。我需要硬币(我的 Controller class 中的 LinkedList 项目)在它们被拾起后被删除,更好的是当它们可以在另一个地方再次产生时(我正在使用这个:
Random randomGenerator = new Random();
for (int idx = 1; idx <= 1; ++idx){
int r1 = randomGenerator.nextInt(590);
this.r1=r1;
}
for (int idx = 1; idx <= 1; ++idx){
int r2 = randomGenerator.nextInt(380);
this.r2=r2;
设置我的 "coin" 一个随机的 x 和 y 变量)。
在那个随机位置生成它们时,我已经做对了所有事情,而且我还在我的 Player class 中创建了一个 Collision() 方法。看起来像这样:
private void Collision(){
for(int i = 0; i < c.size(); i++){
if(getBounds().intersects(c.get(i).getBounds())){
Game.points++;
}
}
}
这些点数工作正常(有点),但我只能弄清楚如何在它 "picked up" 之后移除硬币。当然,我的 Controller class:
中有一个 add 和 removeItem 方法
public void removeItem(Coin coin){
c.remove(coin);
}
public void addItem(Coin coin){
c.add(coin);
}
控制器的构造函数中调用了addItem...
我知道它有点长,但我想让一切都清楚。如果有人帮助我,我会非常高兴,因为没有帮助,游戏就毫无意义。
感谢所有帮助我的人,如果您需要更多信息,请直接说。
编辑:
这是我的代码:
private void Collision(){
int newCount = 0;
while(iter.hasNext()){
iter.next();
for(int i=0; i<cb.size(); i++){
if(getBounds().intersects(cb.get(i).getBounds())){
Game.points++;
newCount++;
iter.remove();
}
}
}
for(int i = 0; i < newCount; i++){
controller.addItem(new Coin());
newCount--;
}
}
我在控制器中声明了一个迭代器:
static Iterator<Coin> iter = c.iterator();
和一个 getter 函数,所以我可以在我的播放器中使用它 class:
public static Iterator<Coin> getCoinIterator(){
return iter;
}
然后在此处获取从控制器到播放器的迭代器 class
private Iterator<Coin> iter = Controller.getCoinIterator();
我什至在控制器中创建了 next() 和 hasNext() 方法,但我仍然遇到一堆错误。
首先,我不建议您在另一个地方再次添加相同的硬币对象,而是将其移除然后添加一个新的。我不确定你是否已经这样做了,因为你的代码不完整。
编辑:
在 Coins Constructor 中,您必须随机设置其位置,以便 Coin coin = new Coin
创建一个已经设置其位置的硬币。
或者,您可以在每个硬币上调用控制器的位置随机化器方法。
要使其正常工作,您必须添加
private int x, y;
到你的硬币 class 并在构造函数中将它们设置为随机值。这样你就不需要在其他任何地方随机化它。只需用新硬币创建一个硬币对象,它就有自己的位置。
编辑结束
在删除硬币时,我会使用这样的迭代器循环(假设 c 是您的列表)
int newCount = 0;
while(iter.hasNext()){
Coin coin = iter.next();
if(getBounds().intersects(coin.getBounds())){
Game.Points++;
newCount++
iter.remove();
}
}
for(int i = 0; i < newCount; i++){
c.add(new Coin());
}
这种循环的优点是,您可以毫无风险地删除列表中的对象,并且相当容易理解。我在这里使用 newCount 来计算有多少硬币被移除并且必须再次添加。为此,Coin 的构造函数必须随机设置其位置。
编辑:
迭代器用于按顺序获取任何集合或列表的所有元素。当对其调用 next() 时,它会转到列表中的下一个对象并 returns 它。 hasNext() returns 如果 Iterator 还剩下 Elements,或者它已经到达终点。而 remove() 删除当前元素,也就是 next() 返回的最后一个元素。
在迭代器循环中,您检查是否还有剩余的元素,只要是,您就会获得下一个元素,检查它是否与玩家发生碰撞,以及它是否会做某事。
在我们的例子中,这个 Something 是删除那个硬币实例并创建一个新的。
编辑结束
我想指出的另一件事是,LinkedLists 不太适合这个目的,我宁愿使用 ArrayLists,因为它们更快并且具有随机访问,这意味着任何 get 或添加调用不依赖于索引。但在你的小游戏中,这没什么大不了的。
希望对您有所帮助。
如果我在解释您的代码时犯了一些错误,请指正。
请原谅打字错误,我在 phone
上输入了编辑
我是使用 Java 的初级程序员。我正在制作我的第一个简单游戏。我需要硬币(我的 Controller class 中的 LinkedList 项目)在它们被拾起后被删除,更好的是当它们可以在另一个地方再次产生时(我正在使用这个:
Random randomGenerator = new Random();
for (int idx = 1; idx <= 1; ++idx){
int r1 = randomGenerator.nextInt(590);
this.r1=r1;
}
for (int idx = 1; idx <= 1; ++idx){
int r2 = randomGenerator.nextInt(380);
this.r2=r2;
设置我的 "coin" 一个随机的 x 和 y 变量)。 在那个随机位置生成它们时,我已经做对了所有事情,而且我还在我的 Player class 中创建了一个 Collision() 方法。看起来像这样:
private void Collision(){
for(int i = 0; i < c.size(); i++){
if(getBounds().intersects(c.get(i).getBounds())){
Game.points++;
}
}
}
这些点数工作正常(有点),但我只能弄清楚如何在它 "picked up" 之后移除硬币。当然,我的 Controller class:
中有一个 add 和 removeItem 方法 public void removeItem(Coin coin){
c.remove(coin);
}
public void addItem(Coin coin){
c.add(coin);
}
控制器的构造函数中调用了addItem... 我知道它有点长,但我想让一切都清楚。如果有人帮助我,我会非常高兴,因为没有帮助,游戏就毫无意义。 感谢所有帮助我的人,如果您需要更多信息,请直接说。
编辑: 这是我的代码:
private void Collision(){
int newCount = 0;
while(iter.hasNext()){
iter.next();
for(int i=0; i<cb.size(); i++){
if(getBounds().intersects(cb.get(i).getBounds())){
Game.points++;
newCount++;
iter.remove();
}
}
}
for(int i = 0; i < newCount; i++){
controller.addItem(new Coin());
newCount--;
}
}
我在控制器中声明了一个迭代器:
static Iterator<Coin> iter = c.iterator();
和一个 getter 函数,所以我可以在我的播放器中使用它 class:
public static Iterator<Coin> getCoinIterator(){
return iter;
}
然后在此处获取从控制器到播放器的迭代器 class
private Iterator<Coin> iter = Controller.getCoinIterator();
我什至在控制器中创建了 next() 和 hasNext() 方法,但我仍然遇到一堆错误。
首先,我不建议您在另一个地方再次添加相同的硬币对象,而是将其移除然后添加一个新的。我不确定你是否已经这样做了,因为你的代码不完整。
编辑:
在 Coins Constructor 中,您必须随机设置其位置,以便 Coin coin = new Coin
创建一个已经设置其位置的硬币。
或者,您可以在每个硬币上调用控制器的位置随机化器方法。
要使其正常工作,您必须添加
private int x, y;
到你的硬币 class 并在构造函数中将它们设置为随机值。这样你就不需要在其他任何地方随机化它。只需用新硬币创建一个硬币对象,它就有自己的位置。 编辑结束
在删除硬币时,我会使用这样的迭代器循环(假设 c 是您的列表)
int newCount = 0;
while(iter.hasNext()){
Coin coin = iter.next();
if(getBounds().intersects(coin.getBounds())){
Game.Points++;
newCount++
iter.remove();
}
}
for(int i = 0; i < newCount; i++){
c.add(new Coin());
}
这种循环的优点是,您可以毫无风险地删除列表中的对象,并且相当容易理解。我在这里使用 newCount 来计算有多少硬币被移除并且必须再次添加。为此,Coin 的构造函数必须随机设置其位置。
编辑: 迭代器用于按顺序获取任何集合或列表的所有元素。当对其调用 next() 时,它会转到列表中的下一个对象并 returns 它。 hasNext() returns 如果 Iterator 还剩下 Elements,或者它已经到达终点。而 remove() 删除当前元素,也就是 next() 返回的最后一个元素。
在迭代器循环中,您检查是否还有剩余的元素,只要是,您就会获得下一个元素,检查它是否与玩家发生碰撞,以及它是否会做某事。 在我们的例子中,这个 Something 是删除那个硬币实例并创建一个新的。 编辑结束
我想指出的另一件事是,LinkedLists 不太适合这个目的,我宁愿使用 ArrayLists,因为它们更快并且具有随机访问,这意味着任何 get 或添加调用不依赖于索引。但在你的小游戏中,这没什么大不了的。
希望对您有所帮助。
如果我在解释您的代码时犯了一些错误,请指正。
请原谅打字错误,我在 phone
上输入了编辑