2015-10-13 90 views
2

邊境自從我在Libgdx發展相當新的,我想問一下,如果它可以使圖像的邊界(如選擇將其標記)使用它嗎?我讀過一個解決方案是製作2個獨立的圖像:一個帶有邊框,另一個沒有。然而,我所有的圖像都是相同的大小,並且有很多圖像,所以不知道它是不是最好的想法。還有其他選擇嗎?圖片在libgdx

編輯

所以我選擇了第二個想法(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

在這裏我會做什麼,如果它是對我來說:

我會用一個邊界圖像爲我的所有圖像(而不是圖像邊界爲我的圖像中的每一個)

讓假設在樂ft爲你的形象,並在右邊是邊界圖像 enter image description here

當Click事件發生在圖像上繪製的邊界圖像(圖像邊框是透明裏面你可以伊斯利與像瘸子編輯器這樣做)的圖像的頂部,你就會有這樣的事情

enter image description here

如果大小是不同的,你可以改變它,並在同一位置繪製圖像

希望這將幫助之前修復相同的大小!

+0

如果你將延伸 –

0

如果您正在使用Scene2D及其Image類simpliest做是爲了保持顏色的小紋理你想要的邊界了。紋理可以像x 1像素的大小。它應該有因避混合邊界效應最近過濾。

當點擊圖片時,您可以創建一個圖片圖片大小加上邊框寬度,並將其放置在圖片實現邊框效果的位置。在觸摸了你需要渲染的圖像+邊框寬度的尺寸的雪碧刪除邊框,演員

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 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

(從方到厚多邊形縮放例如當)它幾乎工作也不會是普通的邊界圖像,但我有一些麻煩吧。我編輯了我的第一篇文章。 –