2016-04-06 25 views
0

對,我正在開發一個新的2d /自上而下的Java遊戲。最近,我一直在教自己如何在Java中編碼,但我確實有一個問題...我的窗口中有一個框,我可以用W,A,S和D鍵移動。我想知道的是如何用圖像替換黑盒子(後來擔心動畫)。這裏是我的代碼(順便說一句,這個代碼也是遊戲引擎)。 另外這裏是我想要添加的圖像Player image如何將「播放器圖像」添加到Java中?

如果任何人都可以幫助我,將不勝感激。謝謝。

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); 
} 
} 
+0

一般來說,不要用swing來編碼遊戲 – Natecat

+0

這已被詢問1000次im確定womeone會回答它爲什麼不繼續通過四處尋找答案來教育自己? – gpasch

+0

我想如何知道有人問過這個1000? – ZOulhadj

回答

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); 
    } 
} 
+0

嗯...由於某種原因ImageIO.read(getClass()。getResource(「imagepath」));我得到一個紅線表示未處理的異常類型IOException。 – ZOulhadj

+0

您可以將分配部件移動到構造函數中,並使用try catch塊將其包圍起來 –

+0

檢查我的新代碼。 –

0

在你MyScreen類,你在你的onDraw方法如下幾行:

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

​​是用於在屏幕上繪製對象2DGraphics對象。在上面的行中,您正在創建一個邊長相等的黑色矩形(一個正方形)。

如果你想,而不是創建一個圖像,只需用下面的代碼替換這兩條線:

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

Image img是圖像對象,你會喜歡畫畫。圖像本身必須是72x72像素才能保持與原始黑色方塊相同的尺寸。

  • 要導入你想要的圖像,使用new ImageIcon("path/to/img.png").getImage()

int xint y只是目的地的座標。

ImageObserver observer對您而言太深入了。您可以將其設置爲null。你可以閱讀更多關於它here

我從Oracle's documentation得到的所有這些信息。在提問之前下次給他們的文檔進行搜索,你會發現幾乎所有你遇到的問題都被廣泛覆蓋了!此外,這個問題已被多次詢問,因此使用谷歌搜索stackoverflow paint image java應該給你一些快速的答案。

相關問題