2016-03-09 2 views
1

У меня возникла проблема рисовать спрайт для моего проекта.позиционирование спрайта в libgdx

У меня есть карта (960x900), разделенная на плитки (64x64).

Как вы можете видеть на картинке, когда я нажимаю на левый нижний угол фиолетового квадрата, позиция (0; 0), и когда я нажимаю на верхний правый угол фиолетового квадрата, позиция (36; 47)

Проблема в том, что изображение пурпурного квадрата имеет размер 32x32, и когда я рисую изображение с помощью libgdx на экране, размер не совпадает.

the problem is the purple gem

Другой пример: квадрат с черной рамкой имеет размер 64x64. Итак, если я рисую фиолетовый квадрат перед черным, фиолетовый должен быть половиной (по высоте и по ширине) черной, нет?

Кто-нибудь знает, почему libgdx изменяет размер пурпурного квадрата?

Sprite sprite = new Sprite(new Texture("assets/purpleSquare.png"));

я сделать это в методе

public void render(SpriteBatch batch) { 
    batch.draw(sprite, 0, 0); 
} 

Я не знаю, почему картина изменяется по libgdx .. Я также пытался сделать

batch.draw(sprite, 0, 0, width, heigth); 

К точный размер спрайта, но он тоже не работает.

+0

Можете ли вы разместить код? Как вы получаете области текстуры, как вы ее рисуете и т. Д.? –

ответ

3

Размер на осыпи n не имеет прямого отношения к размеру исходного изображения. Когда вы рисуете спрайт, вы предоставляете SpriteBatch с положением, шириной и высотой в мировыми координатами. Спрайт будет растянут, чтобы соответствовать этим мировым координатам, независимо от исходного размера изображения.

При нажатии на экран вы нажимаете Координаты экрана. Связь между экранными и мировыми координатами определяется матрицей проекции, которую вы используете с SpriteBatch. Проекционная матрица обычно управляется с помощью объекта Camera или Viewport, который вы можете использовать для преобразования между двумя системами координат с использованием методов project и unproject.

+0

Хорошо, но здесь я просто хочу нарисовать спрайта в положение (0; 0), не давая ширины и высоты. Я инициализирую SpriteBatch как это «частная партия SpriteBatch;» и я просто делаю «batch.begin()», следуя методу «render (SpriteBatch batch)» и заканчивая на «batch.end()» Мне нужно использовать камеру? –

+1

Если вы не используете камеру, SpriteBatch автоматически создает экземпляр матрицы проекций, которая преобразует 1 пиксель в 1 всемирную единицу, но не будет автоматически реагировать на поворот экрана или изменение размеров окна. Однако по умолчанию Y находится в мировеньких координатах, а Y - в координатах экрана. Если вы не задаете ширину и высоту при рисовании спрайта, SpriteBatch использует размеры пикселей исходного изображения (я исправлю это выше) в качестве мирового размера спрайта. Я подозреваю, что что-то изменяет матрицу проекций партии между рисованием серого квадрата и фиолетового квадрата. – Tenfour04

+0

Хорошо, ты прав. Я добавил OrthographicCamera, и я установил камеру положения. Я обновляю камеру и настраиваю проекцию SpriteBatch, и она работает хорошо! Благодарим за помощь :) –

-1

Я рад видеть, что через много часов я нашел решение, даже если знаю, что не так.

Мне нужна помощь, чтобы понять возникновение проблемы.

С помощью этой части кода:

public void update(float delta) {  
    batch.begin(); 

    drawBackground(); // Draw the background 
    drawButton(); // Draw the play/pause button 

    batch.end(); 

    drawMap(); // draw a tmx map made with tiled 

    batch.begin(); 

    if(!world.isInitial()) { 
     renderMonster(); // method which draw the monster 
    } 

    renderTower(); // method which draw the tower's level 

    batch.end(); 
} 
  1. Я не понимаю, почему я должен делать "batch.begin()" и "batch.end()" в два раза.
  2. Я не понимаю, почему с этим кодом пурпурный квадрат изменяется.

С помощью этого кода:

public void update(float delta) {  
    batch.begin(); 

    drawBackground(); 
    drawButton(); 

    batch.end(); 

    drawMap(); 

    ------->sb = new SpriteBatch(); 

    sb.begin(); 

    if(!world.isInitial()) { 
     renderMonster(); 
    } 

    renderTower(); 

    sb.end(); 
} 

эта линия, что я добавить исправить ошибку с фиолетовым квадратом. Если я работаю с двумя SpriteBatch (потому что с одним из них, если я повторно инициализирую SpriteBatch в методе обновления, отключился в случае паузы/воспроизведения), и я инициализирую второй (SpriteBatch sb) в методе обновления.

Правильно ли инициализировать SpriteBatch каждый раз, когда я передаю метод обновления? Нет метода с SpriteBatch, чтобы избежать этой проблемы?

+0

Это действительно BAD, чтобы создать spritebatch на каждой ничьей - вы создаете новый объект 60 раз в секунду, это действительно тяжело. Вызов end() заставляет партию скрываться и вызывать вызов DrawGL, который не такой тяжелый, но лучше его избегать - вам нужна хорошая производительность на дерьмовых телефонах. Вы должны знать, что каждое действие в методе update() вызывается много раз (около 60 раз в секунду) и может привести к задержке. –

+0

Это не то, как работает SE, не заблуждайтесь на этом сайте для форума. Вы можете ввести (и отредактировать) один вопрос. Каждый «пост» ниже должен быть ответом. – Madmenyo

+0

Yasen Bagalev: Я знаю, что это неправильно, но почему, когда я инициализирую SpriteBatch каждый раз, когда я обновляю экран, картинки не изменяются, и когда я просто вызываю изменения batch.begin() и batch.end()? Есть что-то лучше сделать, чтобы избежать этой проблемы? –

Смежные вопросы