Как получить цвет каждого пикселя объекта анимации / изображения в Java? - PullRequest
0 голосов
/ 08 июня 2018

Работа над Pac-man игрой для моего класса по информатике 12 класса.

У меня есть game.java файл, который запускает код через основной метод, в то время как у меня есть Play.java файл, который запускаетФактическая игра.

Это то, что находится внутри Play.java файла:

package javagame;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.lwjgl.input.Mouse;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

//extends BasicGameState creates a basic computer screen
public class Play extends BasicGameState {
    float pacmanPosX = 218;
    float pacmanPosY = 400;

    BufferedImage maze;

    private SpriteSheet[] pacmanSprite = new SpriteSheet[4];
    private Animation[] pacmanAnimation = new Animation[4];

    private Animation pacman;

    private int score = 0;

    public Play(int state) {

    }

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
        try {
            maze = ImageIO.read(new File("res/Game/Maze.png"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        pacmanSprite[0] = new SpriteSheet("res/Characters/Left-Direction.png", 19, 20);
        pacmanAnimation[0] = new Animation(pacmanSprite[0], 150);

        pacmanSprite[1] = new SpriteSheet("res/Characters/Right-Direction.png", 19, 20);
        pacmanAnimation[1] = new Animation(pacmanSprite[1], 150);

        pacmanSprite[2] = new SpriteSheet("res/Characters/Up-Direction.png", 19, 20);
        pacmanAnimation[2] = new Animation(pacmanSprite[2], 150);

        pacmanSprite[3] = new SpriteSheet("res/Characters/Down-Direction.png", 19, 20);
        pacmanAnimation[3] = new Animation(pacmanSprite[3], 150);

        pacman = pacmanAnimation[0];
    }

    // This is the method that draws stuff on the screen
    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {
        g.drawString("HIGH SCORE: ", 0, 0);
        g.drawString("SCORE: ", 356, 0);

        ((Renderable) maze).draw(5, 35);
        pacman.draw(pacmanPosX, pacmanPosY);
    }

    // Updating the images on the screen
    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {
        pacman.update(delta);

        Input input = gc.getInput();

        if(input.isKeyDown(Input.KEY_UP)) {
            pacman = pacmanAnimation[2];
            pacmanPosY -= delta * .1f;
        } else if(input.isKeyDown(Input.KEY_DOWN)) {
            pacman = pacmanAnimation[3];
            pacmanPosY += delta * .1f;
        } else if(input.isKeyDown(Input.KEY_LEFT)) {
            pacman = pacmanAnimation[0];
            pacmanPosX -= delta * .1f;
        } else if(input.isKeyDown(Input.KEY_RIGHT)) {
            pacman = pacmanAnimation[1];
            pacmanPosX += delta * .1f;
        }

    }

    public int getID() {
        return 1;
    }
}

Это мой план, чтобы Pac-man не перекрывал лабиринт.Что я планирую сделать, так это выяснить, в каком будущем пиксель Pac-man будет перекрываться и какого цвета будет этот пиксель.Если будущий цвет пикселя не черный, то я не позволю Pac-man продолжить движение в этом направлении.

Как мне определить цвет будущего пикселя?Некоторые из вас могут предложить использовать BufferedImage, так как он имеет метод getRGB(), но это не сработает, потому что maze - это объект изображения, а не объект файла, поэтому я не могу использовать BufferedImage.

1 Ответ

0 голосов
/ 08 июня 2018

Исходя из строки

maze = new Image("res/Game/Maze.png");

в вашем коде, лабиринт сохраняется в файле.Поэтому вы можете создать объект BufferedImage из него.Вам следует изменить эту строку на

try {
    maze = ImageIO.read(new File("res/Game/Maze.png"));
} catch (IOException e) {
}

. Убедитесь, что вы определили лабиринт как BufferedImage!

BufferedImage maze;

, а поскольку BufferedImage является подклассом Image, выможете использовать его так же, как раньше.На самом деле вам не нужно переопределять лабиринт, но если вы это сделаете, то можете использовать одну из упомянутых вами команд getRGB().

...