带有 nextboolean 的 elsif 用于图片

elsif with nextboolean for pictures

我正在用仙人掌图片制作游戏,但是当我执行我的代码时,如果它试图在图片之间切换,它将停止并冻结在那个点上,否则如果它不起作用我也使用 bufferedimage 作为图片 我的代码:

   package objectgame;

import java.awt.Graphics; 
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import util.Resource;

public class EnemiesManager {
    private List<Enemy> enemies;
    private Random random;
    
    private BufferedImage imagecactus1, imagecactus2, imagecactus3 ;
    
    public EnemiesManager() {
        enemies = new ArrayList<Enemy>();
        imagecactus1 = Resource.getResourceImage("data/cactus1.png");
        imagecactus2 = Resource.getResourceImage("data/cactus2.png");
        imagecactus3 = Resource.getResourceImage("data/cactus3.png");
        random = new Random();
        
        enemies.add(getRandomCactus());
        random = new Random();
    }
    
    public void update() {
        for(Enemy e: enemies) {
            e.update();
        }
        Enemy firstEnemy = enemies.get(0);
        if(firstEnemy.isOutOfScreen()) {
            enemies.remove(firstEnemy);
            enemies.add(getRandomCactus());
        }
    }
    
    public void draw(Graphics g) {
        for(Enemy e: enemies) {
            e.draw(g);
        }
    }
    private Cactus getRandomCactus() {
        Cactus cactus;
        cactus = new Cactus();
        cactus.setX(600);
        if(random.nextBoolean()) {
            cactus.setImage(imagecactus1);
        } 
        else{
            cactus.setImage(imagecactus2);
    }
        return cactus;
    }
}

新class

package objectgame;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;

import util.Resource;

public class Cactus extends Enemy{
    
    private BufferedImage image;
    private int posX, posY;
    private Rectangle rect;
    
    public Cactus() {
        image = Resource.getResourceImage("data/cactus1.png");
        posX = 200;
        posY = 83;
        rect = new Rectangle();
    }
    
    public void update() {
        posX -= 3;
        rect.x = posX;
        rect.y = posY;
        rect.width = image.getWidth();
        rect.height = image.getHeight();
    }
    @Override
    public Rectangle getBound() {
        return rect;
    }
    @Override
    public void draw(Graphics g) {
        g.drawImage(image, posX, posY, null);
    }
    
    public void setX(int x) {
        posX = x;
    }
    public void setY(int y) {
        posY = y;
    }
    public void setImage(BufferedImage images) {
        this.image = images;
    }
    @Override
    public boolean isOutOfScreen() {
        return (posX + image.getWidth() < 0);
    }
}

这是什么问题,这是动画管理器的代码和图片的细节。我已经尝试了很多教程,但是 none 正确的工作总是稍微偏离随机布尔的目的。我使用 eclipse,所以我不会收到任何特定于错误发生位置的错误。我也确实使用了调试器,但没有正常工作。所以我真的需要你们的帮助。

您可能 运行 遇到问题有几个原因,主要原因是您被多次调用 Random.nextBoolean()。当你这样做时,它每次都会给你一个新的价值。您希望设置一个等于 Random.nextBoolean() 的变量。

此外,由于您似乎是在三张不同的图片之间进行选择,而不是两张。为此,我建议您改用 Random.nextInt:

private Cactus getRandomCactus() {
Cactus cactus;
cactus = new Cactus();
int randomInt = random.nextInt(0, 3); // this only called random.nextInt once, and gives me a random number between 0 and 2
cactus.setX(600);
if(randomInt == 0) {
    cactus.setImage(imagecactus1);
} 
else if (randomInt == 1) {
    cactus.setImage(imagecactus2);
}
else {
    cactus.setImage(imagecactus3);
}
    return cactus;
}

一个干净的方法如下:

private Cactus getRandomCactus() {
    Cactus cactus = new Cactus();
    cactus.setX(600);
    BufferedImage [] images = {imagecactus1, imagecactus2, imagecactus3};
    cactus.setImage(images[random.nextInt(3)]);
    return cactus;
}

注: random.nextInt(3) returns 一个从 0 到 2 的 int,即 0 或 1 或 2。

问题是哪里有 2 个文件叫 cactus3.png,还有一个 space 太多了。谢谢你和我一起思考。