如何在java中获取动画/图像对象的每个像素的颜色?

时间:2018-06-08 04:20:55

标签: java image lwjgl slick2d pacman

为我的12年级计算机科学课开展吃豆人游戏。

我有game.java文件通过main方法运行代码,而我有一个运行实际游戏的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将重叠的像素的未来位置以及该像素的颜色。如果像素的未来颜色不是黑色,那么我将不允许吃豆人继续向那个方向移动。

如何计算未来像素的颜色?有些人可能会建议使用BufferedImage,因为它有getRGB()方法,但这不起作用,因为maze是图像对象,而不是文件对象,所以我不能使用{ {1}}。

1 个答案:

答案 0 :(得分:0)

基于行

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

在您的代码中,迷宫存储在一个文件中。因此,您可以从中创建BufferedImage对象。您应该将该行更改为

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

确保将迷宫定义为BufferedImage

BufferedImage maze;

由于BufferedImageImage的子类,因此您可以像以前一样使用它。您并不需要重新定义迷宫,但如果您这样做,则可以使用您提到的getRGB()命令之一。