2015-03-15 2 views
0

Я пытаюсь нарисовать 2 круга, используя текстуры в Java с LibGDX. Мои классы довольно просты, GameObject имеет круг (для логики) и метод рисования.LibGDX рисование кругов масштабах как-то

Вот мой метод рисования:

@Override 
public void draw(Batch batch, float alpha){ 
    batch.draw(sprite, circle.x-circle.radius, circle.y-circle.radius, circle.x+circle.radius, circle.y+circle.radius); 
} 

Это код, который я выполнить:

GameObject go = new GameObjectBuilder().createNew() 
       .withPosition(32, 32) 
       .withRadius(32) 
       .withTexture(new Texture(Gdx.files.internal("ball.png"))) 
       .withId(0) 
       .build(); 

GameObject go2 = new GameObjectBuilder().createNew() 
      .withPosition(64, 64) 
      .withRadius(32) 
      .withTexture(new Texture(Gdx.files.internal("ball.png"))) 
      .withId(1) 
      .build(); 

stage.addActor(go); 
stage.addActor(go2); 

И это результат: Strange scaling on the balls

Так или иначе, используя круги с одинаковым размером , масштабирует их при размещении дальше от начала координат. В настоящее время мой основной класс расширяет ApplicationAdapter и все.

Вот стоп звонков, которые я делаю в своем застройщике.

circle.setPosition(x, y); // LibGDX.Circle class call 
circle.setRadius(radius); // LibGDX.Circle class call 
sprite = new Sprite(texture); 

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

shapeRenderer.setColor(Color.BLACK); 
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); 

for(GameObject goo : objects.values()) { 
    shapeRenderer.circle(goo.getX(), goo.getY(), goo.getRadius()); 
} 

shapeRenderer.end(); 

black balls on top

Заключительный изменить:

batch.draw(sprite, circle.x-circle.radius, circle.y-circle.radius, circle.radius*2, circle.radius*2); 

ли трюк!

+0

Вы пробовали жесткого кодирования значения для ширины и высоты в ваш 'batch.draw()' позвонить? Означает ли это ожидаемое поведение? – rbennett485

+0

Я должен добавить, что ответ Майкла Хоббса должен сделать трюк, вот где ваша проблема лежит – rbennett485

ответ

1

Прошло некоторое время с тех пор, как я использовал libGDX, и могу сказать, что некоторые вещи изменились. Однако ...

void draw(TextureRegion region, 
     float x, 
     float y, 
     float width, 
     float height) 

рисует прямоугольник с нижним левым углом в точке х, у и растягивая область, чтобы покрыть заданную ширину и высоту.

Batch.draw рисует прямоугольник от x, y до x + width, y + height. То, что вы сделали, - это масштабирование формы на основе внутреннего положения объектов.

@Override 
public void draw(Batch batch, float alpha){ 
    batch.draw(sprite, circle.x-circle.radius, circle.y-circle.radius, circle.x+circle.radius, circle.y+circle.radius); 
} 

для круга 1 мы имеем batch.draw (спрайтов, 32-32, 32-32, 32 + 32, 32 + 32); Это привлекает спрайт от 0,0 до 64,64

для круга 2 мы имеем batch.draw (спрайтов, 64-32, 64-32, 64 + 64, 64 + 64); Это рисует спрайт от 32,32 до 128,128

Это должно исправить код:

@Override 
public void draw(Batch batch, float alpha){ 
    batch.draw(sprite, circle.x, circle.y, circle.radius, circle.radius); 
} 

Это будет масштабировать базу объектов по радиусу круга.

Ссылка: http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/Batch.html#draw-com.badlogic.gdx.graphics.Texture-float-float-float-float-

+0

Я обновил вопрос с фактическими вызовами, которые были сделаны в GameObject. Я просто использую Circles setPosition и setRadius. – TheDudeAbides

+0

попробовал это, он просто рисует ОГРОМНЫЕ круги, которые немасштабированы ... Это результат: http://i.imgur.com/RfBKC23.png – TheDudeAbides

+0

Одна из вещей, которые я сделал в своем проекте libGDX, чтобы помочь мне отлаживать мои спрайты было добавить в кусок кода, который показал, откуда был нарисован спрайт. public void drawAnchorPoints (ShapeRenderer sr) { sr.setAutoShapeType (true); sr.setColor (Color.RED); sr.begin(); for (Entry vec: anchorPoints.entrySet()) { Vector2 temp = vec.getValue(). Cpy(). Add (getPosition();); sr.line (temp.x - 2, temp.y, temp.x + 2, temp.y); sr.line (temp.x, temp.y - 2, temp.x, temp.y + 2); } sr.end(); } –

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