Tworzę grę ze zdjęciami kaktusów, ale kiedy robię mój kod, jeśli próbuje przełączać się między obrazami, zatrzymuje się i zawiesza się w tym momencie, w przeciwnym razie, jeśli nie działa, używam również buforowanego obrazu dla obrazów mojego kodu:

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

Nowa klasa

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

Jaki jest problem to kod od anamation managera i szczegóły z obrazka. Wypróbowałem wiele samouczków, ale żaden z nich nie działał poprawnie, zawsze nieznacznie odbiegał od celu losowego bool. Używam zaćmienia, więc nie otrzymuję żadnych błędów specyficznych dla miejsca, w którym występuje błąd. Użyłem też debuggera, ale nie działają. Więc naprawdę potrzebuję pomocy twoich ludzi.

1
kajvans 2 kwiecień 2020, 12:30

3 odpowiedzi

Najlepsza odpowiedź

Czyste podejście jest następujące:

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

Uwaga: random.nextInt(3) zwraca int od 0 do 2, tj. 0 lub 1 lub 2.

0
Arvind Kumar Avinash 2 kwiecień 2020, 15:22

Istnieje kilka powodów, dla których możesz napotkać problemy, z których głównym jest fakt, że wielokrotnie nazywasz się Random.nextBoolean (). Kiedy to robisz, za każdym razem daje ci to nową wartość. Chciałbyś ustawić zmienną równą Random.nextBoolean ().

Ponadto, ponieważ wydaje się, że wybierasz między trzema różnymi obrazami, a nie dwoma. W tym celu polecam zamiast tego użyć 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;
}
0
Noah Cagle 2 kwiecień 2020, 09:42

Problem w tym, że tam były 2 pliki o nazwie cactus3.png i też było o jedno miejsce za dużo. dzięki za myślenie ze mną.

0
kajvans 4 kwiecień 2020, 17:13