マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

シューティング作成を目指して(2) 〜とりあえず移動編〜

前回画像表示したから今回はそれをキーボードで動かす。Component#setFocusableでtrue設定しておかないと、フォーカスがこないのでキーボードに反応してくれないので設定。あとはキーボードイベントだけ追加。今はコンポーネントがキャラクターの画像と座標を管理してるので、キャラクター用のクラスをそのうち作る。

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

import java.io.File;
import java.io.IOException;

public class Glenda extends JComponent implements KeyListener{
   private static final int MOVE_DISTANCE = 4;

   private BufferedImage glendaImage;
   private int gx;
   private int gy;

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                Glenda.start();
            }
        });
    }

    private static void start(){
        try{
            JFrame frame = new JFrame("Glenda");

            Glenda glenda = new Glenda();
            glenda.loadGlendaImage("./glenda_32.png");

            glenda.setPreferredSize(new Dimension(600, 500));
            frame.add(glenda);

            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }catch(IOException e){
            String message = "Glendaを読み込めませんでした";
            String title = "エラー";
            JLabel label = new JLabel(message);
            label.setForeground(Color.RED);

            JOptionPane.showMessageDialog(null, label, title, JOptionPane.ERROR_MESSAGE);
        }
    }

    public Glenda(){
        gx = 0;
        gy = 0;

        setFocusable(true);
        addKeyListener(this);
    }

    public void loadGlendaImage(String fileName) throws IOException{
        glendaImage = ImageIO.read(new File(fileName));
    }

    @Override
    protected void paintComponent(Graphics g){
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, getWidth(), getHeight());

        g.drawImage(glendaImage, gx, gy, null);
    }

    public void glendaMove(int dx, int dy){
        gx += dx;
        gy += dy;

        repaint();
    }

    public void keyPressed(KeyEvent e){

        switch(e.getKeyCode()){
            case KeyEvent.VK_UP:
                glendaMove(0, -Glenda.MOVE_DISTANCE);
                break;

            case KeyEvent.VK_DOWN:
                glendaMove(0, Glenda.MOVE_DISTANCE);
                break;

            case KeyEvent.VK_RIGHT:
                glendaMove(Glenda.MOVE_DISTANCE, 0);
                break;

            case KeyEvent.VK_LEFT:
                glendaMove(-Glenda.MOVE_DISTANCE, 0);
                break;

            default:
                break;
        }
    }

    public void keyReleased(KeyEvent e){}
    public void keyTyped(KeyEvent e){}
}