2017-04-16 8 views
1

私はJavaを使い慣れていないので、簡単なゲームを楽しくしようとしています。 最初にpaintComponent()に再描画を試みましたが、背景を追加しようとするまで機能しました。 プレイヤーに「再ペイント」の有無に関わらず移動させる方法を知っている人はいますか?Java 2Dのゲームでプレイヤーのスプライトが移動しない(再ペイント)

Screenクラス

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クラス

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

} 

プレーヤークラス

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; 
     } 

    } 
} 

答えて

1

あなたはuのです新しいFrameオブジェクトをKeyListenerとして必ず作成し、KeyListenerイベントはすべて、表示されているものではなく、別のFrameインスタンスに移動します。今のKeyListenerは、関心の真の表示フレームインスタンスを駆動するようにするため

:に

frame.addKeyListener(new Frame()); 

を変更します。


その他の問題、これは良いではありません。

catch (Exception e){} 

は必ず特定例外をキャッチし、ほとんど常に、あなたはそれらを処理する必要があります。あなたが

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

に変更し、おかげでたくさん! 問題が分かっていれば、これはとても分かりました。 XD チップをありがとう、私はexeptionを変更します。 – SynthWeaver

0

:リスナーとして現在のフレームを追加するのではなく、新しいフレームを作成します

frame.addKeyListener(new Frame()); 

少なくとも、このような何かを行います。

ですから、WOW

frame.addKeyListener(frame); 
関連する問題