今からはじめるプログラミング52(WASDで移動)

昔つくったRPGっぽいサンプルプログラムは、

画面にボタンをつけて、そのボタンで、東西南北にキャラクターが移動(実際はマップが移動?シフト?)するみたいな実装だったんですが、

今からはじめるプログラミング10 - yo2an’s blog

から

今からはじめるプログラミング19 - yo2an’s blog

 

最近のはやり?というかPCではデフォになっている

「Wで前へ」

「Aで左へ」

「Sで後ろへ」

「Dで右へ」

というキーの移動を実装してみた。ついでにマップの情報もファイルから取得するようにしてみたので、参考になるかも?

ただリスナーの関係で、からのメソッドがいくつか入ってしまい、行数が無駄に多くなるのが微妙です。

あとキーのコードを生で描いているので、定数にするとか、いろいろあると思いますが。。。こんな感じです。

あとマップの情報となる

map.txt

ファイルは、カンマ区切りのテキストファイル(CSV)です。

 

Map

-------------------------------------------------------------

package sample31;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JFrame;
import javax.swing.JTable;

public class Map extends JFrame implements KeyListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public int map_x = 0;
    public int map_y = 0;
    ArrayList<String> lineList = null;
    String
mapDat = null;

    private JTable table;

    public Map() {
        init();
    }

    private void init() {
        Container cont = this.getContentPane();
        readMap();
        setMap();
        initTable();
        cont.setLayout(new BorderLayout());
        cont.add(table, BorderLayout.CENTER);
        table.addKeyListener(this);
        this.setSize(480, 600);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void setMap() {
        mapDat = new String[map_x][map_y];
        for (int i = 0; i < lineList.size(); i++) {
            String line = lineList.get(i);
            for (int j = 0; j < line.length; j++) {
                mapDat[i][j] = line[j];
            }
        }
    }

    private void initTable() {

        table = new JTable(map_x, map_y);
        for (int i = 0; i < map_x; i++) {
            for (int j = 0; j < map_y; j++) {
                table.setValueAt(mapDat[i][j], i, j);
            }
        }

    }
    
    private void refreshTable() {
        for (int i = 0; i < map_x; i++) {
            for (int j = 0; j < map_y; j++) {
                table.setValueAt(mapDat[i][j], i, j);
            }
        }

    }

    private void readMap() {
        File file = new File("dungeon/map.txt");
        try {
            FileReader reader = new FileReader(file);
            BufferedReader bReader = new BufferedReader(reader);
            String bline = null;
            lineList = new ArrayList<String
>();
            while (bReader.ready()) {
                String lne = bReader.readLine();
                map_y++;
                System.out.println("lne=" + lne);
                StringTokenizer tokens = new StringTokenizer(lne, ",");
                map_x = tokens.countTokens();
                bline = new String[map_x];
                int idx = 0;
                while (tokens.hasMoreTokens()) {
                    bline[idx] = tokens.nextToken();
                    idx++;
                }
                lineList.add(bline);

            }
            bReader.close();
            reader.close();

        } catch (Exception exp) {
            exp.printStackTrace();
            System.out.println(exp);
        }
    }

    public static void main(String args) {
        new Map();
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        System.out.println(e.getKeyCode());
        if (65 == e.getKeyCode()) {
            // A
            System.out.println("a");
            String sv = new String[map_x];            
            for (int i = 0; i < map_x; i++) {

                int mapLimt = map_x - 1;
                for (int j = mapLimt; j > 0; j--) {
                    if (j == mapLimt) {
                        // 最初
                        sv[i] = mapDat[i][j];
                        mapDat[i][j] = mapDat[i][j - 1];
                    }
                    if (j == 1) {
                        // 最後
                        mapDat[i][j] = mapDat[i][j - 1];
                        mapDat[i][j - 1] = sv[i];
                        break;
                    }
                    mapDat[i][j] = mapDat[i][j - 1];
                }
            }

            refreshTable();
        }
        if (68 == e.getKeyCode()) {
            // D
            System.out.println("d");
            String sv = new String[map_x];
            // save
            for (int i = 0; i < map_x; i++) {
                int mapLimt = map_x - 1;
                for (int j = 0; j < map_x; j++) {
                    if (j == 0) {
                        // 最初
                        sv[i] = mapDat[i][j];
                    }
                    if (j == (mapLimt - 1)) {
                        // 最後
                        mapDat[i][j] = mapDat[i][j + 1];
                        mapDat[i][j + 1] = sv[i];
                        break;
                    }
                    mapDat[i][j] = mapDat[i][j + 1];
                }

            }
            refreshTable();
        }
        if (87 == e.getKeyCode()) {
            // W
            System.out.println("w");
            // save
            String sv = new String[map_x];
            for (int i = 0; i < map_x; i++) {
                int mapLimt = map_x - 1;
                for (int j = mapLimt; j > 0; j--) {
                    if (j == mapLimt) {
                        // 最初
                        sv[i] = mapDat[j][i];
                        mapDat[j][i] = mapDat[j - 1][i];
                    }
                    if (j == 1) {
                        // 最後
                        mapDat[j][i] = mapDat[j - 1][i];
                        mapDat[j - 1][i] = sv[i];
                        break;
                    }
                    mapDat[j][i] = mapDat[j - 1][i];
                }
            }
            refreshTable();
        }
        if (83 == e.getKeyCode()) {
            // S
            System.out.println("s");
//        int x = map_x - 1;
        String[] sv = new String[map_x];
            for (int i = 0; i < map_x; i++) {
                int mapLimt = map_x - 1;
                for (int j = 0; j < map_x; j++) {
                    if (j == 0) {
                        // 最初
                        sv[i] = this.mapDat[j][i];
                    }
                    if (j == (mapLimt - 1)) {
                        // 最後
                        mapDat[j][i] = mapDat[j + 1][i];
                        mapDat[j + 1][i] = sv[i];
                        break;
                    }
                    mapDat[j][i] = mapDat[j + 1][i];
                }
            }
            
            refreshTable();

        }
        if (69 == e.getKeyCode()) {
            // e TODO 装備とか
            System.out.println("e");
        
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

}

-------------------------------------------------------------

 

つくってみて。。。

あれ、昔作ったものを改造した方が時間かからなかったのでは?とか思いましたw

まぁね。