Индексы подстроки отключаются в простой программе чтения карт - PullRequest
0 голосов
/ 19 октября 2010

Хорошо, поэтому я пытаюсь создать простую RPG-игру, и мой код чтения карты, кажется, отключен.Это строка чтения карты:

Integer.parseInt(map.data.substring(Map.MAP_START + ((playerPOS - map.width)/2) - 1, Map.MAP_START + ((((playerPOS - map.width)/2) - 1) + map.dataLen)));

Теперь единственными плитками на карте являются 01 и 00, поэтому, когда я вижу 10, я понимаю, что что-то не так:

(playerPOS - map.width) = 34 playerPOS = 50 player.x = 2 player.y = 3 blah = 0
(playerPOS - map.width) = 18 playerPOS = 34 player.x = 2 player.y = 2 blah = 10

Здеськод чтения карты:

public void init(GameContainer gc) throws SlickException {
        map = new Map();
        player = new Player();

        keys = new boolean[ALL_KEYS];
        for(int i = 0; i < ALL_KEYS; i++){
            keys[i] = false;
        }

        file = new File("testmap.txt");

        try {
            fin = new FileInputStream(file);

            bin = new BufferedInputStream(fin);
            StringBuilder sb = new StringBuilder();
            int ch = 0;

            while ((ch=bin.read())!=-1) {
                sb.append((char)ch);
            }

            map.data = sb.toString().replace(" ", "").replace("\n", "").replace("\r", "");
            System.out.print(map.data);

            map.width = Integer.parseInt(map.data.substring(map.dataOffs, map.dataOffs + map.dataLen));
            map.dataOffs += map.dataLen;

            map.height = Integer.parseInt(map.data.substring(map.dataOffs, map.dataOffs + map.dataLen));
            map.dataOffs += map.dataLen;
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        tiles = new Image("tiles.png");
        hero = new Image("hero.png");
    }

, а вот файл карты:

16 12
01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 01 01 00 00 00 00 00 00 00 00 00 00
00 00 00 00 01 01 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Так что, если потребуется дополнительная информация, дайте мне знать.

1 Ответ

2 голосов
/ 20 октября 2010

Я бы рекомендовал переосмыслить структуру данных для вашей карты (возможно, двухмерный массив). В вашем методе init прочитайте текстовый файл токен-токен (при условии, что каждый токен разделен пробелами). Это похоже на то, что вы делаете сейчас, но вы можете избежать замены пробелов пустыми строками. Смотри http://download.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html

Первая строка токена (в вашем примере, "16") может быть преобразована в map.width, как вы делаете. Аналогично, второй токен становится map.height. Затем вы можете перебрать оставшиеся токены следующим образом (псевдокод):

for(int y = 0; y < map.height; ++y) {
  for (int x = 0; x < map.width; ++x) {
    mapArray[x][y] = nextTokenAsInteger;
  }
}

Затем, когда вы хотите узнать, как выглядит комната в позиции (x, y), вы просто получаете доступ к mapArray[x][y].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...