Задать вопрос
@lidiya11

Как отзеркалить текстуру в libgdx?

Я никак не могу совладать с методом sb.draw(Texture texture, float x, float y, float width, float height, int srcX, int srcY, int srcWidth, int srcHeight, boolean flipX, boolean flipY). Мне надо отзеркалить текстуру, сохранив ее размер и ничего не обрезав. В boolean flipX я пишу true и все зеркалится, но в int srcX, int srcY, int srcWidth, int srcHeight не могу понять что вписать, чтоб картинка не исказилась. Вот класс игрового экрана, где происходит отрисовка и класс одного из врагов, собственно некоторых из них и нужно отражать. Текстурку "врага" прикрепляю, может с ней что-то не то, ведь она не прямоугольная как фотка а с прозрачностью. В общем, что написать в методе? 0,0,ширина и высота текстуры - не подходит. Или может это вообще как-то по-другому лучше реализовать?

public class GameState extends State {
private Texture background;
public Player player;
public Enemy enemy;
long lastDropTime;
EnemyManager enemyManager;
boolean q = false;

public GameState(GameStateManager gsm) {
super(gsm);
enemyManager = new EnemyManager();
camera.setToOrtho(false,MiniFish.WIGHT,MiniFish.HEIGHT);
background = new Texture("bg.jpg");
player = new Player(100,100);
}
@Override
protected void handleInput() {
if (Gdx.input.justTouched()){
player.move();
}
}
@Override
public void update(float dt) {
handleInput();
player.update(dt);

camera.update();
}
@Override
public void render(SpriteBatch sb) {
sb.setProjectionMatrix(camera.combined);
sb.begin();
sb.draw(background,0,0, MiniFish.WIGHT,MiniFish.HEIGHT);
sb.draw(player.getImg(), player.getPos().x- player.X_IMG/2, player.getPos().y- player.Y_IMG/2, player.X_IMG, player.Y_IMG);
if (TimeUtils.nanoTime()-lastDropTime > 1000000000){
lastDropTime = TimeUtils.nanoTime();
int t = MathUtils.random(1, 2);
enemyManager.bornEnemy();
}
for (Enemy e: enemyManager.enemiesToRight){
sb.draw(e.getTexture(),e.position.x-e.getSizeX(),e.position.y, e.getSizeX(),e.getSizeY());
}
enemyManager.moveEnemyRight();

for (Enemy e: enemyManager.enemiesToLeft){
//ТУТ ПРОБЛЕМА
sb.draw(e.getTexture(),e.position.x-e.getSizeX(),e.position.y, e.getSizeX(),e.getSizeY(),0,0,e.getSizeX(),e.getSizeY(),true,false);
}

enemyManager.moveEnemyLeft();
sb.end();
}
@Override
public void dispose() {
background.dispose();
}
}

public class Enemy1 extends Enemy {
public static final int X_IMG1 = 80;
public static final int Y_IMG1 = 30;
public static final int X_IMG2 = 160;
public static final int Y_IMG2 = 60;
public static final int X_IMG3 = 270;
public static final int Y_IMG3 = 90;
private int sizeX;
private int sizeY;
Texture enemyImg;
public Vector3 position;
int Screen_height;
public TextureRegion region;

public Enemy1(float x, float y) {
super(x, y);
enemyImg = new Texture("enemyone.png");
position = new Vector3(x,y,0);
super.setTexture(enemyImg);
Screen_height= Gdx.graphics.getHeight();
int s = MathUtils.random(1, 3);
switch (s){
case 1: sizeX = X_IMG1; sizeY = Y_IMG1; break;
case 2: sizeX = X_IMG2; sizeY = Y_IMG2; break;
case 3: sizeX = X_IMG3; sizeY = Y_IMG3; break;
}
region = new TextureRegion(enemyImg,x,y,sizeX,sizeY);
super.region = region;
}
public Texture getImg() {
return enemyImg;
}
public int getSizeX(){
return sizeX;
}
public int getSizeY(){
return sizeY;
}
public Vector3 getPos(){
return position;
}
public void setPos(Vector3 position){
this.position = position;
}
}
5a887a5862ce7253597753.png
  • Вопрос задан
  • 603 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@exenza
Вот такой код у меня отражает вашу текстуру слева направо:
sb.begin();
Texture unnamed = new Texture("unnamed.png");
int width = unnamed.getWidth();
int height = unnamed.getHeight();
sb.draw(unnamed, 350, 350, width, height, 0, 0, width, height, true, false);
sb.end();


Но я бы предпочел спрайт:
sb.begin();
Texture unnamed = new Texture("unnamed.png");
Sprite sprite = new Sprite(unnamed);
sprite.flip(true, false);
sprite.setCenter(700, 600);
sprite.draw(sb);
sb.end();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы