【问题标题】:Using buffered image to render a sprite使用缓冲图像渲染精灵
【发布时间】:2016-05-20 16:57:54
【问题描述】:

我正在尝试使用缓冲图像从精灵表渲染精灵,但我无法弄清楚为什么我的代码无法正常工作,即使我从类中调用图像?

代码:

package com.game.src.main;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Game extends Canvas implements Runnable {

    private BufferedImage spriteSheet = null;
    boolean sprite = false;
    private BufferedImage sprite;

    public void init(){
        BufferedImageLoader loader = new BufferedImageLoader();
        try{

            spriteSheet = loader.loadImage("/astronaut_sprite1.png");
        }catch(IOException e){
            e.printStackTrace();
        }
}

    private void render(){
        BufferStrategy bs = this.getBufferStrategy();
        if(bs == null){
            createBufferStrategy(3);
            return;

        }

        if(sprite == true){
            g.drawImage(sprite, 0, 0, getWidth(), getHeight(), this);
            System.out.println("True");
        }

        g.dispose();
        bs.show();
}

    public void keyPressed(KeyEvent e){
        int key = e.getKeyCode();

        if(key == KeyEvent.VK_1){
            sprite = true;
        }

}

    public static void main(String args[]){
        Game game = new Game();

    public BufferedImage getSpriteSheet(){
        return spriteSheet;
    }



}

我正在调用的类(精灵)是:

package com.game.src.main;

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

public class sprite{

    private double x;
    private double y;

    private BufferedImage sprite;

    public sprite(x, y, Game game){

        SpriteSheet ss = new SpriteSheet(game.getSpriteSheet());

        sprite = ss.grabImage(3, 3, 32, 32);
    }

缓冲图像加载器:

package com.game.src.main;

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

import javax.imageio.ImageIO;

public class BufferedImageLoader {

    private BufferedImage image;

    public BufferedImage loadImage(String path) throws IOException{

        image = ImageIO.read(getClass().getResourceAsStream(path));
        return image;

    }

}

【问题讨论】:

    标签: java eclipse image canvas boolean


    【解决方案1】:

    使用ImageIO.read(new File("/astronaut_sprite1.png")); 代替spriteSheet = loader.loadImage("/astronaut_sprite1.png");

    您的文件夹结构:

    -src
    --com
    ---m14x
    ----game
    -----BufferedImageLoader.java
    -----Game.java
    -----SpriteSheet.java
    -res
    ---sprite_sheet.png
    

    您的 BufferedImageLoader 类:

        public class BufferedImageLoader {
            private BufferedImage image;
    
            public BufferedImage loadImage(String path) throws IOException{
                System.out.println("PATH = " + path);
                File file = new File(path);
    
                if (file.exists()) {
                    // First, make sure the path exists
    System.out.println("File exists!");
    
                }
                if (file.isDirectory()) {
                    // This will tell you if it is a directory
     System.out.println("File is a directory!");
    
                }
                if (file.isFile()) {
                    // Similarly, this will tell you if it's a file
    System.out.println("File has a path!");
    
                }
                System.out.println("Trying to load image:");
                image = ImageIO.read(new File(path));
    
                //image = ImageIO.read(getClass().getResource(path));
    
                System.out.println("Image path found. Returning...");
                return image;
    
    
            }
    
        }
    

    【讨论】:

    • 检查我的更新。好吧,您没有提供 BufferedImageLoader 类的代码,但我知道 ImageIO.read 可以正常工作
    • 抱歉,我刚刚发布了 BufferedImageLoader 类,但在该类中我已经使用了 ImageIO.read。我的问题是,即使我确实使用它,我如何使用它从我的精灵表中调用我想要的精灵?
    • 由于您使用的是 getResourceAsStream(path) 而不是指定绝对图像路径,因此您必须确保您的资源文件夹位于正确的路径中,请再次查看我的更新答案。
    • 既然我现在使用 ImageIO.read 我应该替换 g.drawImage 因为它现在给我一个错误,询问我现在是否要创建一个类'g'
    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多