2017-01-20 3 views
0

У меня случается какая-то странная вещь, пытаясь разделить tilemap, чтобы привлечь к JPanel. Во-первых, это уместный фрагмент кода:Разделение Tilemap Изображение в качели

private void drawTile(Graphics g,MapController mc,int gid){ 
    int cols = mc.getMap().getTileset().getColumns(); 
    int x = (gid % cols); 

    int y = gid/cols; 
    int tilewidth = mc.getTilewidth(); 
    int tileheight = mc.getTileheight(); 
    int dx1 = 0; 
    int dx2 = dx1+tilewidth; 
    int dy1 = 0; 
    int dy2 = dy1+tileheight; 
    int sx1 = (x)*tilewidth; 
    int sx2 = sx1+tilewidth; 
    int sy1 = y*tileheight; 
    int sy2 = sy1+tileheight; 
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null); 

} 

Это внутри цикла, который перебирает слоев на карте и рисует каждую плитку на панели. Когда я запускаю свою программу, она работает правильно по большей части, но я понял, что ось x отключена на 1 «ширина плитки» (32 пикселя). это выход я получаю:

Это более или менее то, что она должна выглядеть, кроме плитки все 32px прочь на оси х

Expectation

Я уверен, что это происходит потому, я конвертирую CSV в int [], и индекс начинается с 0, но моя сетка начинается с 1. Легко исправить? Просто вычтите 1 из моего значения x, чтобы переместить sx1 исходного изображения 32px влево.

Revised Код:

private void drawTile(Graphics g,MapController mc,int gid){ 
    int cols = mc.getMap().getTileset().getColumns(); 

    int x = (gid % cols)-1; //notice the -1 

    int y = gid/cols; 
    int tilewidth = mc.getTilewidth(); 
    int tileheight = mc.getTileheight(); 
    int dx1 = 0; 
    int dx2 = dx1+tilewidth; 
    int dy1 = 0; 
    int dy2 = dy1+tileheight; 
    int sx1 = x*tilewidth; 
    int sx2 = sx1+tilewidth; 
    int sy1 = y*tileheight; 
    int sy2 = sy1+tileheight; 
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null); 

} 

Теперь, когда я запускаю его я получаю это:

Screwed up

Я положил в несколько строк по устранению неисправностей, и это выглядит как координаты я посылающих для Исходное изображение правильное. Я даже пробовал:

g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1-32, sy1, sx2, sy2,  null); 

Все, что я пробовал, дает мне те же результаты. Есть что-то здесь, что мне не хватает?

+0

* «Просто вычтите 1 из моего значения x» * - Почему бы не стать предметом '1' из' gid'? – MadProgrammer

+0

Изменение значения gid также повлияет на ось Y. Это только ось X выключена. Гиды соответствуют тому, что находится в файле CSV. (Я пробовал это на alread) – kookej

+0

Возможно, вы нарисуете материал один над другим, а затем некоторые вещи больше не видны. – Trilarion

ответ

0

Решено! Некоторые из GID в CSV равны 0 для прозрачной плитки. Когда вы выполните математику для местоположения sx1, а затем вычтите 1, вы получите -1 как sx1. Очевидно, что Graphics не нравится, поэтому вместо рендеринга прозрачной плитки она ничего не отображает. То когда вещи начинают идти wonkey. Интересно, что я начал этот проект с использованием JavaFX, но решил пойти с качелями. Я использовал ту же логику для рисования на FX и не имел этой проблемы. Вот код, который работает:

private void drawTile(Graphics g,MapController mc,int gid){ 
    int cols = mc.getMap().getTileset().getColumns(); 

    int x = (gid % cols)-1; 
    if(x<0){x=0}; 
    int y = gid/cols; 
    int tilewidth = mc.getTilewidth(); 
    int tileheight = mc.getTileheight(); 
    int dx1 = 0; 
    int dx2 = dx1+tilewidth; 
    int dy1 = 0; 
    int dy2 = dy1+tileheight; 
    int sx1 = x*tilewidth; 
    int sx2 = sx1+tilewidth; 
    int sy1 = y*tileheight; 
    int sy2 = sy1+tileheight; 
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2,  null); 

}