Эльсиф с NextBoolean для фотографий - PullRequest
0 голосов
/ 02 апреля 2020

Я делаю игру с изображениями кактусов, но когда я делаю свой код, если он пытается переключиться между изображениями, он останавливается и останавливается на этом месте, в противном случае, если он не работает, я также использую 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;
    }
}

новый класс

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);
    }
}

в чем проблема, это код от менеджера анамации и подробности с картинки

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Чистый подход заключается в следующем:

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) возвращает int от 0 до 2, то есть либо 0, либо 1, либо 2.

0 голосов
/ 04 апреля 2020

проблема в том, что там, где 2 файла называются cactus3.png, а также есть один пробел для многих. спасибо, что подумал со мной.

0 голосов
/ 02 апреля 2020

Есть несколько причин, по которым вы можете столкнуться с проблемами, главной из которых является тот факт, что вы вызываете 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;
}
...