如何将 "Player image" 添加到 Java 中?
How can i add a "Player image" into Java?
好的,我正在开发一款新的 2d/top down Java 游戏。最近,我一直在自学如何在 Java 中编码,但是我确实遇到了一个问题...我的 window 中有一个盒子,我可以使用 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;
}
}
键盘监听器
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);
}
}
首先将您的图片解读为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);
}
}
在您的 MyScreen
class 中,您的 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
是您要绘制的图像对象。图片本身必须为 72 x 72 像素才能保持与原始黑色方块相同的大小。
- 要导入你想要的图片,使用
new ImageIcon("path/to/img.png").getImage()
int x
和int y
只是目的地的坐标。
ImageObserver observer
对于您的目的来说太深入了。您可以将其设置为 null
。您可以阅读更多相关信息 here.
所有这些信息都是我从 Oracle's documentation 获得的。下次询问之前先搜索一下他们的文档,您会发现几乎所有您遇到的问题都被广泛涵盖了!另外,这个问题已经被问过很多次了,所以谷歌搜索 Whosebug paint image java
应该会给你一些快速的答案。
好的,我正在开发一款新的 2d/top down Java 游戏。最近,我一直在自学如何在 Java 中编码,但是我确实遇到了一个问题...我的 window 中有一个盒子,我可以使用 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;
}
}
键盘监听器
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);
}
}
首先将您的图片解读为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);
}
}
在您的 MyScreen
class 中,您的 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
是您要绘制的图像对象。图片本身必须为 72 x 72 像素才能保持与原始黑色方块相同的大小。
- 要导入你想要的图片,使用
new ImageIcon("path/to/img.png").getImage()
int x
和int y
只是目的地的坐标。
ImageObserver observer
对于您的目的来说太深入了。您可以将其设置为 null
。您可以阅读更多相关信息 here.
所有这些信息都是我从 Oracle's documentation 获得的。下次询问之前先搜索一下他们的文档,您会发现几乎所有您遇到的问题都被广泛涵盖了!另外,这个问题已经被问过很多次了,所以谷歌搜索 Whosebug paint image java
应该会给你一些快速的答案。