2017-04-16 5 views
1

Ich bin neu in Java und ich versuche, ein einfaches Spiel zum Spaß zu machen. Ich habe zuerst versucht, repaint in paintComponent() zu setzen, es funktionierte, bis ich versuchte, etwas Hintergrund hinzuzufügen. Kann jemand meinen Spieler bewegen mit oder ohne 'repaint'?Player Sprite wird nicht in Java bewegen 2D-Spiel (Repaint)

Screen-Klasse

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

class Frame extends JFrame implements KeyListener 
{ 
Map map; 

public static void main(String[] args) 
{ 
    Frame frame = new Frame(); 
    frame.addKeyListener(new Frame()); 
    frame.setVisible(true); 
} 

public Frame() 
{ 
    setInit(); 
} 

private void setInit() 
{ 
    map = new Map(); 
    add(map); 

    setSize(800, 800);//frame size 300 width and 300 height 
    setTitle("Eerste Game"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 

    setResizable(false); 
    setLayout(new GridLayout(1,1,0,0)); 
    setFocusable(true); 
    setVisible(true); 
} 

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

    map.movePlayer(keyCode); 
} 

public void keyReleased(KeyEvent e) 
{ 

} 

public void keyTyped(KeyEvent e) 
{ 

} 
} 

Map-Klasse

import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 

class Map extends JPanel 
{ 
    Player player; 
    BufferedImage map; 

    public Map() { 
     player = new Player(); 
     try{map = ImageIO.read(new File("img/map.png"));}catch (Exception e){}; 
    } 

    public void movePlayer(int keyPressed) 
    { 
     player.move(keyPressed); 
     revalidate(); 
     repaint(); 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.drawImage(player.img,player.getX(),player.getY(), null); 
    } 

} 

Spielerklasse

import java.awt.event.KeyEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 

class Player 
{ 
    BufferedImage img = null; 
    private int x = 100; 
    private int y = 100; 

    public Player() 
    { 
     try{img = ImageIO.read(new File("img/bob.png"));}catch (Exception e){} 
    } 

    public int getX() 
    { 
     return x; 
    } 

    public int getY() 
    { 
     return y; 
    } 

    public void move(int keyPressed) 
    { 
     if(keyPressed == KeyEvent.VK_W) { 
      // handle up 
      y = y - 5; 
     } 
     if (keyPressed == KeyEvent.VK_A) { 
      // handle links 
      x = x - 5; 
     } 
     if (keyPressed == KeyEvent.VK_S) { 
      // handle onder 
      y = y + 5; 
     } 
     if (keyPressed == KeyEvent.VK_D) { 
      // handle right 
      x = x + 5; 
     } 

    } 
} 

Antwort

1

Sie sind u Sie müssen ein neues Frame-Objekt als KeyListener erstellen, und die KeyListener-Ereignisse werden alle an eine andere Frame-Instanz gesendet, nicht an die angezeigte Frame-Instanz. Ändern

frame.addKeyListener(new Frame()); 

zu:

Damit nun die KeyListener die wahre angezeigt Frame-Instanz von Interesse antreibt.


Andere Probleme, das ist nicht gut:

catch (Exception e){} 

immer spezifische Ausnahmen abfangen und fast immer, sollten Sie mit ihnen umgehen. Wenigstens etwas tun, wie folgt aus:

catch (IOException e) { 
    e.printStacktrace(); 
} 
+0

WOW, vielen Dank! Das war so offensichtlich, wenn Sie das Problem kennen. XD Danke für den Tipp, ich werde die Ausnahme ändern. – SynthWeaver

0

Sie tun:

frame.addKeyListener(new Frame()); 

, die einen neuen Rahmen schafft stattdessen den aktuellen Frame als Listener hinzuzufügen.

So ändern Sie es

frame.addKeyListener(frame);