如何添加"播放器图像"进入Java?

时间:2016-04-06 20:25:46

标签: java image bufferedimage

是的,我正在开发一款新的2d /自上而下的Java游戏。最近,我一直在教自己如何使用Java进行编码,但是我确实遇到了一个问题...我的窗口中有一个框,我可以使用W,A,S和D键移动。我想知道的是如何用图像替换黑盒子(后来担心动画)。这是我的代码(顺便说一下,这段代码也是游戏引擎)。 此处还有我想要添加Player image

的图片

如果有人可以帮助我,我将不胜感激。谢谢。

Game.java

import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.*;

public class Game {

private final JFrame window = new JFrame();
private final ScreenFactory screenFactory;
private final GameThread gameThread;
private final KeyboardListener keyboardListener;
private final MousepadListener mousepadListener;

public Game(int windowX, int windowY, String title){
    window.setSize(windowX, windowY);
    window.setResizable(false);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setFocusable(true);
    window.setLocationRelativeTo(null);
    window.setTitle("2D Game");
    window.setVisible(true);
    screenFactory = new ScreenFactory(this);
    gameThread = new GameThread(this);
    keyboardListener = new KeyboardListener();
    mousepadListener = new MousepadListener();


    window.add(gameThread);
    window.addKeyListener(keyboardListener);
    window.addMouseListener(mousepadListener);

    new Thread(gameThread).start();

}

public MousepadListener getMousepadListener(){
    return mousepadListener;
}

public KeyboardListener getKeyboardListener(){
    return keyboardListener;
}


public ScreenFactory getScreenFactory(){
    return screenFactory;
}


public JFrame getWindow(){
    return window;
}

}

GameThread.java

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JPanel;

public class GameThread extends JPanel implements Runnable{

private final Game game;

public GameThread(Game game){
    this.game = game;
    setFocusable(true);
}

public void run() {
    while (true){
        try {
            if(game.getScreenFactory().getCurrentScreen() !=null)
                game.getScreenFactory().getCurrentScreen().onUpdate();
            Thread.sleep(10);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

public void paint (Graphics g){
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    if(game.getScreenFactory().getCurrentScreen() !=null)
        game.getScreenFactory().getCurrentScreen() .onDraw(g2d);
    repaint();
}

}

Screen.java

import java.awt.Graphics2D;

public abstract class Screen {

private final ScreenFactory screenFactory;

public Screen(ScreenFactory screenFactory ){
    this.screenFactory = screenFactory;
}

public abstract void onCreate();

public abstract void onUpdate();

public abstract void onDraw(Graphics2D g2d);

public ScreenFactory getScreenFactory(){
    return screenFactory;
}

}

ScreenFactory.java

public class ScreenFactory {

private final Game game;
private Screen screen;

public ScreenFactory(Game game){
    this.game = game;
}

public void showScreen(Screen screen){
    this.screen = screen;
    this.screen.onCreate(); 
}

public Screen getCurrentScreen(){
    return screen;
}

public Game getGame(){
    return game;
}

}

KeyboardListener

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyboardListener implements KeyListener {

private boolean[]keys = new boolean[256];

@Override
public void keyPressed(KeyEvent event) {
    keys[event.getKeyCode()] = true;
}

@Override
public void keyReleased(KeyEvent event) {
    keys[event.getKeyCode()] = false;
}

@Override
public void keyTyped(KeyEvent event) {

}

public boolean isKeyPressed(int key){
    return keys[key];
}

public boolean isKeyReleased(int key){
    return !keys[key];
}

}

MousepadListener.java

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MousepadListener implements MouseListener{

private int mouseX, mouseY;
private boolean clicked;

@Override
public void mouseClicked(MouseEvent event) {
    mouseX = event.getX();
    mouseY = event.getY();
    clicked = true;
}

@Override
public void mouseEntered(MouseEvent event) {

}

@Override
public void mouseExited(MouseEvent event) {

}

@Override
public void mousePressed(MouseEvent event) {
    mouseClicked(event);
    clicked = true;
}

@Override
public void mouseReleased(MouseEvent event) {
    clicked = false;
}

public boolean isMousePressed(){
    return clicked;
}

public int getX(){
    return mouseX; 
}

public int getY(){
    return mouseY;
}

}

TheGame

public class TheGame {

private Game game;

public TheGame(){
    game = new Game(1280, 720, "2D Game");
          game.getScreenFactory()
.showScreenMy(newScreen(game.getScreenFactory()));
}

public static void main(String[] args){ 
    new TheGame();
}
}

自选

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;

public class MyScreen extends Screen{

private int x = 0, y = 0;

public MyScreen(ScreenFactory screenFactory){
    super(screenFactory);
}

@Override
public void onCreate() {
    System.out.println("Creating!...");
}

@Override
public void onUpdate() {
if (getScreenFactory()
.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_A))   
    x -= 2;

if (getScreenFactory()
.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_D))   
    x += 2;

if (getScreenFactory()
.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_W))   
    y -= 2;

if    (getScreenFactory()
.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_S))   
    y += 2;

if (y >= 720 - 72)
    y = 720 - 72;
if (y <= 0)
    y = 0;
if (x >= 1280 - 72)
    x = 1280 - 72;
if (x <= 0)
    x = 0;

}

@Override
public void onDraw(Graphics2D g2d) {
    g2d.setColor(Color.black);
    g2d.fillRect(x, y, 72, 72);
}
}

2 个答案:

答案 0 :(得分:2)

首先以BufferedImage的形式阅读您的图片。然后通过drawImage方法绘制它。试试这个:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class MyScreen extends Screen {

    private int x = 0, y = 0;

    private BufferedImage image;

    public MyScreen(ScreenFactory screenFactory) {
        super(screenFactory);

        try {
            image = ImageIO.read(getClass().getResource("imagepath"));
        } catch (IOException e) {
            // TODO: handle exception
        }

    }

    @Override
    public void onCreate() {
        System.out.println("Creating!...");
    }

    @Override
    public void onUpdate() {
        if (getScreenFactory().getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_A))
            x -= 2;

        if (getScreenFactory().getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_D))
            x += 2;

        if (getScreenFactory().getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_W))
            y -= 2;

        if (getScreenFactory().getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_S))
            y += 2;

        if (y >= 720 - 72)
            y = 720 - 72;
        if (y <= 0)
            y = 0;
        if (x >= 1280 - 72)
            x = 1280 - 72;
        if (x <= 0)
            x = 0;

    }

    @Override
    public void onDraw(Graphics2D g2d) {
        g2d.setColor(Color.black);
        g2d.fillRect(x, y, 72, 72);
        g2d.drawImage(image, x, y, null);
    }
}

答案 1 :(得分:0)

MyScreen课程中,onDraw方法中包含以下几行:

g2d.setColor(Color.black);
g2d.fillRect(x, y, 72, 72);

g2d是一个2DGraphics对象,用于在屏幕上绘制对象。在上面的一行中,您将创建一个边长相等的黑色矩形(正方形)。

如果您想要创建图像,只需使用以下内容替换这两行:

g2d.drawImage(Image img, int x, int y, ImageObserver observer);

Image img是您想要绘制的Image对象。图像本身必须是72 x 72像素,以保持与原始黑色方块相同的大小。

  • 要导入所需的图像,请使用new ImageIcon("path/to/img.png").getImage()

int xint y只是目的地的坐标。

ImageObserver observer对您的目的来说太深入了。您可以将其设置为null。您可以阅读更多相关信息here

我从Oracle's documentation得到的所有这些信息。在下次询问之前给他们的文档进行搜索,您会发现几乎任何您遇到问题的内容都被广泛覆盖!此外,这个问题已被多次询问,因此谷歌搜索stackoverflow paint image java应该给你一些快速的答案。