2015-10-13 2 views
2

Поскольку я довольно новичок в разработке Libgdx, я хотел бы спросить, можно ли использовать границы изображения (чтобы отметить его как выбранный)? Я читал, что одним из решений является создание двух отдельных изображений: один с рамкой и один без. Однако все мои изображения имеют одинаковый размер, и многие из них так не знают, является ли это лучшей идеей. Есть ли другие варианты?Граница изображения в libgdx

EDIT

Так я выбрал второй идея (1x1 изображение), но есть некоторые проблемы с ним. Прежде всего, я не могу заставить этот элемент borderImage находиться под щелчком. Другой проблемой является размер borderImage (это не то же самое). Когда я нажимаю в центре кнопки его меньший (около пары пикселей), чем когда я нажимаю на край. Знаете ли вы, что может вызвать эти проблемы и как их исправить? Код:

public void create(){ 
     stage = new Stage(); 
     Gdx.input.setInputProcessor(stage); 

     skin = new Skin(Gdx.files.internal("data/uiskin.json")); 

     Texture borderTexture = new Texture(Gdx.files.internal("data/select.png")); 
     final Image borderImage = new Image(borderTexture); 

     TextButton exitButton = new TextButton("Exit",skin); 

     exitButton.addListener(new ClickListener(){ 
      public void clicked(InputEvent event, float x, float y) 
       { 
        borderImage.setSize(event.getTarget().getWidth() + 1 * 2, event.getTarget().getHeight() + 1 * 2); 




       Vector2 loc = new Vector2(0, 0); 
       Vector2 stageLoc = event.getTarget().localToStageCoordinates(loc); 
       borderImage.setPosition(stageLoc.x, stageLoc.y); 

       System.out.println("" + event.getTarget().getWidth() + " " +event.getTarget().getHeight() + " " + event.getTarget().getX() + 
         " " + event.getTarget().getY() + " " + stageLoc.x + " " + stageLoc.y); 

       stage.addActor(borderImage); 
       }  
      } 
     ); 

     Table table = new Table(); 

     table.add(exitButton).colspan(3); 

     table.setFillParent(true); 
     stage.addActor(table); 
} 

И выход я есть: 29,0 25,0 4,0 1,0 466,0 257,0 // щелкнул в центре кнопки 37,0 27,0 462,0 256,0 462,0 256,0 // нажал на край кнопки

ответ

0

вот то, что я буду делать, если это было для меня:

я буду использовать одну пограничное изображение для всех моих изображений (вместо границы изображения для каждого из моих изображений)

позволяет предположить, что на ле футовое изображение - это ваше изображение, а справа - изображение границы enter image description here

Когда на изображении было событие Click, вы нарисовали границу изображения (ваша граница изображения прозрачна внутри, вы можете легко сделать это с помощью редактора, такого как gimp), на в верхней части изображения, и вы будете иметь что-то вроде этого

enter image description here

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

Надеется, что это поможет!

+0

если вы будете растягивать границы изображения не будет регулярным (при масштабировании, например, от прямоугольных до густого многоугольника) –

0

Если вы используете Scene2D и его класс Image, самая простая идея - сохранить небольшую текстуру цвета, которую вы хотите иметь на границе. Текстура может быть как 1px x 1px размер. Он должен иметь Ближайшее фильтрация из-за отсутствия эффекта смешивания границ.

При нажатии на изображение вы можете создать Изображение с изображением, а также ширину рамки и поместите его там, где изображение достигает эффекта границы. На подкраске вам необходимо удалить Пограничную актер

Texture borderTexture = new Texture(Gdx.files.internal("border.png")); 
    Image borderImage = new Image(borderTexture); 

    ... 

    //in the clickListener 
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) 
    { 
     borderImage.setSize(event.getTarget().getWidth() + BORDER_WIDTH * 2, event.getTarget().getHeight() + BORDER_WIDTH * 2); 
     borderImage.setPosition(event.getTarget().getX() - BORDER_WIDTH, event.getTarget.getY() - BORDER_WIDTH); 

     stage.addActor(borderImage); 
     event.getTarget().toFront(); //to move the original image over the border 

     return true; 
    } 

    public void touchUp(InputEvent event, float x, float y, int pointer, int button) 
    { 
     borderImage.remove();    
    } 

Если не используя Scene2D вы можете достичь такого же эффекта, оказывая Sprite от размера изображения + границы ширины и управлять флагом говоря, если оказать граница или нет

 Sprite image, border; 

    ... 

    //in the input processor 
    public boolean touchDown (int x, int y, int pointer, int button) 
    { 
     border.setSize(image.getWidth() + BORDER_WIDTH * 2 , image.getHeight() + BORDER_WIDTH * 2); 
     border.setPosition(image.getX() - BORDER_WIDTH, image.getY() - BORDER_WIDTH); 

     renderBorder = true; 

     return true; 
    } 

    public boolean touchUp (int x, int y, int pointer, int button) 
    { 
     renderBorder = false; 

     return false; 
    } 

    //in the render method 
    if(renderBorder) 
    { 
     border.draw(batch); 
    } 

    image.draw(batch); 
+0

это почти работает, но у меня есть некоторые проблемы с ним. Я редактировал свой первый пост. –

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